OpenEdv-开源电子网

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

STM32F1串口2接收中断问题

[复制链接]

9

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-6-6
在线时间
48 小时
发表于 2021-6-10 17:42:40 | 显示全部楼层 |阅读模式
配置串口2重映射 GPIO_PIN_5|GPIO_PIN_6引脚。
当开启“__HAL_UART_ENABLE_IT(&UART2_Handler,UART_IT_RXNE)”,允许串口2接收数据时,
程序就无法正常运行,按键、旋钮、温度采集都无法正常进行。

我将串口2改为发送指令并打开“__HAL_UART_ENABLE_IT(&UART2_Handler,UART_IT_RXNE)”
等待接收数据,当接收完成,执行“__HAL_UART_DISABLE_IT(&UART2_Handler,UART_IT_RXNE)”关闭串口接收中断。
即当单片机需要接收返回数据时候,单片机发送指令同时使能串口2接收中断,接收完毕同时禁止串口2接收中断。
这样系统也能正常运行,串口2也可正常发送并接收反馈数据。
但现在因为系统修改需要,要保证单片机随时可接收串口数据,需要系统运行时,一直使能串口接收中断。
我想问一下,为什么我的程序会在开启接收中断以后,系统会无法正常运行。
串口2相关程序按照原子哥的例程配置如下:

if(huart->Instance==USART2)//串口2MSP初始化
        {
                __HAL_RCC_GPIOD_CLK_ENABLE();                        //使能GPIOD时钟
                __HAL_RCC_USART2_CLK_ENABLE();                        //使能USART2时钟
                __HAL_RCC_AFIO_CLK_ENABLE();
       
                GPIO_Initure.Pin=GPIO_PIN_5;                        //PD5
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
                GPIO_Initure.Pull=GPIO_PULLUP;                        //上卡
                GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
                HAL_GPIO_Init(GPIOD,&GPIO_Initure);                   //初始化PD5

                GPIO_Initure.Pin=GPIO_PIN_6;                        //PD6
                GPIO_Initure.Mode=GPIO_MODE_INPUT;        //输入模式       
                HAL_GPIO_Init(GPIOD,&GPIO_Initure);                   //初始化PD6
               
                __HAL_AFIO_REMAP_USART2_ENABLE();                //串口2重映射
               
                __HAL_UART_ENABLE_IT(&UART2_Handler,UART_IT_RXNE);//开启接收中断
                HAL_NVIC_EnableIRQ(USART2_IRQn);                                //使能中断通道
                HAL_NVIC_SetPriority(USART2_IRQn,3,3);                        //优先级
        }


        //UART2初始化
        UART2_Handler.Instance=USART2;                                            //USART2
        UART2_Handler.Init.BaudRate=115200;                                    //波特率
        UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //8bit
        UART2_Handler.Init.StopBits=UART_STOPBITS_1;            //1stop
        UART2_Handler.Init.Parity=UART_PARITY_NONE;                    //无奇偶校验
        UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控制
        UART2_Handler.Init.Mode=UART_MODE_TX_RX;                    //收发模式
        HAL_UART_Init(&UART2_Handler);                                            //HAL_UART_Init()使能串口2



中断服务函数
void USART2_IRQHandler(void)                       
{
    u8 res;          
    if((__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_RXNE)!=RESET))  //½óêÕÖD¶Ï
        {                
                HAL_UART_Receive(&UART2_Handler,&res,1,1000);

                if((USART2_RX_STA&0x04) == 0)
                {
                        if((USART2_RX_STA&0x02) == 0)   //表头接收1个字节
                        {
                                if(USART2_RX_STA&0x01)    //接收表头完成
                                {
                                        if(res != 0xA5)USART2_RX_STA = 0;
                                        else
                                        {
                                                USART2_RX_STA |= 0x02;
                                                USART2_REC_LEN = 0;
                                        }
                                }
                                else   //Î′êÕμ½0x5A
                                {
                                        if(res == 0x5A)USART2_RX_STA |= 0x01;
                                }
                        }
                        else  //接收到表头
                        {
                                USART2_RX_BUF[USART2_REC_LEN] = res;                //¼Ç¼½óêÕμ½μÄÖμ
                                if(USART2_RX_BUF[0] == USART2_REC_LEN)
                                {
                                        USART2_RX_STA |= 0x04;
                                }
                                USART2_REC_LEN ++;                                                //接收到数据,计数加1
                                if(USART2_REC_LEN > 64)
                                {
                                        USART2_REC_LEN = 0;
                                        USART2_RX_STA = 0;
                                }
                        }
                }
        }
        HAL_UART_IRQHandler(&UART2_Handler);        //调用HAL库中断处理哦公用函数
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1023
金钱
1023
注册时间
2019-9-21
在线时间
269 小时
发表于 2021-6-10 17:58:31 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-6-11 09:31:40 | 显示全部楼层
帮顶  
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 17:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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