Building STM32F4 firmware with cmake (armclang)
使用CMake与Armclang构建STM32F411固件
Armcc支持已移除,但命令和测试结果仍旧保留,若有需求提issue
测试通过C&C++混合编程的编译及下载运行
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_gpio.h"
#ifdef __cplusplus
extern "C"
{
#endif
int main_cpp(void);
#ifdef __cplusplus
}
#endif
int main_cpp(void){
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
HAL_Delay(1000);
return 0;
}
....
extern int main_cpp(void);
//!已移出CubeMX的匹配字符串!
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
while (1) {
main_cpp();
}
}
....
编译与链接参数建议基于Keil工程选项调整
参考文件使用Keil内置编译器,位于 Keil5安装目录\ARM\ARMCLANG\bin
也可自定义编译器路径,但编译器必须授权才可用
set(KEIL_PATH C:/Keil_v5)
set(ARMCC_PATH ${KEIL_PATH}/ARM/ARMCC/bin)
set(ARMCLANG_PATH ${KEIL_PATH}/ARM/ARMCLANG/bin)
set(LINK_SCT_FILE ../templete.sct)
该文件定义RAM与ROM的启址及大小,相同晶圆不同引脚封装的MCU应该是通用的。
add_compile_definitions(USE_HAL_DRIVER STM32F411xE)
include_directories(...)
file(...)
模板内使用的是懒人写法自动搜索源文件
但建议实际使用把这堆删了换成具体定义的源文件列表
因为CubeMX复制到工程的文件可能会影响编译,例如stm32f4xx_hal_msp_template.c以及其他*_template.c
set(C_CXX_COMPILE_OPTIONS ...)
set(ASM_COMPILE_OPTIONS ...)
set(LINK_EXECUTABLE "${LINKER} ...")
cmake
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_MAKE_PROGRAM=PATH(mingw32-make)
-DCMAKE_C_COMPILER=PATH(armclang)
-DCMAKE_CXX_COMPILER=PATH(armclang)
-G "MinGW Makefiles"
-S PATH(Project)
-B PATH(Project/.armclang)
cmake--build PATH(Project/.armcc or Project/.armcc) --target template.axf -- -j 12
cmake--build PATH(Project/.armcc or Project/.armclang) --target template.axf -- -j 12



