- 移植前准备工作:
- 获取STM32裸机最小工程
- 跑马灯实验
- uC/OS源码获取:
- https://www.micrium.com/downloadcenter/,下载需要注册帐号
- 本例程ucosiii 3.04(来源正点原子)
- uC/OS文件介绍
- 移植到STM32工程
- 添加分组
- 添加对应文件到相应分组
- 添加头文件路径
- 修改相应文件
- 修改startup_stm32f767xx.s,将其中的PendSV_Handler和SysTick_Handler改为OS_CPU_PendSVHandler和OS_CPU_SysTickHandler
- 添加支持FPU(浮点运算单元)代码
; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 IF {FPU} != "SoftVFP" ; Enable Floating Point Support at reset for FPU LDR.W R0, =0xE000ED88 ; Load address of CPACR register LDR R1, [R0] ; Read value at CPACR ORR R1, R1, #(0xF <<20) ; Set bits 20-23 to enable CP10 and CP11 coprocessors ; Write back the modified CPACR value STR R1, [R0] ; Wait for store to complete DSB ; Disable automatic FP register content ; Disable lazy context switch LDR.W R0, =0xE000EF34 ; Load address to FPCCR register LDR R1, [R0] AND R1, R1, #(0x3FFFFFFF) ; Clear the LSPEN and ASPEN bits STR R1, [R0] ISB ; Reset pipeline now the FPU is enabled ENDIF LDR R0, =__main BX R0 ENDP
- 修改bsp.h
- 修改bsp.c
- 修改BSP_CPU_ClkFreq函数
CPU_INT32U BSP_CPU_ClkFreq (void) { CPU_INT32U hclk_freq; hclk_freq = HAL_RCC_GetHCLKFreq(); return (hclk_freq); }
- 修改BSP_Init()函数
/************************************************** * 函数名:void BSP_Init (void) * 描述 :外设初始化 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ void BSP_Init (void) { Cache_Enable(); //打开L1-Cache HAL_Init(); //初始化HAL库 Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz uart_init(115200); }
- main文件
-
/**************** (C) COPYRIGHT SPT ************* * 文件名 :main.c * 芯片 :STM32F767IGT6 * 开发工具 :MDK V5.25 * HAL版本 :STM32Cube_FW_F7_V1.4.0 * uC/OSIII版本:UCOSIII 3.04 * 作者 :spt * 时间 :2020-04-22 * 联系方式 : * 功能简述 : *************************************************/ #include "includes.h" #include "bsp.h" /* ********************************************************************************************************* * 任务控制块TCB ********************************************************************************************************* */ static OS_TCB AppTaskStartTCB; /* ********************************************************************************************************* * 任务堆栈 ********************************************************************************************************* */ static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; /* ********************************************************************************************************* * 函数原型 ********************************************************************************************************* */ static void AppTaskStart(void *p_arg); /************************************************** * 函数名:main() * 描述 :主函数入口 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ int main(void) { OS_ERR err; CPU_IntDis(); //关闭所有中断 OSInit(&err); //系统初始化 /* 创建起始任务 */ OSTaskCreate((OS_TCB *)&AppTaskStartTCB, //任务控制块地址 (CPU_CHAR *)"App Task Start", //任务名称 (OS_TASK_PTR ) AppTaskStart, //任务函数 (void *) 0, //传递给任务函数(形参p_arg)的实参 (OS_PRIO ) APP_TASK_START_PRIO, //任务的优先级 (CPU_STK *)&AppTaskStartStk[0], //任务堆栈的基地址 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10, //任务堆栈空间剩下1/10时限制其增长 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE, //任务堆栈空间(单位:sizeof(CPU_STK)) (OS_MSG_QTY ) 5u, //任务可接收的最大消息数 (OS_TICK ) 0u, //任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10) (void *) 0, //任务扩展(0表不扩展) (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项 (OS_ERR *)&err); OSStart(&err); } /************************************************** * 函数名:static void AppTaskStart (void *p_arg) * 描述 :起始任务 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskStart (void *p_arg) { CPU_INT32U cpu_clk_freq; CPU_INT32U cnts; OS_ERR err; (void)p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); /* Initialize the uC/CPU services */ //初始化滴答计数器 cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq /* Determine nbr SysTick increments */ / (CPU_INT32U)OSCfg_TickRate_Hz; OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ //内存管理,堆内存池,内存池表 Mem_Init(); /* Initialize memory managment module */ // Math_Init(); /* Initialize mathematical module */ #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN CPU_IntDisMeasMaxCurReset(); #endif while (DEF_TRUE) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB1置1 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB0置1 printf("灯亮了\r\n"); OSTimeDly ( 500,OS_OPT_TIME_DLY,&err); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //PB1置0 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //PB0置0 printf("灯灭了\r\n"); OSTimeDly ( 500,OS_OPT_TIME_DLY,&err); } } /************************ (C) COPYRIGHT SPT END OF FILE***********************/
-
- 修改BSP_CPU_ClkFreq函数
- 添加分组
- 下载验证
- 总结
- ucos不支持MDK版本,移植起来稍显麻烦,是不是要转freertos....
- 获取STM32裸机最小工程
【1】uC/OS-III应用开发————>移植uC/OS-III到STM32F767
最新推荐文章于 2024-07-09 17:32:51 发布