OpenEdv-开源电子网

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

STM32F407串口发送中断与接收中断的问题

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-4-2
在线时间
6 小时
发表于 2016-2-29 10:33:35 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 cjlong 于 2016-2-29 10:36 编辑

在做一个与电机驱动器通讯的项目的时候需要用到串口再通过485发送数据和接收数据
遇到的问题是,用串口循环发送数据的时候,可以用串口接收中断接收到数据,但是用串口发送中断发送数据的时候,串口就不能接收到数据,TC中断和TXE中断都试过了,都不能行
调试了好几天都找不到问题在哪儿,大家帮忙看看,到底是哪里有什么问题,谢谢大家!

串口配置代码如下:

      
void RS485_Init(u32 bound)
{           
        
       GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
        
  //′®¿ú2òy½Å¸′óÃó3éä
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3
        
        //USART2   
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;      
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA,&GPIO_InitStructure); //
        
        //PG8íÆíìêä3ö£¬485Ä£꽿ØÖÆ  
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOG8
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;      
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOG,&GPIO_InitStructure); //
        

   //USART2
        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(USART2, &USART_InitStructure);
        
  USART_Cmd(USART2, ENABLE);  //ê1Äü′®¿ú 2
        
        USART_ITConfig(USART2, USART_IT_TC, ENABLE);
        
#if EN_USART2_RX        
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

        //Usart2 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        
        NVIC_Init(&NVIC_InitStructure);        

#endif        
        
        RS485_TX_EN=0;                                
}




数据发送函数://分割线上面注释的使用循环发送的方式,下部试图用中断发送的方式
void RS485_Send_Data(u8 *buf,u8 len)
{
//        u8 t;
//        RS485_TX_EN=1;                        
//          for(t=0;t<len;t++)               
//        {
//          while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);            
//    USART_SendData(USART2,buf[t]); //
//        }         
//        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
//        
//        TIM7_ENABLE();        
//        receCount = 0;         
//        RS485_TX_EN=0;                                 
        
/*******************************************************/        
        RS485_TX_EN=1;
        sendPos = 0;
        USART_SendData(USART2,sendBuf[sendPos++]);
        
}



串口中断函数:
void USART2_IRQHandler(void)
{
        u8 res;            
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {                 

                USART_ClearFlag(USART2, USART_FLAG_RXNE);        
                if(USART_GetFlagStatus(USART2,USART_FLAG_PE)==RESET)
                {
                        receBuf[receCount]= USART_ReceiveData(USART2);
            receCount++;         
                }        
        }  

  if(USART_GetITStatus(USART2, USART_IT_TC) != RESET)        
        {
                if(firstTime == 1)
                {
                                USART_ClearFlag(USART2, USART_FLAG_TC);
                                firstTime = 0;
                                printf("first time of TC\r\n");
               
                }
                else if(sendPos < sendCount)
                                {
                                                USART_SendData(USART2,sendBuf[sendPos++]);
                                                printf("send %dth data\r\n",sendPos);
                                }
                                else
                                {        
                                                USART_ClearFlag(USART2, USART_FLAG_TC);
                                                TIM7_ENABLE();        
                                                receCount = 0;         
                                                RS485_TX_EN=0;                                   
                                }
        
        }
}



最佳答案

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

printf是干嘛的 占用时间 ,去了试试
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-2-29 10:33:36 | 显示全部楼层
printf是干嘛的

占用时间 ,去了试试
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-4-2
在线时间
6 小时
 楼主| 发表于 2016-2-29 11:08:15 | 显示全部楼层
止天 发表于 2016-2-29 10:46
printf是干嘛的

占用时间 ,去了试试

哈哈 试了一下 果然去了就好了,感谢大神!
本来printf是用来调试的,可能是因为printf用了串口一,两个可能冲突了吧...
唉,范蠢了,都没想到是这个上面的问题,还调试了好久别的地方...
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 06:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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