STM32F767单片机使用串口2死机问题
我使用的单片机是STM32F767,使用了串口1,然后又使用了串口2,但我一使用串口2,就容易死机,死机后卡死在下图函数中,串口2的初始化如下:unsigned char UART2_aRxBuffer;//HAL库使用的串口接收缓冲
UART_HandleTypeDef UART2_Handler; //UART句柄
//串口输出
int USART2_putc(int ch)
{
while((USART2->ISR&0X40)==0);//循环发送 直到发送完毕
USART2->TDR=(unsigned char)ch;
return ch;
}
void Drv_Usart2_Sendx(rt_uint8_t *data, rt_uint16_t size)
{
rt_uint16_t i = 0;
rt_interrupt_enter();
for(i=0; i<size; i++)
{
USART2_putc(data);
}
rt_interrupt_leave();
}
void uart2_init(unsigned int bound)
{
//UART 3?ê??ˉéè??
UART2_Handler.Instance=USART2; //USART1
UART2_Handler.Init.BaudRate=bound; //波特率
UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位格式
UART2_Handler.Init.StopBits=UART_STOPBITS_1; //停止位为1
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()会使能UART1
HAL_UART_Receive_IT(&UART2_Handler, (unsigned char *)UART2_aRxBuffer, USART2_RXBUFFERSIZE);//开启接收中断
}
//串口1中断服务程序
unsigned int USART2_timeout=0;
unsigned long USART2_Rec_rt_tick = 0;
//void USART2_IRQHandler(void)
//{
//
// //unsigned int maxDelay=0x1FFFF;
// unsigned int maxDelay=0x1F;
//
// rt_interrupt_enter();
//
// USART2_Rec_rt_tick = rt_tick_get();
// HAL_UART_IRQHandler(&UART2_Handler); //调用HAL库中断处理公用函数
//
// USART2_timeout=0;
// while (HAL_UART_GetState(&UART2_Handler)!=HAL_UART_STATE_READY)//等待就绪
// {
// USART2_timeout++;//超时处理
// if(USART2_timeout>maxDelay) break;
// }
//
// USART2_timeout=0;
// //一次处理完成后,重新开启中断并设置RxXferCount为1
// while(HAL_UART_Receive_IT(&UART2_Handler,(unsigned char *)UART2_aRxBuffer, USART2_RXBUFFERSIZE)!=HAL_OK)
// {
// USART2_timeout++; //超时处理
// if(USART2_timeout>maxDelay) break;
// }
// rt_interrupt_leave();
//
//}
死机后卡死在这里
我把串口2 的中断函数都屏蔽了,然后还是死机求指点 把串口2的初始化屏蔽后,立马不死机了 我调试F767的时候也碰到过,当时是接收错误中断没处理,你看下是不是和我一样的问题 l4157 发表于 2021-12-3 08:25
我调试F767的时候也碰到过,当时是接收错误中断没处理,你看下是不是和我一样的问题 ...
接收错误中断怎么处理?
我只是简单的禁止错误中断,并清除中断错误标志:
void HAL_UART_IRQHandler_User(UART_HandleTypeDef *huart,uint16_tp)
{
uint32_t isrflags = READ_REG(huart->Instance->ISR);
uint32_t cr1its = READ_REG(huart->Instance->CR1);
/* UART in mode Receiver ---------------------------------------------------*/
if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
{
UART_Receive_IT_User(huart,p);
return;
}
/* UART in mode Transmitter ------------------------------------------------*/
if(((isrflags & USART_ISR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
{
UART_Transmit_IT_User(huart);
return;
}
/* UART in mode Transmitter (transmission end) -----------------------------*/
if(((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
{
UART_EndTransmit_IT_User(huart,p);
return;
}
//No error process is needed!
//Clear ORECF: Overrun error clear flag
//Clear NCF: Noise detected clear flag
//Clear FECF: Framing error clear flag
//Clear PECF: Parity error clear flag
// __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
READ_REG(huart->Instance->ISR);
READ_REG(huart->Instance->RDR);
huart->Instance->CR3 = 0; //Error interrupt is inhibited
//huart->Instance->ICR = 0x000f;
}
最后十几行
页:
[1]