你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM32F030的串口发送不能中断,请大侠们帮忙看看

[复制链接]
yinlian 提问时间:2015-7-26 00:11 /
阅读主题, 点击返回1楼
收藏 评论17 发布时间:2015-7-26 00:11
17个回答
yinlian 回答时间:2015-8-1 23:25:26
00-405686 发表于 2015-7-27 11:45
void            USART1_Printf(uint8_t*   String)
{
        while  (*String  !=  '\0')

     结贴,虽然不是你说的这个原因。但是还是非常感谢你的指点
   解决问题后的代码如下:
   void      USART1_IRQHandler(void)
{
                    uint8_t  Rx_Data_Buf  =  0;
                           if  (USART_GetFlagStatus(USART1, USART_FLAG_TC) ==  SET)    //发送中断被触发
                                                        {               
                                                                    USART_ClearFlag(USART1, USART_FLAG_TC);
                          USART1_Busy  =  RESET;
                                                                    USART2_String("T\n");
                                                        }
                                                        if   (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) ==  SET)  //接收中断被触发
                                                        {
                                                                    Rx_Data_Buf  =  USART_ReceiveData(USART1);
                                                                          if   (Rx_Data_Buf  !=  '\n')
                                                                                {
                                                                                            USART1_RxData_buffer[Rx_count] = Rx_Data_Buf;
                                                                                                        Rx_count++;
                                                                                                        if   (Rx_count  ==  1  &&  USART1_RxData_buffer[0]   !=  'A')
                                                                                                                                Rx_count  =  0;
                                                                                                  if   (Rx_count  ==  2  &&  USART1_RxData_buffer[1]   !=  'X' )
                                                                                                        {
                                                                                                                                if  (USART1_RxData_buffer[1]   ==  'A' )
                                                                                                                                           Rx_count  =  1;
                                                                                                                                else
                                                                                                                                           Rx_count  =  0;
                                                                                                        }
                                                                                                        if   (Rx_count  ==  3  &&  USART1_RxData_buffer[2]   !=  'X' )
                                                                                                        {
                                                                                                                                if  (USART1_RxData_buffer[2]   ==  'A' )
                                                                                                                                           Rx_count  =  1;
                                                                                                                                else
                                                                                                                                           Rx_count  =  0;
                                                                                                        }
                                                                                                        //以上过滤无效打印信息,只有AXX开头的字符串才认为是需要接收的模块命令;
                                                                           }
                                                                                 if   (Rx_Data_Buf  ==  '\n'   &&   Rx_count  > 10)
                                                                                 {
                                                                                            USART1_RxData_buffer[Rx_count] = Rx_Data_Buf;
                                                                                            USART1_RxData_buffer[Rx_count+1]   =  '\0';
                                                                                            Rx_count = 0;
                                                                                            Rx_ReadData_Over  =  SET;                                                                                                         
                                                                                 }
                                                        }
                                                  if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) ==  SET)   //接收溢出中断被触发
                                                        {
                                                                   USART_ClearFlag(USART1, USART_FLAG_ORE);
                                                                   USART2_Printf("USART1 ISR(ORE)  = %b\n",USART1->ISR);
                                                        }
                                                  //USART2_Printf("USART1 ISR  = %b\n",USART1->ISR);
}
    就是把之前的 :USART_GetITStatus(USART1,USART_IT_RXNE) 修改为:USART_GetFlagStatus(USART1,USART_FLAG_RXNE);
    根本原因就是对这两个库函数的功能没有搞清楚;USART_GetITStatus(USART1,USART_IT_RXNE)这个函数的功能是获取你设置了那些中断,因为函数返回的是CR1/CR2/CR3的相应标志位;而中断函数中需要查询的是当前是哪个中断产生,所以必须使用USART_GetFlagStatus(USART1,USART_FLAG_RXNE);因为所有的中断请求都是在ISR寄存器中;查看库函数,只有这个函数返回的是ISR寄存器的值。
  新手接触STM32,走了很多弯路!!!并且STM32F030系列的编程参考手册没有中文的,我们这些英文不太好的新手 ,学起来相当费力啊!!!希望以后不要再走这样的弯路!!!!
294479435@qq.co 回答时间:2015-8-2 00:57:57
yinlian 发表于 2015-8-1 23:25
结贴,虽然不是你说的这个原因。但是还是非常感谢你的指点
   解决问题后的代码如下:
   void      ...

问题解决了就好
seven101 回答时间:2017-6-7 19:12:15
最近在调试LO系列也有类似问题,在F1系列没有,看看LZ有没有效果
12

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版