AIR32F103环境搭建和移植FreeRTOS

Air32F103开发环境搭建、移植FreeRTOS

  • 环境搭建
      • Air32F103介绍
      • SDK下载
      • 开发环境搭建
      • 开发方式总结
  • 移植FreeRTOS
      • 源码下载
      • 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例程。
AIR32F103环境搭建和移植FreeRTOS_第1张图片

开发环境搭建

开发环境的话目前以Keil为主,参考合宙官方环境搭建,首先进入AIR_Jlink_Keil文件夹中安装DFP.pack
AIR32F103环境搭建和移植FreeRTOS_第2张图片

安装成功之后打开Keil.Device,出现如下所示界面表示安装成功
AIR32F103环境搭建和移植FreeRTOS_第3张图片

构建Air32F103项目的方法与Stm32相同
AIR32F103环境搭建和移植FreeRTOS_第4张图片
参考SDK/ModuleDemo文件夹中的代码开发(其实可以直接用Stm32CBT6的代码跑)。另外需要注意:

  1. 在C/C++中添加宏USE_STDPERIPH_DRIVER
  2. core_cm3.h/c的版本较低,因此编译器不能使用Version6,合宙官方那种直接在Keil中添加CMSIS则可以使用Version6
  3. 开发板默认刷的daplink固件堵住了SWD接口,第一次SWD下载时,下载前先按住开发板复位键,在点击Keil的下载按钮之后立马松开复位键

开发方式总结

  1. 用合宙官方给的标准库进行开发,也就是笔者上述的开发方式
  2. 简单粗暴直接使用CubeMX+Keil进行开发

移植FreeRTOS

源码下载

FreeRTOS官方源码下载链接:FreeRTOS

FreeRTOS移植

  1. 首先在工程文件夹中创建FREERTOS文件夹
  2. 将下载的源码解压,进入到FreeRTOS文件夹中,将Source文件夹下的内容全部复制到刚刚创建的FREERTOS文件夹
  3. 把Source/portable文件夹下的MemMang和RVDS文件夹复制到Source目录下,如下图所示,并将Source/portable文件夹中其他内容删除
    AIR32F103环境搭建和移植FreeRTOS_第5张图片
  4. 把Source/RVDS/ARM_CM3文件夹下所有的文件复制到RVDS文件下,然后删除Source/RVDS中其他所有的文件夹(注意不要删除了刚刚复制的文件)
    AIR32F103环境搭建和移植FreeRTOS_第6张图片
  5. 把保留下来的文件添加到Keil工程中,如下图所示
    AIR32F103环境搭建和移植FreeRTOS_第7张图片
  6. 编写代码 -> 开始点灯 -> 成功点亮!
/* 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);
	}
}

移植过程出现的问题

  1. 不能勾选Excute-only Code,否则报错
  2. 资源有限,把FreeRTOS没有用到的功能关闭
  3. 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))
  1. 调试发现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

有一说一,这板子玩起来真滴香!

你可能感兴趣的:(mcu,rtos,单片机,stm32,嵌入式硬件)