OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5808|回复: 4

关于两个STM32F103主控板实现串口通信的接收中断函数问题

[复制链接]

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2017-4-8 18:31:03 | 显示全部楼层 |阅读模式
5金钱
两块STM32F103主控板,用各自的USART1 通信收发数据,(都是通过外部中断触发)一块能收能发,一块只能发送数据不能接收数据,硬件经过排查没有问题,想问问前辈们我的代码是否有误。(其他配置经过验证是没问题的,现在排查之后觉得最有可能的就是接收函数问题)以下是串口配置和中断服务函数代码:
我发送的数组为  u8 Work_CH2[10] ={0x31,0x31,0x0d,0x0a};

外部中断服务函数为:
void EXTI4_IRQHandler(void)                                           {
  int i ;
  if(EXTI_GetITStatus(EXTI_Line4)!=RESET)                              
        {               
         EXTI_ClearITPendingBit(EXTI_Line4);                             
        TIM_SetCompare1(TIM3,6000);                                                  
         for(i=0;i<4;i++)                                                   
          {
           USART_SendData(USART1, Work_CH2);
           while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);             
          }
         }
}

void usart1_init(u32 bound)                                                
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
         
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
  USART_DeInit(USART1);                                                   
         
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                  
    GPIO_Init(GPIOA, &GPIO_InitStructure);                              

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  
    GPIO_Init(GPIOA, &GPIO_InitStructure);                                 


    USART_InitStructure.USART_BaudRate = bound;                                 
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;               
    USART_InitStructure.USART_StopBits = USART_StopBits_1;                  
    USART_InitStructure.USART_Parity = USART_Parity_No;                       
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                   

    USART_Init(USART1, &USART_InitStructure);                                 
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;                  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                                      
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                      
    NVIC_Init(&NVIC_InitStructure);                                                 

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                           
    USART_Cmd(USART1, ENABLE);                                                

}
       

void USART1_IRQHandler(void)                                                   
          {
            u8 Res;       
            if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)        
                {
                 Res =USART_ReceiveData(USART1);                                    
                        if((USART_RX_STA&0x8000)==0)                                       
                  {
                    if(USART_RX_STA&0x4000)                                          
                     {
                      if(Res!=0x0a)USART_RX_STA=0;                                      
                  else
                     {
                        USART_RX_STA|=0x8000;                                          
                     }                                                       
                     }
            else                                                              
                 {       
                  if(Res==0x0d)  USART_RX_STA|=0x4000;
                  else
                   {
                     USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                     USART_RX_STA++;
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;               
                   }                 
                   }
          }                         
      }
   }





串口配置

串口配置

最佳答案

查看完整内容[请看2#楼]

原子哥,经过两天的排查,问题已经解决。是我在主函数中while循环把USTART_RX_STA一直清零状态,导致一块控制板没有发出数据,谢谢原子哥,刚学习一个月,有些构架没弄清楚。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2017-4-8 18:31:04 | 显示全部楼层
正点原子 发表于 2017-4-10 01:42
仿真,先实现1个直接的收发。

原子哥,经过两天的排查,问题已经解决。是我在主函数中while循环把USTART_RX_STA一直清零状态,导致一块控制板没有发出数据,谢谢原子哥,刚学习一个月,有些构架没弄清楚。
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2017-4-8 18:32:21 | 显示全部楼层
可能说的有点不明白,主要是希望前辈们帮忙看看接收函数是否有误!
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2017-4-8 18:35:18 | 显示全部楼层
发送格式为USART_SendData(USART1, Work_CH2[i]);上面赋值发帖估计不小心删除了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-4-10 01:42:31 | 显示全部楼层
仿真,先实现1个直接的收发。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 05:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表