-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Generate Keil IAR Project via ST CubeMX
EN| 中文
-
支持的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
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文件。
https://mirrors.aliyun.com/AliOS-Things/Alibaba.AliOSThings.pdsc 打开CubeMX--菜单栏help--Manage Embedded Software Packages, 在打开的对话框下测选择"from url"--在user Defined Packs Manager对话框--New--填入上述地址,选择"check"
check通过点击OK,勾选checkbox,下载该插件。
每次后台有版本升级,用户仍然使用上述连接,操作步骤和上述一致的情况下,会下载到最新版本的PACK包
- 以NUCLEO-STM32L433RC为例创建CubeMX工程
- 创建工程时提示使用开发板默认配置,这时工程已经创建好UART2口,我们将其作为CLI口,然后选择UART1口作为AT口,如下
- UART配置界面将所用UART的中断支持都勾选上,将其生成ISR功能反选
- 通过菜单栏Project-- Select Addtinoal Software Components 界面,选择board和example下的应用: board 我们选择"stm32l4xx_universal", examle 我们选择"mqttapp", 并依次勾选这2个component所依赖的组件,我们以"stm32l4xx_universal"为例,点击status 栏的工作图标,我们知道其依赖mcu及sal 2个组件,如下图
- 选择了stm32l4xx_cube组件之后,我们又发现其依赖很多其他组件,我们将这些组件都勾选上
- 按照上述步骤将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个依赖的组件也是绿的 以及依赖的依赖是绿的 就可以了,其它没有选择的,即使是工作模式,也是没有关系的
- 选择AliOS Things 插件
- ProjectSetting--Project--勾选 Do not generate the main()
- ProjectSetting--Project--Toolchain/IDE 选择MDK-ARM
- ProjectSetting--Advaced Setting--Generated Function Calls, 取消勾选Visibitity(static)
菜单栏Project--Generate Code
- 以生成Keil MDK工程为例, 生成工程一般勾选GNU属性,取消warning警告, 如果是linkkitapp由于有中文 除了选择gnu属性外 需要在misc control里再加上--no_multibyte_chars 请参见下图。如果希望KEIL MDK下编译速度快一些,并且不需要单步调试,可以在编译之前去掉DEBUG信息
- misc control里添加如下信息,一般用于和云端交互时留下信息,当然你填的内容可以按照你实际板卡去填,格式暂无要求 -DSYSINFO_PRODUCT_MODEL='"ALI_AOS_STM32L432"' -DSYSINFO_DEVICE_NAME='"STM32L432"' 对于STM32F4系列板卡,由于没有默认SRAM1_SIZE_MAX宏,除了以上操作,还需要加-DSRAM1_SIZE_MAX=0x40000(举例)来将板卡RAM大小(举例为256KB)
- 修改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 } }
};
-
修改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空间。
-
配置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();
- 针对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 :
经过以上的配置,应该就可以生成可以运行的BIN。当然如果还想上云,记得修改其中的四元组。目前四元组位于framework\protocol\linkkit\iotkit\sdk-encap\imports\iot_import_product.h
这里注意的是在选择vfs组件的时候,不要选择"keil"变量,而是IAR变量,如下图
生成IAR工程的话需要选择Tool Chain 为EWARM
在生成的IAR工程中,对于其中字符串的宏定义需要更改下格式。原格式如下 SYSINFO_APP_VERSION='"app..."' 该格式适合KEIL MDK,但是不适合IAR,需要更改成诸如 SYSINFO_APP_VERSION="app..."
添加实际板卡信息,这个步骤在生成Keil工程也有,这里同样有,如下
取消掉"Require Prototype" option
增加其它编译选项,如下图
生成工程后, 删除掉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;
}
| Home | Tutorial | Hardware | Porting Guide | Utilities | API Reference | Technical Docs | Certification |
Crafted with ❤️ by AliOS Things Team.