IAR下移植FreeRTOS到STM32F103C8T6
一.IAR的安装
IAR官方网站:https://www.iar.com/cn/
IAR下载地址:https://www.iar.com/products/architectures/arm/iar-embedded-workbench-for-arm/
安装:按默认操作安装,安装时更改一下安装路径即可,安装中的"USB driver"也可以勾选上,更具体的请去参考网上其他博主的教程,这里不再详细介绍。
二.环境介绍
- Windows 10操作系统。
- STM32F103C8T6标准库。
- FreeRTOS 9.0版本。
- IAR 9.32.1版本(选最新的版本应该也不会有什么问题的)。
三.工程文件
工程目录名称4.free-rtos_IAR
,里面的内容的全貌如下:
Config:(用到里面的第一个)
FreeRTOS:(portable里只用到heap_4.c
、port.c
、portasm.s
、portmacro.h
这几个,其它都用到)
标准库:(core_cm3.c及其头文件可能需要删除掉,本文中则是需要删除掉的)
工程目录与文件用于创建IAR项目。
四.IAR-项目创建
IAR工程项目创建步骤:
- 新建工作空间,然后新建项目。
- 往项目新建组并加入文件。
- 工程配置。
- 解决错误和警告。
- make。
1、打开IAR,新建工作空间与创建项目:
①新建工作空间,创建后选中Save Workspace..
保存,保存到4.free-rtos_IAR
目录下,命名随意,这里命名为4.free-rtos_IAR
:
②创建项目:
会弹出以下界面,选择空项目然后创建即可,项目命名为4.free-rtos_IAR
(随意命名),存于工程目录——4.free-rtos_IAR
目录下:
2、往项目新建组并添加文件
按如下操作进行创建并添加文件:
创建并添加文件后的全貌如下,注意一下红框中添加的文件,其它的则是将同名文件夹的里的文件都添加进去即可:
3、项目的工程配置
点击options,打开配置面板。
开始进行配置:
①在General Options → Target → Device 选好使用的芯片型号(STM32F103C8),然后 General Options → Library Configuration 里勾上Use CMSIS5.7。
注意,勾选了
Use CMSIS5.7
,Start文件夹中的core_cm3.h
、core_cm3.c
就得去掉,表示不使用STM32F10x固件库的core;如果不勾选,使用下载的固件库的core_cm3.c
和core_cm3.h
,直接编译将会出现一个Core_cm3版本的问题,错误的原因是因为新版本CMSIS的intrinsics.h等文件与之前的版本不兼容,而解决方法就是注释掉core_cm3.h
里的93行的#include <intrinsics.h>
,源文件只有只读权限,要修改可以通过编辑软件编辑后另存为一个新的文件,然后替代掉原来的即可。
②在C/C++Compiler → Preprocessor里,配置头文件目录(为了在include时不用加上路径)和定义全局宏,配置分别如下:($PROJ_DIR$\
表示项目所在目录,$PROJ_DIR$\..\
表示项目所在目录的上一个目录,项目所在目录:就是上面新建项目后保存项目的那个目录)
③在Linker里勾上Override default
,并且设置为$PROJ_DIR$\Config\stm32f10x_flash.icf
,选择到stm32f10x_flash.icf文件。
④在Debugger → Setup 里的Driver选择使用的调试器(我是ST-LINK),再在Download里将Verify download
勾上。
⑤在Assembler → Preprocesser中,在Additional include directories
添加FreeRTOSConfig.h
所在目录 —— $PROJ_DIR$\User
。
4、文件修改操作
①将Startup里的core.h以及core.c删除掉,并在项目中也要移除掉这两个文件,因为我在上面的工程配置中勾选了Use CMSIS5.7
。
②修改startup_stm32f10x_xd.s
文件,否则会出现一些警告。通过编辑软件修改该文件然后另存为另一个同名同后缀文件,然后使用这个文件替代掉原来的即可。修改说明及内容如下:
// 找到Reset_Handler这里,最后的SECTION修改 SECTION .text:CODE:REORDER:NOROOT(1)
// SECTION .text:CODE:REORDER(1) 改为 SECTION .text:CODE:REORDER:NOROOT(1)
// 这样也行 SECTION .text:CODE:REORDER(1) 改为 SECTION .text:CODE:NOROOT:REORDER(1)
Reset_Handler
LDR R0, =SystemInit
BLX R0
LDR R0, =__iar_program_start
BX R0
PUBWEAK NMI_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
③修改User里的FreeRTOSConfig.h
文件 —— 在末尾的#endif
前添加以下内容:
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
④在stm32f10x_it.c文件中找到以下三个函数并注释掉:
void SVC_Handler(void)
{
}
void PendSV_Handler(void)
{
}
void SysTick_Handler(void)
{
}
5、编译
6、添加测试代码
在User里的FreeRTOSConfig.h
文件的#end
前添加以下配置:
#define configSUPPORT_DYNAMIC_ALLOCATION 1
main.c
里的测试代码:
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "portmacro.h"
void IO_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void TestTask(void);
int main(void)
{
IO_Init();
BaseType_t xReturn = pdTRUE;
taskENTER_CRITICAL();
xReturn = xTaskCreate((TaskFunction_t)TestTask, "TestTask", 512, NULL, 2, NULL);
taskEXIT_CRITICAL();
if(xReturn == pdTRUE) {
vTaskStartScheduler();
}
while(1);
}
void TestTask(void)
{
while(1){
GPIO_SetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(500);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
vTaskDelay(500);
}
}
测试现象为:接PC13的那个LED闪烁。
7、编译与烧录
①先点击编译。
②烧录 —— 点击那个绿色的按钮:
③烧录成功后,会进入debug模式,退出debug模式后后就能看到烧录的程序运行现象了。
END.