[活动专区] 【AT-START-L021 测评】Linux下开发环境搭建(cmake+gcc+openocd)与点灯

[复制链接]
1697|0
 楼主| xhackerustc 发表于 2024-12-1 20:43 | 显示全部楼层 |阅读模式
概述
开发板很漂亮,AT系的经典黑白色搭配。笔者一直是linux下开发,这次也不例外,但相对于以前用cmake+gcc+pyocd组合https://bbs.21ic.com/icview-3374312-1-1.html,这次换个花样,改用cmake+gcc+openocd。pyocd最大的优点是能利用Keil的现成pack,但弱点也很明显不支持板级扩展的nor flash烧写,而openocd在编写适当算法支持后,MCU内置flash和板级扩展的flash都能支持。另外openocd的速度天然比pycod快。一般而言做mcu的openocd flash烧录算法还是需要一番功夫的,好在AT官方其实做了openocd的支持,其代码仓库在
  1. https://github.com/ArteryTek/openocd
clone后编译即可,并不复杂,这里不再赘述

PS:其实笔者有个梦想--openocd一统浆糊。事实上笔者也是这么做的,自己维护了一个openocd仓库,把各家MCU的支持都合在一起了,这样编译出来的openocd可以用于笔者所用到的所有MCU。


Firmware Library
AT32L021的Firmware Library请从雅特力官方下载。

CMakeLists.txt
接下来就是书写CMakeLists.txt了,基于AT32F405改一改就可以用了,只是要注意CPU从cortex-m4变成
了cortex-m0+,除此以外就是一些宏定义,比如AT32F405RCT7_7改成AT32L021C8T7,AT_START_F405_V1改成AT_START_L021_V1,最后做好目录文件的一些变动,最后笔者的点灯用例的CMakeLists如下
  1. set(CMAKE_SYSTEM_NAME Generic)
  2. set(CMAKE_SYSTEM_VERSION 1)
  3. set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
  4. cmake_minimum_required(VERSION 3.20)

  5. set(CMAKE_C_COMPILER arm-none-eabi-gcc)
  6. set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
  7. set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
  8. set(CMAKE_AR arm-none-eabi-ar)
  9. set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
  10. set(CMAKE_OBJDUMP arm-none-eabi-objdump)
  11. set(SIZE arm-none-eabi-size)

  12. set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  13. set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  14. set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  15. set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

  16. add_compile_options(-mthumb -mcpu=cortex-m0plus -mfloat-abi=soft)
  17. add_compile_options(-ffunction-sections -fdata-sections -fno-builtin -fno-common -Wall -Wshadow -Wdouble-promotion -Werror -Wno-unused-parameter)

  18. add_compile_options(-O3)

  19. project(at32l021 C ASM)
  20. set(CMAKE_CXX_STANDARD 11)
  21. set(CMAKE_C_STANDARD 99)

  22. include_directories(libraries/cmsis/cm0plus/core_support
  23.                     libraries/cmsis/cm0plus/device_support/
  24.                     libraries/drivers/inc/
  25.                     project/at32l021_board/
  26.                     project/at_start_l021/examples/gpio/led_toggle/inc)

  27. add_definitions(-DAT32L021C8T7 -DAT_START_L021_V1)

  28. file(GLOB_RECURSE SOURCES
  29.                 "project/at32l021_board/at32l021_board.c"
  30.                 "project/at_start_l021/examples/gpio/led_toggle/src/*.c"
  31.                 "libraries/drivers/src/*.c"
  32.                 "libraries/cmsis/cm0plus/device_support/system_at32l021.c"
  33.                 "libraries/cmsis/cm0plus/device_support/startup/gcc/startup_at32l021.s"
  34.                 )

  35. set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/libraries/cmsis/cm0plus/device_support/startup/gcc/linker/AT32L021x8_FLASH.ld)
  36. add_link_options(
  37.                 -mthumb -mcpu=cortex-m0plus -mfloat-abi=soft
  38.                 -Wl,--gc-sections,--print-memory-usage,-Map,${PROJECT_NAME}.map
  39.                 --specs=nano.specs
  40.                 --specs=nosys.specs)
  41. add_link_options(-T ${LINKER_SCRIPT})

  42. add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})

  43. set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
  44. set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
  45. set(LST_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.lst)
  46. add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
  47.         COMMAND ${CMAKE_OBJCOPY} -Oihex lt;TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
  48.         COMMAND ${CMAKE_OBJCOPY} -Obinary lt;TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
  49.         COMMAND ${CMAKE_OBJDUMP} --all-headers --demangle --disassemble lt;TARGET_FILE:${PROJECT_NAME}.elf> > ${LST_FILE}
  50.         COMMAND ${SIZE} --format=berkeley lt;TARGET_FILE:${PROJECT_NAME}.elf>
  51. )

测试代码
把官方的点灯改一改以测试openocd烧录正常:
  1. int main(void)
  2. {
  3.   system_clock_config();

  4.   at32_board_init();

  5.   uart_print_init(115200);
  6.   printf("Hello AT32L021\r\n");
  7.   while(1)
  8.   {
  9.     at32_led_toggle(LED2);
  10.     delay_ms(200);
  11.     at32_led_toggle(LED3);
  12.     delay_ms(200);
  13.     at32_led_toggle(LED4);
  14.     delay_ms(200);
  15.   }
  16. }



openocd烧录
  1. openocd -f interface/cmsis-dap.cfg -f target/at32l021xx.cfg -c "program build/at32l021.bin verify reset exit 0x8000000"


运行结果
串口有Hello AT32L021打印,三个LED交互闪烁,说明固件成功烧录了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

166

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部