[STM32] 1. 串口
CubeMX配置
- 串口全局中断
- DMA 普通配置(Normal Mode/TX RX DMA Request/全字节)
单字接收与buff 接收
注意事项:
- 单字接收每接收一个字节触发一次回调。
- buff接收是等到空闲才触发回调。
- 理论上中断也能做buff接收。
- freeRTOS的优先级只能管理 5 - 16级(这里假设freeRTOS和HAL库优先级一样),因此串口中断的优先级只能填 5 以后的。
#include <string.h>
#include "default_task.h"
#include "main.h"
#include "syscfg.h"
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "semphr.h"
uint8_t recv_buff[255];
uint8_t recv_data = 0;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern DMA_HandleTypeDef hdma_usart2_tx;
extern SemaphoreHandle_t xBinarySemaphore;
void recv_task(void *pt){
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, recv_buff, sizeof(recv_buff));
//HAL_UART_Receive_IT(&huart2, &recv_data, 1);
for(;;){
if(xSemaphoreTake(xBinarySemaphore, portMAX_DELAY)) {
LOGI("%s\r\n",recv_buff);
memset(recv_buff,0,sizeof(recv_buff));
}
}
}
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
if (huart->Instance == USART2) {
uint8_t size = sizeof(recv_buff) - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
//HAL_UART_Transmit_DMA(&huart2, recv_buff, size);
xSemaphoreGiveFromISR(xBinarySemaphore, &xHigherPriorityTaskWoken);
if (xHigherPriorityTaskWoken == pdTRUE) {
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, recv_buff, sizeof(recv_buff));
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart == &huart2){
HAL_UART_Transmit(&huart2, &recv_data, 1,999);
HAL_UART_Receive_IT(&huart2, &recv_data, 1);
}
}
License:
CC BY 4.0