学习正点原子的视频教程,其中有一个比较好的编程风格和思路,记录一下。同时,自己模仿思路编程时,踩了一些坑。
#define MAX_SIZE 500
uint8_t USART_RX_BUF[MAX_SIZE];
uint16_t USART_RX_STA;
//0x0d 0x0a
void USART1_IRQHandler(void)//在hd.s启动文件
{
uint16_t receive;
if( USART_GetITStatus( USART1, USART_IT_RXNE))
{
receive= USART_ReceiveData( USART1);
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if((USART_RX_STA&0x4000)==0)//还没接收到0x0d
{
if(receive==0x0d)
{
USART_RX_BUF[USART_RX_STA&0x3fff]=receive;
USART_RX_STA++;
USART_RX_STA|=0x4000;
}
else
{
USART_RX_BUF[USART_RX_STA&0xfff]=receive;
USART_RX_STA++;
if(USART_RX_STA>MAX_SIZE-1)USART_RX_STA=0 ; //接收长度超了,接收失败
}
}
else //USART_RX_STA&0x4000==1;上一次已经接收到了0x0a
{
if(receive!=0x0a)USART_RX_STA=0;//上次接收到了0x0a ,这次必定是0x0d,否则数据有误重新接收
else
{
USART_RX_BUF[USART_RX_STA&0x3fff]=receive;
// USART_RX_STA=0;//接收完毕,准备下一次接收,放在main后台清零
USART_RX_STA|=0x8000;
}
}
}
}
}
uint8_t TIM5_CAPTURE_STA=0;//bit7:捕获完成标志 bit6:捕获到高电平标志 bit5-0;捕获到高电平溢出次数
uint16_t TIM5_CAPTURE_VAL=0;
void TIM5_IRQHandler(void)
{
// printf("中断\r\n");
// if( TIM_GetITStatus( TIM5, TIM_IT_Update|TIM_IT_CC1)==SET)//这样写会导致,没按下按键时一直更新中断
if( (TIM5_CAPTURE_STA&0x80)==0)//还没捕获成功
{
if( TIM_GetITStatus( TIM5, TIM_IT_Update)==SET)
{
if(TIM5_CAPTURE_STA&0x40)//已经捕获到了高电平
{
if((TIM5_CAPTURE_STA&0x3f)==0x3f)//太长了,强制退出
{
TIM5_CAPTURE_STA|=0x80;//强制退出//TIM5_CAPTURE_STA在mian()函数清零
TIM5_CAPTURE_VAL=0xffff;
printf("时间太长了\r\n");
}
else
{
TIM5_CAPTURE_STA++;
}
}
}
if( TIM_GetITStatus( TIM5, TIM_IT_CC1)==SET)
{
if((TIM5_CAPTURE_STA&0x40)==0)//第一次捕获到上升沿
{
printf("捕获到上升沿\r\n");
TIM5_CAPTURE_STA=0;//清零
TIM5_CAPTURE_VAL=0;//清零
TIM5_CAPTURE_STA|=0x40;//bit6置位
TIM_SetCounter( TIM5, 0);//定时器计数值清零,为了清除上一次的计数值
TIM_OC1PolarityConfig( TIM5, TIM_ICPolarity_Falling);//捕获到上升沿,捕获触发条件为下降沿即可测出高电平时间
}
else
{
printf("捕获到下降沿\r\n");
TIM5_CAPTURE_STA|=0x80;//TIM5_CAPTURE_STA在mian()函数清零
TIM5_CAPTURE_VAL= TIM_GetCapture1( TIM5);//函数返回值是一个十六位的数值
TIM_OC1PolarityConfig( TIM5, TIM_ICPolarity_Rising);//捕获到下降沿,高电平脉宽测量完毕
}
}
}
TIM_ClearITPendingBit( TIM5, TIM_IT_CC1|TIM_IT_Update);//不清除中断标志位,会卡在该函数
}
关键思路:
```c
if((USART_RX_STA&0x4000)==0)//还没接收到0x0d
{
....dosomthing;
}
else
{
...dosomething;
}
if((TIM5_CAPTURE_STA&0x40)==0)
{
...dosomething;
}
else
{
...dosomrthing;
}```
错误写法:
if((TIM5_CAPTURE_STA&0x40)==1)//意图是判断bit6是否等于1,但是通过与运算,如果该位为1,结果也不会是1,而是0x40==64;所以逻辑永远不成立,导致代码出错
{
...dosomething;
}
else
{