STM32F103C8T6-hal库移植FreeRTOS
- 准备工作
- 移植
- c8t6移植中遇到的问题
- 测试
准备工作
1、hal库基础工程:这里没找到C8T6的基础工程,到正点原子官网找了RCT6的基础工程,程序中改成C8T6就可以了,启动文件不用更换。测试能不能用时只用改IO口即可,其他的不用改。
2、FreeRTOS源码:可以上官网下载,也可以下载正点原子的资料,里面都有。下载完成解压打开后就是下图那样的目录:
上图展示的就是FreeRTOS的根目录。各子文件和子文件的的描述如下表所示:
移植要用的都在FreeRTOS中。
移植
移植的详细步骤直接看b站正点原子的视频,跟着做绝对不会出错:https://www.bilibili.com/video/BV19g411p7UT/?p=7&spm_id_from=333.880.my_history.page.click&vd_source=2a10d30b8351190ea06d85c5d0bfcb2a
c8t6移植中遇到的问题
将定时器相关的驱动代码复制到自己的工程后编译遇到如下错误:
解决:
添加这两个c文件进来即可。
测试
freertos_demo.c
/******************************************************************************************************* @file freertos.c* @author 正点原子团队(ALIENTEK)* @version V1.4* @date 2022-01-04* @brief FreeRTOS 任务创建与删除实验(动态方法)* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司***************************************************************************************************** @attention** 实验平台:正点原子 MiniSTM32 V4开发板* 在线视频:www.yuanzige.com* 技术论坛:www.openedv.com* 公司网址:www.alientek.com* 购买地址:openedv.taobao.com******************************************************************************************************/#include "freertos_demo.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.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 2 /* 任务优先级 */
#define TASK2_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t Task2Task_Handler; /* 任务句柄 */
void task2(void *pvParameters); /* 任务函数 *//******************************************************************************************************//*** @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(); /* 进入临界区 *//* 创建任务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)
{while (1){taskENTER_CRITICAL(); /* 进入临界区 */printf("1_run!!!\r\n");taskEXIT_CRITICAL(); /* 退出临界区 */}
}/*** @brief task2* @param pvParameters : 传入参数(未用到)* @retval 无*/
void task2(void *pvParameters)
{while (1){taskENTER_CRITICAL(); /* 进入临界区 */printf("2_run!!!\r\n");taskEXIT_CRITICAL(); /* 退出临界区 */}
}
main.c
int main(void)
{HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟,72M */delay_init(72); /* 初始化延时函数 */led_init(); /* 配置STM32操作LED相关的寄存器 */usart_init(115200);printf("shabi");freertos_demo();}
测试结果: