本文章移植目标
STM32f103+标准款 + FreeRTOS
下载标准库和FreeRTOS官方源码
你的标准库是什么版本就选择什么系列的源码我是f1所以下面都是f1的示例
https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html
标准库:https://www.st.com.cn/zh/embedded-software/stsw-stm32054.html#get-software
官方源码:https://www.freertos.org/zh-cn-cmn-s
FreeRTOS官方下载较慢建议去找个网盘下载或者科学上网下载
官方源码还可以从gitee上面下载 但前提是安装好了 git工具
链接:https://gitee.com/zhangjiegerenkongjian/free-rtos202212.01
新建多级文件夹,这个看自己习惯
1.我建立code>FreeRTOS>MDK-ARM
2.打开keil5 新建工程文件
3.选择1建立的文件夹并创建project项目
4.选择对应的芯片信号我是stm32f103c8t6 直接搜索选择
5.选择后点击ok即可
6.去文件夹查看就发现建好了
标准外设(固件库)移植
1.在MKD-ARM文件同级目录创建文件夹STM32F10x_StdPeriph_Driver 和User
2.把下载标准外设库文件STM32F10x_StdPeriph_Driver里面inc文件夹和src文件夹放到新建的STM32F10x_StdPeriph_Driver文件里面
3.再在同级新建一个CMSIS文件夹将标准外设库文件里面的CMSIS文件里面的有cm3的文件夹复制过来以为stm32f103就是使用的cm3芯片一定要弄过来
4.还要有启动文件移植过来 启动文件是startup_stm32f10x_md.s 和外面三个.h和.c文件
5.在User文件夹下面新建main.c文件作为主函数文件 再在标准库移植三个案例文件的启动文件
FreeRTOS移植
我们主要是使用里面的source文件和里面的所有内容所以我们新建一个FreeRTOS文件夹在将source里面的全部文件移植过去 在删除一下不需要的冗余文件就可以了
这四个文件没用可以删除
在portable里面只需要留下MemMang 和RVDS即可
在RVDS中我们只需要cm3支持即可 删除其他只留下ARM_CM3就可以了
在MemMang里面只留下head_4.c就可以了
在keil5里面添加分组并导入文件
1.添加分组
START:存放启动文件
STM32F10x_StdPeriph_Driver:存放外设库固件
CMSIS:
User:main.c等的编译文件
2.在START文件夹里面添加启动文件 选择START点击Add Files
3.添加STM32F10x_StdPeriph_Driver库 在STM32F10x_StdPeriph_Driver 里面有一个 src里面全部的.c文件全选后添加就可以了
4.添加CMSIS的系统文件
5.在User里面添加main.c函数和中断向量函数文件
6.添加头文件 基本就是所有有.h文件夹的目录我们可以按照自己的目录结构来添加
7.找到有.h的文件目录 进行添加
这样所有头文件都添加成功了
8.添加FreeRTOS文件 所有的.c文件 但是不能添加文件夹
ManMang 里面的head_4.c
ARM_COM3里面的port.c文件
添加后编译发现缺少文件
这是以为确实必要文件 这个我们需要去freeRtos里面的官方源码demo里面找并移植到项目里面
再次编译这里有些会报错有些不会报错
如下:
第一个错误是因为缺少宏定义 添加:USE_STDPERIPH_DRIVER即可
第二个错误是因为没有设置main()函数的原因 在main.c里面添加main函数就可以了
再次编译没有错误了
注意:记得在User里面添加前面缺少的FreeRTOSconfig.h的文件如下
代码验证结果
在main.c里面添加下面内容创建两个任务 ,让任务交替
#include "stm32f10x.h" // Device header
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
int a1=0;
int a2=0;
void task0(void *param)
{
while(1)
{
a1 = 1;
a2 = 0;
}
}
void task1(void *param)
{
while(1)
{
a1 = 0;
a2 = 1;
}
}
int main()
{
xTaskCreate( task0,"Task0",10,"Task 0 is runing",1,NULL);
xTaskCreate( task1,"Task1",10,"Task 1 is runing",1,NULL);
vTaskStartScheduler();
while(1);
}
然后进行调试 在调试之前先要修改配置如下
Parameter:修改为-pSTM32F103C8 这是对应的芯片信号不同芯片信号是不一样的
Dialog DLL: DARMSTM.DLL
这样编译一下就可以调试了
调试:点击调试按钮
选择逻辑分析仪
鼠标分别放在a1和a2上右击添加到逻辑分析仪里面
在逻辑分析仪里面选中右击a1,a2 使用bit 只看0 1即可
当我点击调试发现没有效果
取消调试发现代码卡在HardFault_Handler这里
解决办法在FreeRTOSconfig.h添加宏定义
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
取代原来的三个函数
同事还要去掉port.c和stm32f10x_it.c中触发的三个函数不然会报错 我们去除stm32f10x_it.c里面的
void SVC_Handler(void)
{
}
void PendSV_Handler(void)
{
}
void SysTick_Handler(void)
{
}
再次编译没有问题了
调试也可以查看了