Air32F103开发环境搭建、移植FreeRTOS
环境搭建
Air32F103介绍
Air32F103为合宙系列芯片,首发型号为Air32F103CBT6,兼容市面上主流的F103芯片。不得不说5.8的片子、9.9的板子真滴香!
SDK下载
Air32f103开发板原理图和PCB链接:gitee
Air32f103的SDK链接:gitee
或者直接
git clone https://gitee.com/openLuat/luatos-soc-air32f103.git
下载的文件如下图所示,其中AIR_Jlink_Keil文件夹中保存了Air32_daplink.hex、DFP.pack等文件;Libraries文件夹保存了Air32标准库;ModuleDemo文件夹保存了BSP例程。
开发环境搭建
开发环境的话目前以Keil为主,参考合宙官方环境搭建,首先进入AIR_Jlink_Keil文件夹中安装DFP.pack
安装成功之后打开Keil.Device,出现如下所示界面表示安装成功
构建Air32F103项目的方法与Stm32相同
参考SDK/ModuleDemo文件夹中的代码开发(其实可以直接用Stm32CBT6的代码跑)。另外需要注意:
- 在C/C++中添加宏USE_STDPERIPH_DRIVER
- core_cm3.h/c的版本较低,因此编译器不能使用Version6,合宙官方那种直接在Keil中添加CMSIS则可以使用Version6
- 开发板默认刷的daplink固件堵住了SWD接口,第一次SWD下载时,下载前先按住开发板复位键,在点击Keil的下载按钮之后立马松开复位键
开发方式总结
- 用合宙官方给的标准库进行开发,也就是笔者上述的开发方式
- 简单粗暴直接使用CubeMX+Keil进行开发
移植FreeRTOS
源码下载
FreeRTOS官方源码下载链接:FreeRTOS
FreeRTOS移植
- 首先在工程文件夹中创建FREERTOS文件夹
- 将下载的源码解压,进入到FreeRTOS文件夹中,将Source文件夹下的内容全部复制到刚刚创建的FREERTOS文件夹
- 把Source/portable文件夹下的MemMang和RVDS文件夹复制到Source目录下,如下图所示,并将Source/portable文件夹中其他内容删除
- 把Source/RVDS/ARM_CM3文件夹下所有的文件复制到RVDS文件下,然后删除Source/RVDS中其他所有的文件夹(注意不要删除了刚刚复制的文件)
- 把保留下来的文件添加到Keil工程中,如下图所示
- 编写代码 -> 开始点灯 -> 成功点亮!
/* include bsp */
#include "led.h"
#include "air32f10x.h"
/* include rtos */
#include "FreeRTOS.H"
#include "task.h"
TaskHandle_t test1Task_Handler;
#define TEST1_TASK_FUNCTION test1Task
#define TEST1_TASK_NAME "test1"
#define TEST1_TASK_STACK 50
#define TEST1_TASK_PRIORITY 1
#define TEST1_TASK_HANDLER test1Task_Handler
void test1Task(void *pvParameters);
TaskHandle_t test2Task_Handler;
#define TEST2_TASK_FUNCTION test2Task
#define TEST2_TASK_NAME "test2"
#define TEST2_TASK_STACK 50
#define TEST2_TASK_PRIORITY 2
#define TEST2_TASK_HANDLER test2Task_Handler
void test2Task(void *pvParameters);
TaskHandle_t test3Task_Handler;
#define TEST3_TASK_FUNCTION test3Task
#define TEST3_TASK_NAME "test3"
#define TEST3_TASK_STACK 50
#define TEST3_TASK_PRIORITY 3
#define TEST3_TASK_HANDLER test3Task_Handler
void test3Task(void *pvParameters);
int main(void)
{
/* initialize hardwares */
LED_Init();
taskENTER_CRITICAL();
/* create task one */
xTaskCreate((TaskFunction_t ) TEST1_TASK_FUNCTION,
(const char* ) TEST1_TASK_NAME,
(uint16_t ) TEST1_TASK_STACK,
(void* ) NULL,
(UBaseType_t ) TEST1_TASK_PRIORITY,
(TaskHandle_t* ) &TEST1_TASK_HANDLER);
/* create task two */
xTaskCreate((TaskFunction_t ) TEST2_TASK_FUNCTION,
(const char* ) TEST2_TASK_NAME,
(uint16_t ) TEST2_TASK_STACK,
(void* ) NULL,
(UBaseType_t ) TEST2_TASK_PRIORITY,
(TaskHandle_t* ) &TEST2_TASK_HANDLER);
/* create task three */
xTaskCreate((TaskFunction_t ) TEST3_TASK_FUNCTION,
(const char* ) TEST3_TASK_NAME,
(uint16_t ) TEST3_TASK_STACK,
(void* ) NULL,
(UBaseType_t ) TEST3_TASK_PRIORITY,
(TaskHandle_t* ) &TEST3_TASK_HANDLER);
taskEXIT_CRITICAL();
vTaskStartScheduler();
return 0;
}
void test1Task(void *pvParameters)
{
/* task one for test */
while (1) {
LED1_Toggle();
vTaskDelay(500);
LED1_Toggle();
vTaskDelay(500);
}
}
void test2Task(void *pvParameters)
{
/* task two for test */
LED2_Toggle();
while (1) {
LED2_Toggle();
vTaskDelay(500);
LED2_Toggle();
vTaskDelay(500);
}
}
void test3Task(void *pvParameters)
{
/* task three for test */
while (1) {
LED3_Toggle();
vTaskDelay(2000);
LED3_Toggle();
vTaskDelay(2000);
}
}
移植过程出现的问题
- 不能勾选Excute-only Code,否则报错
- 资源有限,把FreeRTOS没有用到的功能关闭
- config文件中如下配置,程序卡死在port.c:316的断言中,configASSERT((portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue) == configPRIO_BITS)
#define configPRIO_BITS 4 /* 15 priority levels */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2
#define configKERNEL_INTERRUPT_PRIORITY (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))
#define configMAX_SYSCALL_INTERRUPT_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))
- 调试发现portMAX_PRIGROUP_BITS = 0x07, ulMaxPRIGROUPValue = 0x04,而configPRIO_BITS = 0x04,手动将其加一之后程序能够正常调度(暂不清楚什么原因,能力有限)
/* Check the FreeRTOS configuration that defines the number of
* priority bits matches the number of priority bits actually queried
* from the hardware. */
configASSERT(( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue + 1) == configPRIO_BITS);
写在最后
首先附上Air32F103CBT6移植FreeRTOS代码链接:gitee
git clone https://gitee.com/tjuye9/air32.git
有一说一,这板子玩起来真滴香!