我正在使用带有FreeRTOS和STM32CubeMX的STM32L432设备。
我尝试基于ASCII协议通过USART实现M2M通信。协议序列可能长度不同,但有最大长度和定义的结束字符('\r' / 0x0D)。
因此,我考虑使用DMA(类似于FIFO)收集所有RX-USART数据,并使用地址匹配ISR(基于USART_ICR_CMCF
标志)来确定结束字符。
初始化USART1并启用地址匹配ISR
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==USART1) {
/* USART1 clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspInit 1 */
USART1->CR2 |= 0x0D000000; // \r 0x0D
__HAL_UART_ENABLE_IT(&huart1,UART_IT_CM);
}
}
USART1中断服务程序
void USART1_IRQHandler(void) {
if (USART1->ISR & USART_ISR_CMF) {
data = USART1->RDR;
SET_BIT(USART1->ICR,USART_ICR_CMCF);
}
HAL_UART_IRQHandler(&huart1);
}
目前,地址匹配 isr 工作正常,但我不知道如何实现 DMA / FIFO 支持。
顺便说一下:
我很惊讶,这个设备不支持 USART 硬件 FIFO。我的想法是使用 DMA 来模拟通常使用的 FIFO?