中级会员
 
- 积分
- 231
- 金钱
- 231
- 注册时间
- 2016-6-6
- 在线时间
- 48 小时
|
配置串口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库中断处理哦公用函数
}
|
|