(USART_RX_STA&0x8000)==0判断标志位的细节知识

学习正点原子的视频教程,其中有一个比较好的编程风格和思路,记录一下。同时,自己模仿思路编程时,踩了一些坑。

#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
 {
 	




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值