基于CubeMX-STM32F302_uCOSII例程移植
1、说明
STM32F302的内核为Cortex-M4的,所以我们以官方的F4例程为基础移植。
2、准备
2.1、软件
1、官方例程源码:Micrium_STM3240G-EVAL_OS2 (需要账号)
2、移植完成代码:https://download.csdn.net/download/qq_39567970/20366977
3、官网例程源码+移植完成代码:https://download.csdn.net/download/qq_39567970/20367158
2.2、开发工具
以下两个工具大家都应该有,不然的话可以去官方下载。
1、STM32CubeMX 6.2.0
2、Keil uVision5 V5.34.0.0
2.3、移植时间
2021年7月18日
3、创建简易的 LED 工程
3.1、新建CubeMX工程
打开软件点击红框标注的 ACCESS TO MCU SELECTOR 选项
根据自己的需要选择对应的芯片,选择之后,点击Start Project,如下所示
3.2、配置时钟源,调试接口,端口
进入新的界面,点击 System Core,进行配置
配置时钟,选择外部晶体振荡器
配置调试接口,注意:此处不配置会出现第二次无法进行下载(SWD接口被复用为其他功能,一旦出现这个问题要使用Flymcu 进行修改恢复其调试接口的功能)
配置相应的GPIO端口,我们直接在 Pinout view 上进行修改。找到你想配置的引脚鼠标左击(其实就是你板子上连接LED的,一般这么搞(●’◡’●)),配置为输出就好了。
我配置了三个端口
3.3、配置时钟
进入时钟配置页面,②我们配置外部时钟的频率,③选择系统时钟源,④设置相应时钟频率,软件自动计算。
工程配置,②配置工程及文件夹的名字,
③配置工程的保存路径,
④选择相应的集成开发环境(IDE)
⑤选择 IDE 的版本,
⑥使用的HAL库的版本
代码生成配置、①选择代码生成的配置选项
②选择只复制必要的库文件(第一个选择拷贝所以的库文件)
③为外设的初始化生成单独的.c、.h文件(第二个选择后外设的初始化文件会全部在BSP 的文件中)
上述选项做完,点击 GENERATE CODE就可以生成相应的工程
生成的工程文件目录如下所示
4、移植 uCOSII
4.1、创建文件夹
在我们使用 CubeMX 创建的工程中添加 uCOSII 文件夹,在 uCOSII 文件夹内创建 Cfg、Ports、Source 三个文件夹。
我们打开下载好的 uCOSII 源码,找到对应的文件夹 Ports、Source
4.2、移植相关文件
4.2.1、移植 Cfg配置文件
打开uCOSII 例程源码中的 Examples 文件夹,将 ST/STM3240G-EVAL/OS2 文件夹中os_cfg.h拷贝到我们创建的工程目录下新建的 Cfg 文件夹中
4.2.2、移植 Ports 底层连接文件
打开Micrium\Software\uCOS-II\Ports\ARM-Cortex-M4\Generic\RealView 文件夹
将其中的文件全部拷贝到我们新建的 Ports 文件夹中
4.2.3、移植 Source OS源码文件
打开uCOSII 例程源码中的 Micrium\Software\uCOS-II\Source 文件夹,将其中的文件全部拷贝到我们创建的工程目录下新建的 Source 文件夹中
4.3、在 Keil MDK5 中配置相关文件
4.3.1、打开工程
打开创建的 Keil 工程
4.3.2、工程配置
①打开项目管理
②添加新的工程文件夹
③文件夹命名
④添加文件到新建的文件夹中
4.3.3、添加头文件
4.4、编译调试代码
4.4.1、编译出现未找到源文件错误
如下所示,我们注释掉②处,再次编译
4.4.2、编译出现如下错误未定义
如下所示的错误,原因是 CPU_STK 未定义,我们在 os_cpu.h 中添加定义
4.4.3、编译出现如下错误
将 os_cfg.h 中的 OS_APP_HOOKS_EN 定义为 0;
将 os_cfg.h 中的 OS_TICKS_PER_SEC 定义为 1000;
将 os_cpu_c.c文件中的函数 OS_CPU_SysTickHandler,OS_CPU_SysTickInit 屏蔽掉
编译后如下所示
4.4.3、修改异常中断名称PendSV_Handler
我们需要修改异常中断处理部分,①将STM32的启动文件中的异常中断命名PendSV_Handler进行复制,将其替换掉 uCOSII 汇编文件中的 OS_CPU_PendSVHandler (共三处)
替换位置1
替换位置2
替换位置3
替换完成之后要把之前的生成工程中的 PendSV_Handler(void)注释掉。
注意:在从CubeMX添加其他外设更新工程时此处的注释会被消除掉!!!
4.4.4、添加滴答定时器的配置
在stm32f3xx_it.c 文件夹中添加 #include "ucos_ii.h" 头文件,在滴答定时器中断中添加
OSIntEnter();、OSTimeTick();、OSIntExit();
如图所示,头文件需添加到提示的范围内,不然CubeMX更新工程会将其删除
4.4.5、创建简易测试任务
创建三个LED闪烁的任务,编译运行成功,但是当进行浮点运算时会出现 HardFault,
我们需要在stm32 的启动文件中添加如下汇编代码,再进行浮点运算就可以了
;to enable FPU
IF {FPU} != "SoftVFP"
; Enable Floating Point Support at reset for FPU
LDR 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 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
;to enable FPU
5、注意事项
注意:通过CubeMX 添加新的外设后更新工程有两个修改的地方会被刷新掉
①:在 stm32f3xx_it.c 文件中注释掉的函数 PendSV_Handler(void),会被取消注释更新工程后需要从新注释掉。
②:在 starup_stm32f302xc.S 文件中开启 FPU 的汇编代码会被删除掉,更新工程后需要从新添加。