一、RCC初始化卡死
原因:由于时间太短没有延时就开始检测标志位HAL_OK是否被置位。故进入了Error_Handler(); 但是这里面啥都没有还有个死循环故当标志位检测不到时卡进死循环。
解决方法
- 注释 Error_Handler();
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { //Error_Handler(); }
- 循环执行初始化,直道初始化成功
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { while(1){if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) break;} }
二、CubeMX HSE晶振配置出错
stm32MP157固定为24Mhz,如果在CubeMX 时钟树中修改为其他数值,在串口输出时则会出现乱码。
三、HAL库实现接收中断逻辑
//1.使能串口全局中断
HAL_NVIC_EnableIRQ(UART4_IRQn);
/*2.使能接收中断
HAL_UART_Receive_IT函数是用户自定义一个缓冲区(即参数pData),
接受一定数量(由参数Size决定)的字符存入缓冲区中。同时,
参数Size还决定着进入回调函数的频率,即每接收Size个字符,
就进入一次回调函数。需要注意的是,Size只决定进入回调函数的频率,
而不能影响进入接收中断的频率,无论Size是多少,每接收完成一个字符
都会进入一次接收中断。*/
HAL_UART_Receive_IT(&huart4, pData, Size);
/*3.触发串口中断
当发生中断时,会进入void UART4_IRQHandler(void)函数*/
void UART4_IRQHandler(void) //弱定义 一般定义在it.c文件
/*4.触发中断识别函数(识别属于哪种中断)
UART4_IRQHandler会调用HAL_UART_IRQHandler(&huart4);函数
识别到属于接受中断*/
HAL_UART_IRQHandler(&huart4)
/*5.调用接受中断函数*/
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
/*6.触发接受中断回调函数
HAL_UART_Receive_IT函数会根据设定的Size大小从而调用HAL_UART_RxCpltCallback函数
在HAL_UART_RxCpltCallback函数里面我们可以实现串口接收数据处理,如数据回显*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *uartHandle) //弱定义
四、HAL库实现发送中断逻辑
对HAL_UART_Transmit_IT
函数函数的理解:
用于启用串口发送中断。当发送完成时,HAL_UART_TxCpltCallback
回调函数将被调用,可以在这里添加你的自定义逻辑。
// 初始化串口
MX_USART2_UART_Init();
// 启用串口发送中断
HAL_UART_Transmit_IT(&huart2, (uint8_t *)"Hello, World!\r\n", 15);
// 串口发送中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART2)
{
// 串口2的发送中断回调
// 在这里添加你的逻辑
}
}