Keil5 中基于 STM32F103 开发板使用 FreeRTOS ——1.从环境搭建到运行第一个 FreeRTOS 程序。
4. FreeRTOSConfig.h中添加必须的四个宏 与 stm32f10x_it.c中必须注释的内容(你也不想你的小灯灯他不亮吧,嘿嘿嘿)文件夹下只需要添加对应编译器和芯片架构的文件,对于 Keil5 和 STM32F103,需要添加。6.FreeRTOSConfig.h配置与注释。3.FreeRTOSConfig.h在那里。1.选对要下载的FreeRTOS,地址。stm32f10x芯片的的
一.流程
1. 准备工作
- 安装 Keil5:从 Keil 官方网站下载并安装 Keil5 MDK(Microcontroller Development Kit),安装过程中需要选择合适的 ARM 编译器支持包。
- 安装 STM32F103 芯片支持包:打开 Keil5,通过 Pack Installer 安装 STM32F103 系列的芯片支持包,这样 Keil5 才能识别并支持该芯片。
- 下载 FreeRTOS 源码:从 FreeRTOS 官方网站下载最新的 FreeRTOS 源码包,并解压到本地。
2. 创建 Keil5 项目
- 打开 Keil5,选择
Project->New μVision Project。 - 在弹出的对话框中,选择项目保存的路径并输入项目名称,点击
保存。 - 在
Device选项卡中,选择STMicroelectronics->STM32F1 Series->STM32F103,选择具体的芯片型号(如STM32F103C8),点击OK。 - 在弹出的
Manage Run - Time Environment对话框中,勾选CMSIS->CORE和Device->Startup,点击OK。
3. 添加 FreeRTOS 源码到项目
- 复制 FreeRTOS 源码到项目目录:在项目目录下创建一个名为
FreeRTOS的文件夹,将解压后的 FreeRTOS 源码中的Source文件夹复制到该目录下。 - 添加 FreeRTOS 源文件到项目:在 Keil5 的
Project窗口中,右键点击项目名称,选择Manage Project Items。 - 在
Groups选项卡中,点击Add Group,创建一个名为FreeRTOS的组。 - 选择
FreeRTOS组,点击Add Files,将FreeRTOS/Source文件夹下的所有.c文件添加到项目中。注意,portable文件夹下只需要添加对应编译器和芯片架构的文件,对于 Keil5 和 STM32F103,需要添加portable\RVDS\ARM_CM3文件夹下的port.c和portmacro.h,以及portable\MemMang文件夹下的heap_4.c。 - 添加完成后,点击
OK。
4. 配置 FreeRTOS 头文件路径
- 右键点击项目名称,选择
Options for Target。 - 在
C/C++选项卡中,点击Include Paths后面的按钮,添加 FreeRTOS 头文件的路径,包括FreeRTOS/Source/include和FreeRTOS/Source/portable/RVDS/ARM_CM3。 - 点击
OK保存配置。
5. 配置 FreeRTOSConfig.h 文件
- 从 FreeRTOS 源码的
Demo文件夹中找到适合 STM32F103 的FreeRTOSConfig.h文件,复制到项目目录下。 - 可以根据项目需求对
FreeRTOSConfig.h文件进行修改,例如设置任务优先级范围、时钟节拍频率等。在下面有一个简单的配置示例:
6. 编写 FreeRTOS 应用代码
以下以下是基于 STM32F103 在 Keil 环境下使用 FreeRTOS 实现 PA8 和 PA9 引脚交替闪烁(PA8 2 秒闪烁一次,PA9 0.5 秒闪烁一次)的代码示例:
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
// 任务1:控制PA8引脚,2秒闪烁一次
void vTaskLED8(void *pvParameters) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA8为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1) {
GPIO_SetBits(GPIOA, GPIO_Pin_8);
vTaskDelay(pdMS_TO_TICKS(2000)); // 延迟2秒
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
vTaskDelay(pdMS_TO_TICKS(2000)); // 延迟2秒
}
}
// 任务2:控制PA9引脚,0.5秒闪烁一次
void vTaskLED9(void *pvParameters) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA9为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1) {
GPIO_SetBits(GPIOA, GPIO_Pin_9);
vTaskDelay(pdMS_TO_TICKS(500)); // 延迟0.5秒
GPIO_ResetBits(GPIOA, GPIO_Pin_9);
vTaskDelay(pdMS_TO_TICKS(500)); // 延迟0.5秒
}
}
int main(void) {
// 创建任务1
xTaskCreate(vTaskLED8, "LED8Task", 128, NULL, 1, NULL);
// 创建任务2
xTaskCreate(vTaskLED9, "LED9Task", 128, NULL, 1, NULL);
// 启动调度器
vTaskStartScheduler();
// 如果调度器启动失败,程序会执行到这里
while (1);
}
7. 编译和下载程序
- 点击 Keil5 工具栏中的
Build按钮编译项目,如果代码没有错误,会在输出窗口显示编译成功的信息。 - 连接 STM32F103 开发板到电脑,通过 ST - Link 或其他下载工具将生成的
.hex文件下载到开发板。 - 下载完成后,开发板上的 LED 灯应该会按照程序设定的逻辑闪烁。
其他参考(一定要看)
二.问题与补充
1.选对要下载的FreeRTOS,地址FreeRTOS™ - FreeRTOS™

2. 新手选对要下载的文件

3.FreeRTOSConfig.h在那里
stm32f10x芯片的的地址在
...FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_IAR
直接就能看到
4. FreeRTOSConfig.h中添加必须的四个宏 与 stm32f10x_it.c中必须注释的内容(你也不想你的小灯灯他不亮吧,嘿嘿嘿)
/* 添加必须的四个宏 */
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
#define INCLUDE_xTaskGetSchedulerState 1


5.port在哪添加

portable文件夹下只需要添加对应编译器和芯片架构的文件,对于 Keil5 和 STM32F103,需要添加portable\RVDS\ARM_CM3文件夹下的port.c和portmacro.h,以及portable\MemMang文件夹下的heap_4.c。
.....\FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS\ARM_CM3
(.h文件添加到include中)

.....\FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source\portable\MemMang
(只要heap_4.c)

6.FreeRTOSConfig.h配置与注释
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
// 启用抢占式调度,1表示开启,高优先级可抢占低优先级任务
#define configUSE_PREEMPTION 1
// 禁用空闲任务钩子函数,1启用,可在空闲任务执行时添加自定义操作
#define configUSE_IDLE_HOOK 0
// 禁用时钟节拍钩子函数,1启用,在时钟节拍中断时可执行自定义代码
#define configUSE_TICK_HOOK 0
// 设置CPU时钟频率为72000000Hz,需依实际硬件配置
#define configCPU_CLOCK_HZ ((unsigned long ) 72000000 )
// 定义时钟节拍频率为1000Hz,即1ms一个节拍
#define configTICK_RATE_HZ (( TickType_t ) 1000 )
// 系统最大任务优先级数量为5,优先级范围0 - 4
#define configMAX_PRIORITIES ( 5 )
// 空闲任务最小栈大小为128(单位依平台)
#define configMINIMAL_STACK_SIZE (( unsigned short ) 128 )
// 总堆内存大小为17 * 1024字节,用于动态内存分配
#define configTOTAL_HEAP_SIZE (( size_t ) ( 17 * 1024 ) )
// 任务名称最大长度为16个字符
#define configMAX_TASK_NAME_LEN ( 16 )
// 禁用跟踪功能,1启用,用于监控系统运行状态
#define configUSE_TRACE_FACILITY 0
// 不使用16位时钟节拍计数器,用32位
#define configUSE_16_BIT_TICKS 0
// 空闲任务应让出CPU资源,0表示不让出
#define configIDLE_SHOULD_YIELD 1
// 启用vTaskPrioritySet函数,1表示启用,用于设置任务优先级
#define INCLUDE_vTaskPrioritySet 1
// 启用uxTaskPriorityGet函数,1表示启用,用于获取任务优先级
#define INCLUDE_uxTaskPriorityGet 1
// 启用vTaskDelete函数,1表示启用,用于删除任务
#define INCLUDE_vTaskDelete 1
// 禁用vTaskCleanUpResources函数,1表示启用,用于清理任务相关资源
#define INCLUDE_vTaskCleanUpResources 0
// 启用vTaskSuspend函数,1表示启用,用于挂起任务
#define INCLUDE_vTaskSuspend 1
// 启用vTaskDelayUntil函数,1表示启用,用于使任务延迟到指定时间
#define INCLUDE_vTaskDelayUntil 1
// 启用vTaskDelay函数,1表示启用,用于使任务延迟指定时间
#define INCLUDE_vTaskDelay 1
// 配置内核中断优先级为255,该值用于设置内核相关中断的优先级,
// 具体数值需根据硬件和系统需求合理调整,数值大小含义依平台而定
#define configKERNEL_INTERRUPT_PRIORITY 255
// 配置最大系统调用中断优先级为191,限制系统调用相关中断的最高优先级,
// 可避免高优先级系统调用中断影响系统稳定性和实时性
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191
// 配置FreeRTOS库使用的内核中断优先级为15,
// 用于设定库中涉及的内核中断在系统中的优先级水平
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15
/* 添加必须的四个宏 */
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
#define INCLUDE_xTaskGetSchedulerState 1
#endif /* FREERTOS_CONFIG_H */
更多推荐



所有评论(0)