雅特力AT-START-F437这块板子最吸引我的地方是大sram(高达512KB)、大flash高达(4MB),sram大就是好笔者特喜欢,所以申请了这块板子。顺便同时申请了另外一块据说flash/swd锁死的AT-START-F403A开发板,去雅特力下载AT32F437的datasheet和reference manual同时把AT32F403A的文档也下载下来研究了,还想了几个解锁方法准备一一尝试,但最后好像给了另外一位版友,这是题外话。1月22日板子到手,不得不说板子比我想象的大不少(不知道是不是要把所有针脚全引出的缘故才这么大),是AT系的经典黑白色搭配。
开发板资源简介
MCU是雅特力的AT32F437ZMT7,带FPU的cortex-m4,最高频率可达288MHZ。sram最大可达512KB,flash有4MB之巨。3个i2c, 4个usart, 4个spi控制器,2个usb OTG, 一个以太网EMAC,2个can,2个sdio。说完MCU来看看板载资源:板载一AT-Link省得再外接调试器,板载一以太网口,一颗16MB的nor flash,一usb typeA接口用于OTG1 host,两usb micro接口分别用于usb OTG1和OTG2。可能板子设计年代(两年前?)缘故,还不是typeC口。
开发工具组合
笔者一直用linux做开发环境,这次也不例外。开发环境主要需解决toolchain、工程组织、烧录调试这三大问题。toolchain比较简单,安装arm-none-eabi-gcc即可;工程源码组织准备使用cmake;调试烧录呢准备使用openocd+gdb-multiarch,以笔者经验大部分情况下gdb基本用不上,更喜欢原始的printf
,但是用jtag/swd调试器配合openocd或pyocd看寄存器在mcu开发时还是偶尔用得着的,比如程序跑飞后看看pc等寄存器。openocd/pyocd另外一个主要功能就是烧录固件,pyocd下载厂商的对应pack文件即可,openocd需要自己适配flash烧录算法,一般而言做mcu的openocd flash烧录算法还是需要一番功夫的,好在雅特力官方其实做了openocd的支持,其代码仓库在
https://github.com/ArteryTek/openocd
git clone后编译即可,并不复杂,在linux下编译openocd尤其方便,这里不再赘述。
Firmware Library
AT32F437的Firmware Library可从雅特力官网下载,笔者用的是最新的版本
CMakeLists.txt
接下来就是书写CMakeLists.txt了,CMakeLists书写这也是套路的,照着一些模板或者其它MCU用的改>一改就可以用了,只要注意两点:CPU是cortex-m4且带浮点,所以-mcpu,-mfloat-abi与-mfpu等CFLAGS不要写错了;二笔者发现雅特力的Firmware Library期望有MCU与开发板的一些宏定义比如AT32F437ZMT7与AT_START_F437_V1。最后笔者的点灯用例的CMakeLists如下
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
cmake_minimum_required(VERSION 3.20)
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
add_compile_options(-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16)
add_compile_options(-ffunction-sections -fdata-sections -fno-builtin -fno-common -Wall -Wshadow -Wdouble-promotion -Werror -Wno-unused-parameter)
add_compile_options(-O3)
project(at32f437 C ASM)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_STANDARD 99)
include_directories(libraries/cmsis/cm4/core_support
libraries/cmsis/cm4/device_support
libraries/cmsis/dsp/include
libraries/drivers/inc
project/at_start_f437/examples/gpio/led_toggle/inc
project/at32f435_437_board)
add_definitions(-DAT32F437ZMT7 -DAT_START_F437_V1)
file(GLOB_RECURSE SOURCES
"project/at32f435_437_board/at32f435_437_board.c"
"project/at_start_f437/examples/gpio/led_toggle/src/*.c"
"libraries/drivers/src/*.c"
"libraries/cmsis/cm4/device_support/system_at32f435_437.c"
"libraries/cmsis/cm4/device_support/startup/gcc/startup_at32f435_437.s"
)
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/libraries/cmsis/cm4/device_support/startup/gcc/linker/AT32F437xM_FLASH.ld)
add_link_options(
-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
-Wl,--gc-sections,--print-memory-usage,-Map,${PROJECT_NAME}.map
--specs=nano.specs
--specs=nosys.specs)
add_link_options(-T ${LINKER_SCRIPT})
add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})
# target_link_libraries(${PROJECT_NAME}.elf printfloat)
set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
set(LST_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.lst)
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
COMMAND ${CMAKE_OBJDUMP} --all-headers --demangle --disassemble $<TARGET_FILE:${PROJECT_NAME}.elf> > ${LST_FILE}
COMMAND ${SIZE} --format=berkeley $<TARGET_FILE:${PROJECT_NAME}.elf>
)
测试代码
板子拿到手感觉应该还是出厂时的固件,三LED轮流闪烁,挺奇怪的难道前面的版友寄回开发板时又恢复flash固件了?咱把官方的点灯代码改一改以测试openocd烧录是否正常:
int main(void)
{
system_clock_config();
at32_board_init();
uart_print_init(115200);
printf("Hello AT32F437\r\n");
while(1)
{
at32_led_toggle(LED2);
delay_ms(200);
at32_led_toggle(LED3);
delay_ms(200);
at32_led_toggle(LED4);
delay_ms(200);
}
}
编译
cmake -B build
cmake --build build -j8
在build目录即有at32f437.bin文件生成,烧录到板子即可
openocd烧录
openocd -f interface/cmsis-dap.cfg -f target/at32f437xM_qspi.cfg -c "program build/at32f437.bin verify reset exit 0x8000000"
运行结果
串口有Hello AT32F437打印,三个LED交互闪烁,说明固件成功烧录了。