Skip to content

Generate Keil IAR Project via ST CubeMX

realonlyme edited this page Oct 29, 2018 · 5 revisions

EN| 中文

Release Notes:

v0.6.3

  • 支持的APP如下: helloworld, mqttapp, ldapp 

  • 支持生成的工程如下: Keil MDK 5.0, IAR Embedded Workbench for ARM 8.30.1

  • 支持的board如下: developerkit stm32f429zi-nucleo 其它stm32l4系列板卡(使用board template stm32l4universal) 其它stm32f4系列板卡(使用board template stm32f4universal)

注意的是,IAR目前仅支持生成helloworld app,ldapp目前仅适合developerkit

基于mqttapp为例生成STM32F4和STM32L4的Keil工程

STM32F4系列板卡和STM32L4系列板卡生成Keil工程步骤基本一样,仅区别在"配置Keil工程及生成代码"章节。本文以STM32L4系列板卡为例,STM32F4有区别的部分在(配置Keil工程及生成代码)也体现出。

准备材料:

Keil MDK IDE, ST CubeMX Version 4.27.0 或以上版本(官网下载地址https://www.st.com/en/development-tools/stm32cubemx.html) 一块STM32L4系列板卡(本文以NUCLEO-STM32L433RC为例),一块庆科MK3060或3165板卡(已烧录AT固件)

简单介绍

PDSC和PACK是AliOS Things Plugin重要的2个文件,其中PDSC是制作及获取PACK的规则文件,根据PDSC规则将AliOS Things代码,ST CubeMX依赖的配置组(*_Configs.xml和*_Modes.xml)以及一些Doc文件打包就做成了PACK规则文件。 目前打包的AliOS Things位于仓库https://github.com/alibaba/AliOS-Things/tree/developer,每隔一段时间,会将该代码PACK一次制作成的PACK上传至OSS托管服务器供开发者下载,开发者也可以根据PDSC自行制作PACK文件。

安装AliOS Things Plugin最新PACK包

在线下载AliOS Things 针对CubeMX的Plugin PACK的规则文件地址:

https://mirrors.aliyun.com/AliOS-Things/Alibaba.AliOSThings.pdsc 打开CubeMX--菜单栏help--Manage Embedded Software Packages, 在打开的对话框下测选择"from url"--在user Defined Packs Manager对话框--New--填入上述地址,选择"check"

image.png | left | 826x473

check通过点击OK,勾选checkbox,下载该插件。

在线更新AliOS Things PACK包

每次后台有版本升级,用户仍然使用上述连接,操作步骤和上述一致的情况下,会下载到最新版本的PACK包

创建CubeMX工程

  1. 以NUCLEO-STM32L433RC为例创建CubeMX工程

image.png | left | 826x394

  1. 创建工程时提示使用开发板默认配置,这时工程已经创建好UART2口,我们将其作为CLI口,然后选择UART1口作为AT口,如下

image.png | left | 826x519

  1. UART配置界面将所用UART的中断支持都勾选上,将其生成ISR功能反选

image.png | left | 826x510

image.png | left | 826x604

image.png | left | 823x684

选择AliOS Things Plugin 组件

  1. 通过菜单栏Project-- Select Addtinoal Software Components 界面,选择board和example下的应用: board 我们选择"stm32l4xx_universal", examle 我们选择"mqttapp", 并依次勾选这2个component所依赖的组件,我们以"stm32l4xx_universal"为例,点击status 栏的工作图标,我们知道其依赖mcu及sal 2个组件,如下图

image.png | left | 826x509

  1. 选择了stm32l4xx_cube组件之后,我们又发现其依赖很多其他组件,我们将这些组件都勾选上

image.png | left | 798x490

  1. 按照上述步骤将board和example依赖的组件,及其组件依赖的组件全部勾选上,勾选过程中注意下述特定选择:
  • vfs选择"keil"
  • wifi 选择 sal_wifi_mk3060 (如果你使用MK3165或MK3060做上网模块)
  • kv根据实际硬件选择,因为kv操作会占用大量的RAM空间,(需要按片区将数据从flash中拷贝出来,此时申请较大的RAM资源)如果你使用诸如STM32L433系列板卡(RAM只有64KByte),建议暂时不要打开kv,此时选择dummy。如果使用诸如L496(RAM达到128KByte),则可以选择实际的KV功能
  • protocol_linkkit_iotkit有2个选项 w_o_TLS(不使用TLS而是用TCP直连)和withTLS(使用TLS加密策略),同样对于RAM较小的板卡(<128KByte)建议选择w_o_TLS
  • 选择组件的原则一定遵循从board和example 这2个组件网外衍生 只要这2个是绿的 以及这2个依赖的组件也是绿的 以及依赖的依赖是绿的 就可以了,其它没有选择的,即使是工作模式,也是没有关系的
  1. 选择AliOS Things 插件

image.png | left | 713x405

其它设置

  • ProjectSetting--Project--勾选 Do not generate the main()
  • ProjectSetting--Project--Toolchain/IDE 选择MDK-ARM
  • ProjectSetting--Advaced Setting--Generated Function Calls, 取消勾选Visibitity(static)

生成Keil工程

菜单栏Project--Generate Code

配置Keil工程及生成代码

  1. 以生成Keil MDK工程为例, 生成工程一般勾选GNU属性,取消warning警告, 如果是linkkitapp由于有中文 除了选择gnu属性外 需要在misc control里再加上--no_multibyte_chars 请参见下图。如果希望KEIL MDK下编译速度快一些,并且不需要单步调试,可以在编译之前去掉DEBUG信息

image.png | left | 826x561

  1. misc control里添加如下信息,一般用于和云端交互时留下信息,当然你填的内容可以按照你实际板卡去填,格式暂无要求 -DSYSINFO_PRODUCT_MODEL='"ALI_AOS_STM32L432"' -DSYSINFO_DEVICE_NAME='"STM32L432"' 对于STM32F4系列板卡,由于没有默认SRAM1_SIZE_MAX宏,除了以上操作,还需要加-DSRAM1_SIZE_MAX=0x40000(举例)来将板卡RAM大小(举例为256KB)

image.png | left | 826x555

  1. 修改uart口映射关系 在board/stm32l4xx_universal/hal/hal_uart_stm32l4.h中更改如下
#define PORT_UART1 1     /* AT串口会用UART1 * /
#define PORT_UART2 0     /* DEBUG(CLI)串口使用UART2 */

这里我们强调一下,对于AliOS Things,目前逻辑口0专指CLI口,逻辑口1专指AT口。

对于STM32F4系列,可以通过更改board/stm32f4xx_universal/init/board.h中的变量PORT_UART_TYPE及board/stm32f4xx_universal/init/soc_init.c中的UART_MAPPING_TABLE映射表来配置所需要的逻辑串口和对应的物理串口,如下述:

/*############         Logical UART Port Type used in this board  ##############
 * Please keep APP_UART_STD=0 to avoid unexpected error. Other Port value does not 
 * follow special rule.                                   
 #####################################################                  #         */
typedef enum{
    PORT_UART_STD,
    PORT_UART_AT,
    /*PORT_UART_RS485, *///Example.
    PORT_UART_SIZE,
    PORT_UART_INVALID = 255,
}PORT_UART_TYPE;
const UART_MAPPING UART_MAPPING_TABLE[] =
{
    { PORT_UART_STD,     USART3, { USART3_IRQn,  0, 1,UART_OVERSAMPLING_16 } },
    { PORT_UART_AT,      USART6,  { USART6_IRQn , 0, 1,UART_OVERSAMPLING_16 } }
};
  1. 修改board_partion.c文件(STM32L4系列目前叫board.c) Middlewares\Third_Party\AliOSThings\aos\board\stm32l4xx_universal\init\下面有一个board_partition.c这个是默认使用的,适合针对1024KB Flash,假如你手中的CPU flash容量较小,建议将board_partition_256k_flash_template.c中的内容拷贝到board_partition.c使用。当然你也可以直接调整其中的size空间。

  2. 配置GPIO时钟 将CubeMX自动生成的针对GPIO的配置从Application/User/main.c中的MX_GPIO_Init()函数中的下述语句替换到Middlewares\Third_Party\AliOSThings\aos\board\stm32f4xx_universal\init\soc_init.c中的stm32_soc_init()相应位置(覆盖掉stm32_soc_init()中的MX_GPIO_Init()或者*__HAL_RCC_GPIOX_CLK_ENABLE*())。

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOG_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  1. 针对alicrypto模块的特殊配置 假如使用TLS方式上云,则会包含alicrypto模块。由于该模块目前使用了“模块内部路径”,对于Keil工程来讲就是“Group下的路径”,而ST Plugin 不支持此种规则编辑进PDSC文件,因此需要对这个模块进行特殊处理。后期也会进行模块整改,以期去掉这种模块内部路径或者局部路径,在整改之前,可以采用如下work around加入局部路径 ../Middlewares/Third_Party/AliOSThings/aos/security/alicrypto/mbedtls/include/mbedtls ../Middlewares/Third_Party/AliOSThings/aos/security/alicrypto/mbedtls/include :

image.png | left | 827x477

经过以上的配置,应该就可以生成可以运行的BIN。当然如果还想上云,记得修改其中的四元组。目前四元组位于framework\protocol\linkkit\iotkit\sdk-encap\imports\iot_import_product.h

基于helloworld为例生成STM32F4和STM32L4的IAR工程要点

选择AliOS Things Plugin 组件

这里注意的是在选择vfs组件的时候,不要选择"keil"变量,而是IAR变量,如下图

image.png | left | 827x120

其它配置

生成IAR工程的话需要选择Tool Chain 为EWARM

image.png | left | 700x680

配置Keil工程及生成代码

在生成的IAR工程中,对于其中字符串的宏定义需要更改下格式。原格式如下 SYSINFO_APP_VERSION='"app..."' 该格式适合KEIL MDK,但是不适合IAR,需要更改成诸如 SYSINFO_APP_VERSION="app..."

image.png | left | 765x615

添加实际板卡信息,这个步骤在生成Keil工程也有,这里同样有,如下

image.png | left | 761x615

取消掉"Require Prototype" option

image.png | left | 761x615

增加其它编译选项,如下图

image.png | left | 761x615

v0.6.3 已知问题及work around:

STM32F429ZI-Nucleo

生成工程后, 删除掉soc_init.c下述代码

    /*gpio init*/
    brd_gpio_init();
    /*i2c pre init*/
    hal_i2c_pre_init();
    /*default can init*/
    CAN_init();
   /*##-3- Configure the NVIC #################################################*/
  /* NVIC configuration for CAN1 Reception complete interrupt */
    HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
static int32_t brd_gpio_init(void)
{
    int32_t i;
    int32_t ret = 0;
    
    for (i = 0; i < GPIO_TABLE_SZ; ++i) {
        ret = hal_gpio_init(&brd_gpio_table[i]);
        if (ret) {
            printf("gpio %d in gpio table init fail \r\n", i);
        }
    }

    return ret;
   
}
Clone this wiki locally