初级会员

- 积分
- 129
- 金钱
- 129
- 注册时间
- 2018-3-27
- 在线时间
- 28 小时
|
10金钱
void IO_Toggle(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)
{
GPIO_WriteBit(GPIOx, GPIO_Pin, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin))));
}
int main(void)
{GPIO_WriteBit(GPIOD,GPIO_Pin_0,Bit_RESET);
GPIO_WriteBit(GPIOD,GPIO_Pin_1,Bit_SET);
GPIO_WriteBit(GPIOD,GPIO_Pin_2,Bit_SET);
GPIO_WriteBit(GPIOD,GPIO_Pin_3,Bit_SET);
while(1)
{
if(flag==1)
{
Toggle_Num++;
switch(Toggle_Num)
{
case 1: case 3: case 5: case 7: case 9: case 11: case 13: case 15:
break;
case 2:
case 6:
case 10:
case 14:
IO_Toggle(GPIOD,GPIO_Pin_0|GPIO_Pin_1);
break;
case 4:
case 12:
IO_Toggle(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
break;
case 8:
case 16:
IO_Toggle(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
Toggle_Num =0;
break;
}
flag=0;
}
}
IO初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //éèÖÃÎaÄ£ÄaêäèëÄ£꽿éóÃóúÄ£ÄaμçÑ1μÄêäèë
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //éèÖÃÎaÄ£ÄaêäèëÄ£꽿éóÃóúÄ£ÄaμçÑ1μÄêäèë
GPIO_Init(GPIOD, &GPIO_InitStructure);
我这样设定不应该是PD0和PD1为互补方波且频率相同,PD2和PD3分别为PD1频率的1/2和1/4吗?然而我用示波器测试,情况并不是这样,PD0和PD1完全一样,PD2和PD3变成了一条电平,哪位大佬能看看是我哪里设置的有问题吗?
|
-
-
最佳答案
查看完整内容[请看2#楼]
可以同时翻转多个IO口,
只不过我给你的提供的函数只是翻转一个IO的函数,
更不能像你这样使用或操作的方式来使用这个翻转函数。
因为这个函数是使用操作单个IO端口的寄存器来写的。
使用GPIOx_BSRR及GPIOx_BRR就可以随意同时设置多个IO端口,
这样就不会出现你后来的不严格对齐的问题。
但无论如何,你的这种程序都不是长久之计,
玩玩可以,要产生标准的波型,就要用到定时器,严格控制频率和要求的宽度。
如果你暂 ...
|