程序适配

通过文档指引,将开发板现有程序进行GEEKROS的移植适配。

下载程序模板

GEEKROS提供了一个基础的程序源码包模板,可以在这个基础上结合接入规范进行现有程序的移植。

🪧 模板仓库地址

你可以前往 board_base_templateopen in new window 下载程序模板。

程序模板目录结构

根据程序模板的目录结构说明将现有开发板程序移植到相应的目录中。

├─.robotchain
│  ├─config.robotchain <!--程序配置文件-->
├─block
│  ├─app.block <!--图形化编程主程序-->
├─hardware
│  ├─app
│  │  ├─inc
│  │  ├─src
│  │  │  ├─app.c <!--固件应用编程主程序-->
│  ├─main
│  │  ├─inc
│  │  ├─src
│  │  │  ├─main.c
│  │  │  ├─module.c
│  │  │  ├─utils.c
│  ├─robot <!--放置通用机器人算法-->
│  │  ├─inc
│  │  ├─src
│  ├─module <!--放置开发板外设模块-->
│  │  ├─inc
│  │  ├─src
│  ├─mcu
│  │  ├─core
│  │  ├─driver
│  │  ├─usb
│  │  ├─flash.ld <!--GCC编译所需的LD链接脚本文件-->
│  │  ├─gcc_startup.s <!--GCC编译所需的.s启动文件-->
│  │  ├─keil_startup.s <!--Keil开发环境所需的.s启动文件-->
│  ├─system <!--FreeRTOS资源-->
│  ├─utils <!--常用的工具-->
│  │  ├─inc
│  │  ├─src
├─software
│  ├─app.py <!--Python编程主程序-->
├─keil <!--Keil开发环境资源,不会在ToolsChain开发工具中显示-->

移植适配

STM32F103RCT6为例作为参考进行程序的移植和适配,其他芯片步骤基本一致。

芯片资源移植

推荐使用标准库(Standard Library)构建开发板程序,按照下面的步骤移植相应的资源到程序模板中。

芯片标准库程序模板
Libraries/STM32F10x_StdPeriph_Driver/inchardware/mcu/driver/inc
Libraries/STM32F10x_StdPeriph_Driver/srchardware/mcu/driver/src
Libraries/CMSIS/CM3/CoreSupport/core_cm3.chardware/mcu/core/src
Libraries/CMSIS/CM3/CoreSupport/core_cm3.hhardware/mcu/core/inc
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.hhardware/mcu/core/inc
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.hhardware/mcu/core/inc
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.chardware/mcu/core/src
Project/STM32F10x_StdPeriph_Template/system_stm32f10x.chardware/mcu/core/src
Project/STM32F10x_StdPeriph_Template/stm32f10x_it.chardware/mcu/core/src
Project/STM32F10x_StdPeriph_Template/stm32f10x_conf.hhardware/mcu/core/inc
Project/STM32F10x_StdPeriph_Template/stm32f10x_it.hhardware/mcu/core/inc

标准库启动文件的移植需要根据芯片进行选择并区分GCCKeil环境,这里选择大容量的启动文件。

芯片标准库程序模板
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.shardware/mcu/gcc_startup.s
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.shardware/mcu/keil_startup.s

标准库链接脚本的移植需要根据芯片进行选择,这里选择大容量的启动文件,仅GCC编译环境需要。

芯片标准库程序模板
Project/STM32F10x_StdPeriph_Template/TrueSTUDIO/STM3210E-EVAL/stm32_flash.ldhardware/mcu/flash.ld

外设模块资源移植

外设模块是指基于标准库实现的相关开发板接口控制程序,将相应的.c.h文件按照下面示例进行移植。

现有外设程序程序模板
led.chardware/module/src/led.c
led.hhardware/module/inc/led.h
key.chardware/module/src/key.c
key.hhardware/module/inc/key.h
can.chardware/module/src/can.c
can.hhardware/module/inc/can.h
...hardware/module/src/
...hardware/module/inc/

工具类模块资源移植

工具类中间件是指一些通用的函数等程序,例如:PID、CJson、Delay等,将相应的.c.h文件按照下面示例进行移植。

现有外设程序程序模板
cjson.chardware/utils/src/cjson.c
cjson.hhardware/utils/inc/cjson.h
delay.chardware/utils/src/delay.c
delay.hhardware/utils/inc/delay.h
...hardware/utils/src/
...hardware/utils/inc/

USB模块资源移植

GEEKROS生态中的多模块之间的通讯主要以USB虚拟串口的形式,需要你的开发板开放了相应的接口,将相应的USB库移植到下面的目录中。

🎯 不同芯片的USB Device Library的下载地址:

# STM32F105xx, STM32F107xx, STM32F2xx、 STM32F4xx
https://www.st.com/en/embedded-software/stsw-stm32046.html
# STM32F10x, STM32L1xx、 STM32F3xx
https://www.st.com/en/embedded-software/stsw-stm32121.html
# STM32F0x2xx
https://www.st.com/en/embedded-software/stsw-stm32092.html
USB库文件程序模板
...hardware/mcu/usb

FreeRTOS资源移植

推荐使用FreeRTOS作为实时内核进行多任务的调度和管理,这里提供比较通用的适配方式。

✨ 1、在stm32****_it.h头文件中引入FreeRTOS资源。

#include "FreeRTOS.h"
#include "task.h"

✨ 2、在stm32f10x_it.c源文件中声明xPortSysTickHandler函数。

extern void xPortSysTickHandler(void);

✨ 3、在stm32f10x_it.c源文件中注释掉SVC_HandlerPendSV_Handler函数。

...
/**
  * @brief  This function handles SVCall exception.
  * @param  None
  * @retval None
  */
//void SVC_Handler(void)
//{
//}
...
/**
  * @brief  This function handles PendSVC exception.
  * @param  None
  * @retval None
  */
//void PendSV_Handler(void)
//{
//}
...

✨ 4、在stm32f10x_it.c源文件中修改SysTick_Handler函数并新增Get_SysTick函数。

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
volatile uint32_t ms_ticks = 0;
void SysTick_Handler(void)
{
	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
	{
		xPortSysTickHandler();
	}else{
		ms_ticks++;
	}
}

uint32_t Get_SysTick(void)
{
	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
	{
		return xTaskGetTickCount();
	}
	else
	{
		return ms_ticks;
	}
}

✨ 5、在stm32f10x_it.h头文件中进行一下修改。

void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
//void SVC_Handler(void); # 注释掉
void DebugMon_Handler(void);
//void PendSV_Handler(void); # 注释掉
void SysTick_Handler(void);
// 新增
uint32_t Get_SysTick(void);

更新程序配置文件

配置一些程序的描述信息,以下只是举例,需根据实际情况调整。

{
    "type": "board",
    "title": "robot_ai_board", <!--程序软件包名称-->
    "describe": "三合一机器人主控开发板开源程序包", <!--程序软件包描述-->
    "document": {
        "git": "https://github.com/geekros/robot_ai_board", <!--源码仓库地址-->
        "wiki": "https://www.geekros.com/documentation" <!--开发文档地址-->
    },
    "version": "1.0.0", <!--版本号-->
    "Kernel": "cortex-m3", <!--芯片处理器内核-->
    "define": [ <!--同Keil中的Define-->
        "USE_STDPERIPH_DRIVER",
        "STM32F10X_HD",
        "USE_STM3210E_EVAL"
    ],
    "source": [ <!--需要编译的.c源文件或目录相对路径,支持*通配符-->
        "../hardware/app/src/*.c",
        "../hardware/main/src/*.c",
        "../hardware/module/src/*.c",
        "../hardware/utils/src/*.c",
        "../hardware/mcu/core/src/*.c",
        "../hardware/mcu/driver/src/*.c",
        "../hardware/system/*.c",
        "../hardware/system/portable/GCC/ARM_CM3/port.c",
        "../hardware/system/portable/MemMang/heap_4.c"
    ],
    "include": [ <!--需要编译的.h源文件目录相对路径-->
        "../hardware/app/inc",
        "../hardware/main/inc",
        "../hardware/module/inc",
        "../hardware/utils/inc",
        "../hardware/mcu/core/inc",
        "../hardware/mcu/driver/inc",
        "../hardware/system/include",
        "../hardware/system/portable/GCC/ARM_CM3"
    ],
    "exclude": [ <!--需要排除不编译的.c源文件-->
        "../hardware/mcu/driver/src/stm32f4xx_fsmc.c"
    ]
}

Keil工程的兼容

如果需要为用户提供Keil开发环境编程的支持,可以按照下面的项目结构配置Keil工程项目。