代码:
主程序
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/EXTI/exti.h"
#include "freertos_demo.h"
#include "./BSP/SDRAM/sdram.h"
#include "./MALLOC/malloc.h"#define START_TASK_PRIO 1
#define START_STK_SIZE 128const char *SRAM_NAME_BUF[SRAMBANK] = {" SRAMIN ", " SRAMCCM ", " SRAMEX "};int main(void)
{HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(360, 25, 2, 8); /* 设置时钟,180Mhz */delay_init(180); /* 延时初始化 */usart_init(115200); /* 串口初始化为115200 *///usmart_dev.init(90); /* 初始化USMART */led_init(); /* 初始化LED */key_init(); /* 初始化按键 */sdram_init(); /* SRAM初始化 *///lcd_init(); /* 初始化LCD */extix_init();my_mem_init(SRAMIN); /* 初始化内部内存池 */my_mem_init(SRAMEX); /* 初始化外部内存池 */my_mem_init(SRAMCCM); /* 初始化CCM内存池 */// lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
// lcd_show_string(30, 70, 200, 16, 16, "MALLOC TEST", RED);
// lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
// lcd_show_string(30, 110, 200, 16, 16, "KEY0:Malloc KEY2:Free", RED);
// lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:SRAMx KEY1:Read", RED);
// lcd_show_string(60, 160, 200, 16, 16, " SRAMIN ", BLUE);
// lcd_show_string(30, 176, 200, 16, 16, "SRAMIN USED:", BLUE);
// lcd_show_string(30, 192, 200, 16, 16, "SRAMCCM USED:", BLUE);
// lcd_show_string(30, 208, 200, 16, 16, "SRAMEX USED:", BLUE);freertos_demo();
}
freertos_demo.c
#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "string.h"
/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO 1 /* 任务优先级 */
#define START_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t StartTask_Handler; /* 任务句柄 */
void start_task(void *pvParameters); /* 任务函数 *//* TASK1 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK1_PRIO 2 /* 任务优先级 */
#define TASK1_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t Task1Task_Handler; /* 任务句柄 */
void task1(void *pvParameters); /* 任务函数 *//* TASK2 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define TASK2_PRIO 3 /* 任务优先级 */
#define TASK2_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t Task2Task_Handler; /* 任务句柄 */
void task2(void *pvParameters); /* 任务函数 */SemaphoreHandle_t BinarySemaphore;
/******************************************************************************************************//* LCD刷屏时使用的颜色 *//*** @brief FreeRTOS例程入口函数* @param 无* @retval 无*/
void freertos_demo(void)
{xTaskCreate((TaskFunction_t )start_task, /* 任务函数 */(const char* )"start_task", /* 任务名称 */(uint16_t )START_STK_SIZE, /* 任务堆栈大小 */(void* )NULL, /* 传入给任务函数的参数 */(UBaseType_t )START_TASK_PRIO, /* 任务优先级 */(TaskHandle_t* )&StartTask_Handler); /* 任务句柄 */vTaskStartScheduler();
}/*** @brief start_task* @param pvParameters : 传入参数(未用到)* @retval 无*/
void start_task(void *pvParameters)
{taskENTER_CRITICAL(); /* 进入临界区 */BinarySemaphore=xSemaphoreCreateBinary();if(BinarySemaphore==NULL){printf("创建二值信号量失败!\r\n");}/* 创建任务1 */xTaskCreate((TaskFunction_t )task1,(const char* )"task1",(uint16_t )TASK1_STK_SIZE,(void* )NULL,(UBaseType_t )TASK1_PRIO,(TaskHandle_t* )&Task1Task_Handler);/* 创建任务2 */xTaskCreate((TaskFunction_t )task2,(const char* )"task2",(uint16_t )TASK2_STK_SIZE,(void* )NULL,(UBaseType_t )TASK2_PRIO,(TaskHandle_t* )&Task2Task_Handler);vTaskDelete(StartTask_Handler); /* 删除开始任务 */taskEXIT_CRITICAL(); /* 退出临界区 */
}/*** @brief task1* @param pvParameters : 传入参数(未用到)* @retval 无*/
void task1(void *pvParameters)
{uint8_t key;while(1){ key=key_scan(0);if(key==WKUP_PRES){if(BinarySemaphore!=NULL){xSemaphoreGive(BinarySemaphore);}}LED0_TOGGLE();vTaskDelay(10); /* 延时1000ticks */}
}/*** @brief task2* @param pvParameters : 传入参数(未用到)* @retval 无*/
void task2(void *pvParameters)
{while(1){if((BinarySemaphore!=NULL)&&(g_usart_rx_sta & 0x8000)){xSemaphoreTake(BinarySemaphore,portMAX_DELAY);if(g_usart_rx_buf != "")printf("Receive Data=%s\r\n",g_usart_rx_buf);memset(g_usart_rx_buf,0,USART_REC_LEN);g_usart_rx_sta=0;}else{vTaskDelay(10);}}
}
串口中断程序:
extern SemaphoreHandle_t BinarySemaphore; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{BaseType_t xHigherPriorityTaskWoken;if (huart->Instance == USART_UX) /* 如果是串口1 */{if ((g_usart_rx_sta & 0x8000) == 0) /* 接收未完成 */{if (g_usart_rx_sta & 0x4000) /* 接收到了0x0d */{if (g_rx_buffer[0] != 0x0a) {g_usart_rx_sta = 0; /* 接收错误,重新开始 */}else {g_usart_rx_sta |= 0x8000; /* 接收完成了 */}}else /* 还没收到0X0D */{if (g_rx_buffer[0] == 0x0d){g_usart_rx_sta |= 0x4000;}else{g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ;g_usart_rx_sta++;if (g_usart_rx_sta > (USART_REC_LEN - 1)){g_usart_rx_sta = 0; /* 接收数据错误,重新开始接收 */}}}}HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);}if((BinarySemaphore!=NULL) && (g_rx_buffer[0] == 0x0a)){xSemaphoreGiveFromISR(BinarySemaphore,&xHigherPriorityTaskWoken);portYIELD_FROM_ISR(xHigherPriorityTaskWoken);g_rx_buffer[0] = 0x00;}
}
效果图