环境
- STM32L476G-DISCO 开发板
- STM32CubeIDE 1.1.0
- STM32CubeMX 5.4.0
STM32CubeIDE配置
移植FreeRTOS,选择CMSIS_V2。
FreeRTOS的所有配置的选择默认,后面手动修改FreeRTOSConfig.h文件修改配置。如果想直接在IDE中修改配置也可以直接修改。
开启三个串口,异步模式。
由于接收采用空闲中断接收,所以要打开DMA接收和串口总中断。
重要文件
- FreeRTOSConfigure.h FreeRTOS的配置文件。修改一些关于FreeRTOS的配置信息。
- freertos.c FreeRTOS任务主文件,可以在void MX_FREERTOS_Init(void)函数中定义任务。
默认STM32CubeIDE在生成代码的时候是会在MA_FREERTOS_Init函数创建一个默认任务。该任务的功能仅仅做一个延时。
代码
FreeRTOSConfigure.h
#define configTOTAL_HEAP_SIZE ((size_t)1024 * 24)
main.h
#define UARTRXBUFFERSIZE 512
#define UARTQUEUENUM 3
#define UARTQUEUESIZE (uint32_t)UARTRXBUFFERSIZE * UARTQUEUENUM
typedef struct {
uint8_t uartRxTemp[UARTRXBUFFERSIZE];
uint8_t uartRxName[7];
} UARTMessageQueue_TypeDef;
stm32l4xx_it.c
extern uint8_t uart1RxBuffer[UARTRXBUFFERSIZE];
extern uint8_t uart2RxBuffer[UARTRXBUFFERSIZE];
extern uint8_t uart4RxBuffer[UARTRXBUFFERSIZE];
extern osMessageQueueId_t osQueueUart1;
extern osMessageQueueId_t osQueueUart2;
extern osMessageQueueId_t osQueueUart4;
void USART1_IRQHandler(void) {
uint8_t temp;
UARTMessageQueue_TypeDef msg;
uint8_t str[7] = "USART1";
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET) {
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
temp = huart1.Instance->RDR;
temp = temp;
HAL_UART_DMAStop(&huart1);
if (strlen(uart1RxBuffer) != 0) {
memset(msg.uartRxTemp, 0x00, sizeof(msg.uartRxTemp));
memcpy(msg.uartRxTemp, uart1RxBuffer, strlen(uart1RxBuffer));
memcpy(msg.uartRxName, str, strlen(str));
memset(uart1RxBuffer, 0x00, strlen(uart1RxBuffer));
osMessageQueuePut(osQueueUart1, &msg, 0, 0);
}
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1, uart1RxBuffer, UARTRXBUFFERSIZE);
}
HAL_UART_IRQHandler(&huart1);
}
void USART2_IRQHandler(void) {
uint8_t temp;
UARTMessageQueue_TypeDef msg;
uint8_t str[7] = "USART2";
if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET) {
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
temp = huart2.Instance->RDR;
temp = temp;
HAL_UART_DMAStop(&huart2);
if (strlen(uart2RxBuffer) != 0) {
memset(msg.uartRxTemp, 0x00, sizeof(msg.uartRxTemp));
memcpy(msg.uartRxTemp, uart2RxBuffer, strlen(uart2RxBuffer));
memcpy(msg.uartRxName, str, strlen(str));
memset(uart2RxBuffer, 0x00, strlen(uart2RxBuffer));
osMessageQueuePut(osQueueUart2, &msg, 0, 0);
}
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart2, uart2RxBuffer, UARTRXBUFFERSIZE);
}
HAL_UART_IRQHandler(&huart2);
}
void UART4_IRQHandler(void) {
uint8_t temp;
UARTMessageQueue_TypeDef msg;
uint8_t str[7] = "UART4";
if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_IDLE) != RESET) {
__HAL_UART_CLEAR_IDLEFLAG(&huart4);
temp = huart4.Instance->RDR;
temp = temp;
HAL_UART_DMAStop(&huart4);
if (strlen(uart4RxBuffer) != 0) {
memset(msg.uartRxTemp, 0x00, sizeof(msg.uartRxTemp));
memcpy(msg.uartRxTemp, uart4RxBuffer, strlen(uart4RxBuffer));
memcpy(msg.uartRxName, str, strlen(str));
memset(uart4RxBuffer, 0x00, strlen(uart4RxBuffer));
osMessageQueuePut(osQueueUart4, &msg, 0, 0);
}
__HAL_UART_CLEAR_IDLEFLAG(&huart4);
__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart4, uart4RxBuffer, UARTRXBUFFERSIZE);
}
HAL_UART_IRQHandler(&huart4);
}
main.c
uint8_t uart1RxBuffer[UARTRXBUFFERSIZE] = { 0 };
uint8_t uart2RxBuffer[UARTRXBUFFERSIZE] = { 0 };
uint8_t uart4RxBuffer[UARTRXBUFFERSIZE] = { 0 };
void uartEnableIDLE(void) {
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
HAL_UART_Receive_DMA(&huart1, uart1RxBuffer, UARTRXBUFFERSIZE);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
HAL_UART_Receive_DMA(&huart2, uart2RxBuffer, UARTRXBUFFERSIZE);
__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
__HAL_UART_ENABLE_IT(&huart4, UART_IT_ERR);
HAL_UART_Receive_DMA(&huart4, uart4RxBuffer, UARTRXBUFFERSIZE);
}
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
UNUSED(huart);
uint8_t temp;
if (huart->Instance == USART1) {
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET) {
temp = huart1.Instance->RDR;
temp = temp;
__HAL_UART_CLEAR_OREFLAG(&huart1);
HAL_UART_Receive_DMA(&huart1, uart1RxBuffer, UARTRXBUFFERSIZE);
}
} else if (huart->Instance == USART2) {
if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ORE) != RESET) {
temp = huart2.Instance->RDR;
temp = temp;
__HAL_UART_CLEAR_OREFLAG(&huart2);
HAL_UART_Receive_DMA(&huart2, uart2RxBuffer, UARTRXBUFFERSIZE);
}
} else if (huart->Instance == UART4) {
if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_ORE) != RESET) {
temp = huart4.Instance->RDR;
temp = temp;
__HAL_UART_CLEAR_OREFLAG(&huart4);
HAL_UART_Receive_DMA(&huart4, uart4RxBuffer, UARTRXBUFFERSIZE);
}
}
}
freertos.c
osMessageQueueId_t osQueueUart1;
osMessageQueueId_t osQueueUart2;
osMessageQueueId_t osQueueUart4;
osThreadId_t uart1TaskHandle;
osThreadId_t uart2TaskHandle;
osThreadId_t uart4TaskHandle;
void uart1RxTask(void *argument);
void uart2RxTask(void *argument);
void uart4RxTask(void *argument);
void MX_FREERTOS_Init(void) {
osKernelInitialize();
osQueueUart1 = osMessageQueueNew(UARTQUEUENUM, sizeof(UARTMessageQueue_TypeDef), NULL);
osQueueUart2 = osMessageQueueNew(UARTQUEUENUM, sizeof(UARTMessageQueue_TypeDef), NULL);
osQueueUart4 = osMessageQueueNew(UARTQUEUENUM, sizeof(UARTMessageQueue_TypeDef), NULL);
const osThreadAttr_t uart1RxTask_attributes = { .name = "uart1RxTask",
.priority = (osPriority_t) osPriorityNormal, .stack_size = 1024 };
uart1TaskHandle = osThreadNew(uart1RxTask, NULL, &uart1RxTask_attributes);
const osThreadAttr_t uart2RxTask_attributes = { .name = "uart2RxTask",
.priority = (osPriority_t) osPriorityNormal, .stack_size = 1024 };
uart2TaskHandle = osThreadNew(uart2RxTask, NULL, &uart2RxTask_attributes);
const osThreadAttr_t uart4RxTask_attributes = { .name = "uart4RxTask",
.priority = (osPriority_t) osPriorityNormal, .stack_size = 1024 };
uart4TaskHandle = osThreadNew(uart4RxTask, NULL, &uart4RxTask_attributes);
}
void uart1RxTask(void *argument) {
UARTMessageQueue_TypeDef msg;
osStatus_t status;
while (1) {
status = osMessageQueueGet(osQueueUart1, &msg, NULL, 0);
if (status == osOK) {
HAL_UART_Transmit(&huart1, msg.uartRxTemp, strlen(msg.uartRxTemp),
1000);
memset(msg.uartRxTemp, 0x00, strlen(msg.uartRxTemp));
}
osThreadYield();
}
}
void uart2RxTask(void *argument) {
UARTMessageQueue_TypeDef msg;
osStatus_t status;
while (1) {
status = osMessageQueueGet(osQueueUart2, &msg, NULL, 0);
if (status == osOK) {
HAL_UART_Transmit(&huart2, msg.uartRxTemp, strlen(msg.uartRxTemp),
1000);
memset(msg.uartRxTemp, 0x00, strlen(msg.uartRxTemp));
}
osThreadYield();
}
}
void uart4RxTask(void *argument) {
UARTMessageQueue_TypeDef msg;
osStatus_t status;
while (1) {
status = osMessageQueueGet(osQueueUart4, &msg, NULL, 0);
if (status == osOK) {
HAL_UART_Transmit(&huart4, msg.uartRxTemp, strlen(msg.uartRxTemp),
1000);
memset(msg.uartRxTemp, 0x00, strlen(msg.uartRxTemp));
}
osThreadYield();
}
}
工程代码
如果愿意支持一下可以选择在CSDN下载,下载地址:
//download.csdn.net/download/JoelYang1997/12013095
同时如果没有下载币提供GIthub地址:
https://github.com/joelyang97/32L4_FreeRTOSandUART
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)