本帖最后由 正点原子运营 于 2024-5-29 16:49 编辑
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板
2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版
6)正点原子STM32技术交流QQ群:725095144
前面章节中的实验都是在裸机环境下实现,本章将介绍FreeRTOS的简单使用,对RTOS感兴趣的读者,可以参考正点原子推出的FreeRTOS或µC/OS-III的全套教程资料,包含教学视频、开发指南并配套有例程源码。通过本章的学习,读者将学习到FreeRTOS的简单应用。 本章分为如下几个小节: 57.1 硬件设计 57.2 程序设计 57.3 下载验证
57.1 硬件设计 57.1.1 例程功能 1. LED0由LED0任务控制80毫秒亮,920毫秒灭 2. LED1由LED1任务控制300毫秒亮,300毫秒灭
57.1.2 硬件资源 1. LED LED0 - PB5 LED1 - PE5
57.1.3 原理图 本章实验使用的FreeRTOS为软件库,因此没有对应的连接原理图。
57.2 程序设计 57.2.1 FreeRTOS的移植 FreeRTOS的源码可参考正点原子推出的《FreeRTOS开发指南》或相关的配套教学视频至FreeRTOS的官网下载,也可在A盘à6,软件资料àFreeRTOS学习资料中找到。 FreeRTOS的移植请读者参考正点原子推出的《FreeRTOS开发指南》或相关的配套教学视频,在上述资料中,对FreeRTOS的移植和使用都做了非常详细地介绍,是入门FreeRTOS的一个非常好的选择。
57.2.2 实验应用代码 本章实验的应用代码,如下所示: - int main(void)
- {
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
- delay_init(72); /* 初始化延时 */
- usart_init(115200); /* 初始化串口 */
- led_init(); /* 初始化LED */
-
- 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();
- }
复制代码从上面的代码中可以看出,在完成必要的初始化后,便创建了“start_task”任务,随后便开始了任务调度,“start_task”任务的入口函数为函数start_task(),如下所示: - /**
- *@brief start_task
- *@param pvParameters: 传入参数(未用到)
- *@retval 无
- */
- void start_task(void *pvParameters)
- {
- taskENTER_CRITICAL(); /* 进入临界区 */
-
- /* 创建LED0任务 */
- xTaskCreate( (TaskFunction_t )led0_task,
- (const char* )"led0_task",
- (uint16_t )LED0_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )LED0_PRIO,
- (TaskHandle_t* )&LED0Task_Handler);
-
- /* 创建LED1任务 */
- xTaskCreate( (TaskFunction_t )led1_task,
- (const char* )"led1_task",
- (uint16_t )LED1_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )LED1_PRIO,
- (TaskHandle_t* )&LED1Task_Handler);
-
- vTaskDelete(StartTask_Handler); /* 删除开始任务 */
- taskEXIT_CRITICAL(); /* 退出临界区 */
- }
复制代码从上面的代码中可以看出,“start_task”任务主要用于创建“led0_task”和“led1_task”任务,这两个任务的入口函数,如下所示: - /**
- *@brief LED0任务
- *@param pvParameters: 传入参数(未用到)
- *@retval 无
- */
- void led0_task(void *pvParameters)
- {
- while(1)
- {
- LED0(0);
- vTaskDelay(80);
- LED0(1);
- vTaskDelay(920);
- }
- }
- /**
- *@brief LED1任务
- *@param pvParameters: 传入参数(未用到)
- *@retval 无
- */
- void led1_task(void *pvParameters)
- {
- while(1)
- {
- LED1(0);
- vTaskDelay(300);
- LED1(1);
- vTaskDelay(300);
- }
- }
复制代码可以看到,两个任务分别控制开发板板载的两个LED闪烁,但其闪烁的频率和亮灭时间都不相同,因此因该能看到开发板板载的两个LED以不同的频率和不同的亮灭时间进行闪烁。
57.3 下载验证 在完成编译和烧录操作后,可以看到开发板板载的两个LED以不用的频率和不同的亮灭时间闪烁着,其中LED0在一个闪烁周期内的亮灭时间约分别为80毫秒和920毫秒,LED1在一个闪烁周期内的亮灭时间约分别为300毫秒和300毫秒。 |