背景
之前使用的都是标准库,包括国产芯片,都是标准库
现在想使用IAP升级:顺便hal库研究一下串口,顺便做笔记;
思路结构
标准库中,使用DMA加串口空闲中断,可以实现不定长接收;
所以使用如上方式;
hal库应用
无论是空闲中断,还是DMA中断,都会调用如下:
HAL_UARTEx_RxEventCallback
读取空闲标记位、和dma传输完成,都不能正常使用,反倒是不需要正常使用;(标准库必须有)
以为标记,会被库提前清除
正常的配置cubemx
省略.....
初始化的时候增加
cpp
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)"test_init", sizeof("test_init"));//测试初始化是否正常
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t *)rx_buff, usart_rx_len);
接收回调定义如下
cpp
/* USER CODE BEGIN 1 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance==USART1)
{
//if(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_IDLE)/*||__HAL_DMA_GET_IT_SOURCE(huart->hdmarx, DMA_IT_TC)*/)
{
HAL_UARTEx_ReceiveToIdle_DMA(huart, (uint8_t *)rx_buff, usart_rx_len);
HAL_UART_Transmit_DMA(huart, (uint8_t *)rx_buff, usart_rx_len);
}
}
}
/* USER CODE END 1 */
这样就完成了不定长接收的简单用例;