基于CubeMX-STM32F302_uCOSII例程移植

基于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 选项

扫描二维码关注公众号,回复: 13537261 查看本文章

根据自己的需要选择对应的芯片,选择之后,点击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 的汇编代码会被删除掉,更新工程后需要从新添加。

猜你喜欢

转载自blog.csdn.net/qq_39567970/article/details/118902480