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

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

[复制链接]
yinlian 提问时间:2015-7-26 00:11 /
阅读主题, 点击返回1楼
收藏 评论17 发布时间:2015-7-26 00:11
17个回答
moyanming2013 回答时间:2015-7-27 11:42:28
yinlian 发表于 2015-7-27 00:10
需要帮忙看看程序出现了什么问题,顶贴不能解决什么问题,反而有借机赚分的嫌疑 ...

不懂的情况下,帮顶当然是赚分的!
不帮你顶,你的帖子2天就沉了,没人看了!
00-405686 回答时间:2015-7-27 11:44:30
void            USART1_Printf(uint8_t*   String)
{
        while  (*String  !=  '\0')
         {
                USART_SendData(USART1, (uint16_t)*String);
                USART_ITConfig(USART1,USART_IT_TC,ENABLE);
                 while(USART_GetITStatus(USART1,USART_IT_TC)==RESET)
                 {
                         Char_LED(ON);
                 }
//                USART1_Busy  =  SET;
//                while (USART1_Busy  ==  SET)
//                {
//                   Char_LED(ON);
//                }
                String++;
        }
//         USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
        USART_ITConfig(USART1,USART_IT_TC,DISABLE);
                //¹Ø±Õ·¢ËÍÖжÏ
}
我不太懂你这里为什么用TXE不用TC,如果可以你改成这样试试
00-405686 回答时间:2015-7-27 11:45:14
void            USART1_Printf(uint8_t*   String)
{
        while  (*String  !=  '\0')
         {
                USART_SendData(USART1, (uint16_t)*String);
                USART_ITConfig(USART1,USART_IT_TC,ENABLE);
                 while(USART_GetITStatus(USART1,USART_IT_TC)==RESET)
                 {
                         Char_LED(ON);
                 }
//                USART1_Busy  =  SET;
//                while (USART1_Busy  ==  SET)
//                {
//                   Char_LED(ON);
//                }
                String++;
        }
//         USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
        USART_ITConfig(USART1,USART_IT_TC,DISABLE);
                //¹Ø±Õ·¢ËÍÖжÏ
}
我不太懂你这里为什么用TXE不用TC,如果可以你改成这样试试
stary666 回答时间:2015-7-27 12:16:31
帮顶,,,,,,,,,,,,,
yinlian 回答时间:2015-8-1 23:06:33
00-405686 发表于 2015-7-27 11:45
void            USART1_Printf(uint8_t*   String)
{
        while  (*String  !=  '\0')

     非常感谢你的帮助,问题已经解决!!!
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系列的编程参考手册没有中文的,我们这些英文不太好的新手 ,学起来相当费力啊!!!希望以后不要再走这样的弯路!!!!
00-405686 回答时间:2015-8-2 00:57:57
yinlian 发表于 2015-8-1 23:25
结贴,虽然不是你说的这个原因。但是还是非常感谢你的指点
   解决问题后的代码如下:
   void      ...

问题解决了就好
jack2016 回答时间:2017-6-7 19:12:15
最近在调试LO系列也有类似问题,在F1系列没有,看看LZ有没有效果
12
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版