返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[活动] 【APM32F411V Tiny Board测评】linux下开发环境(gcc+makefile+pyocd)搭建&点灯

[复制链接]
1910|5
 楼主| xhackerustc 发表于 2024-5-5 11:31 | 显示全部楼层 |阅读模式
本帖最后由 xhackerustc 于 2024-5-5 20:08 编辑

本人习惯于linux下做开发,平时的工作流程是vim写代码,make/cmake等工具配置gcc/clang工具链编译,uboot或openocd/pyocd烧录。顺着【AT-START-F405测评】linux下pyocd+cmake环境搭建并点灯+printf uart输出组建开发环境已经非常方便,下面说说APM32f411V特别的地方或者说需要在已有linux开发环境基础上再做什么即可搭建用于APM32F411V的开发环境。

pyocd的适用于APM32F411V的pack的安装
  1. pyocd pack find apm32f411
上述命令目前是返回“找不到pack的”,但是再缩小范围比如apm32f可以找到apm32f407之类的。
  1. 0000716 W No matching devices. Please make sure the pack index is up to date. [pack_cmd]
这说明APM32F411比较新,官方还未上传pack到Keil,那么就需要手动下载pack包并管理。笔者在apm官网下载到了SDK压缩包,解压SDK后其中Package目录里就有名为Geehy.APM32F4xx_DFP.1.0.4.pack文件,把它拷贝到~/.local/share/cmsis-pack-manager/apm32/即可。

在SDK解压top目录中写一份pyocd.yaml告诉pyocd到哪里找pack文件:
  1. pack:
  2.   - ~/.local/share/cmsis-pack-manager/apm32/Geehy.APM32F4xx_DFP.1.0.4.pack
这时把板子swd调试器的usb typec接上电脑,如下命令试试:
  1. pyocd cmd -t apm32f411ve
1.jpg
pyocd显示lockup,猜测大概率是由于板子未烧录任何固件导致的,先停下cpu打印下cpu寄存器看看
2.jpg
看看lr、rN、pc和xpsr这些寄存器的值基本上肯定是板子默认没固件的。不过这也说明pyocd可以和板子交互了

Makefile模板的编写
这次咱们选直接写Makefile。观察sdk目录,可以发现:驱动都在Libraries/APM32F4xx_StdPeriphDriver/目录中,Boards/Board_APM32F411_TINY/是板级资源定义和适配,而Libraries/Device/Geehy/APM32F4xx/Source/gcc目录是启动汇编代码和ld脚本,Examples目录是示例代码。这次咱们就以Examples/GPIO/GPIO_Toggle/为基础来点灯吧。

有了以上观察后书写完整Makefile如下:
  1. ######################################
  2. # target
  3. ######################################
  4. TARGET = apm32f411

  5. ######################################
  6. # building variables
  7. ######################################
  8. # debug build?
  9. DEBUG = 0
  10. # optimization for size, enable lto
  11. OPT = -Os -flto


  12. #######################################
  13. # paths
  14. #######################################
  15. # Build path
  16. BUILD_DIR = build

  17. ######################################
  18. # source
  19. ######################################
  20. # C sources
  21. C_SOURCES = $(wildcard Libraries/APM32F4xx_StdPeriphDriver/src/*.c)
  22. C_SOURCES += $(wildcard Boards/Board_APM32F411_TINY/src/*.c)
  23. C_SOURCES += $(wildcard Examples/GPIO/GPIO_Toggle/Source/*.c)

  24. # ASM sources
  25. ASM_SOURCES = Libraries/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S

  26. # AS includes
  27. AS_INCLUDES =

  28. # C includes
  29. C_INCLUDES = -ILibraries/APM32F4xx_StdPeriphDriver/inc
  30. C_INCLUDES += -ILibraries/Device/Geehy/APM32F4xx/Include
  31. C_INCLUDES += -ILibraries/CMSIS/Include/
  32. C_INCLUDES += -IBoards/
  33. C_INCLUDES += -IBoards/Board_APM32F411_TINY/inc/
  34. C_INCLUDES += -IExamples/GPIO/GPIO_Toggle/Include

  35. C_DEFS := -DAPM32F411 -DAPM32F411_TINY

  36. #######################################
  37. # binaries
  38. #######################################
  39. PREFIX = arm-none-eabi-

  40. CC = $(PREFIX)gcc
  41. AS = $(PREFIX)gcc -x assembler-with-cpp
  42. CP = $(PREFIX)objcopy
  43. SZ = $(PREFIX)size

  44. HEX = $(CP) -O ihex
  45. BIN = $(CP) -O binary -S

  46. #######################################
  47. # CFLAGS
  48. #######################################
  49. # cpu
  50. CPU = -mthumb -mcpu=cortex-m4
  51. FPU = -mfloat-abi=hard
  52. FLOAT-ABI = -mfloat-abi=hard

  53. # mcu
  54. MCU = $(CPU) $(FPU) $(FLOAT-ABI)

  55. # compile gcc flags
  56. ASFLAGS = $(MCU) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

  57. CFLAGS = $(MCU) $(C_INCLUDES) $(OPT) $(C_DEFS) -Wall -fdata-sections -ffunction-sections

  58. ifeq ($(DEBUG), 1)
  59. CFLAGS += -g -gdwarf-2
  60. endif


  61. # Generate dependency information
  62. CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"


  63. #######################################
  64. # LDFLAGS
  65. #######################################
  66. # link script
  67. LDSCRIPT = Libraries/Device/Geehy/APM32F4xx/Source/gcc/APM32F4xxxE_FLASH.ld

  68. # libraries
  69. LIBS = -lc -lm -lnosys
  70. LIBDIR =
  71. LDFLAGS = $(MCU) -fsigned-char -ffunction-sections -fdata-sections -Wunused -Wuninitialized -T $(LDSCRIPT) -Wl,--gc-sections,--print-memory-usage,-Map=$(BUILD_DIR)/$(TARGET).map --specs=nano.specs $(LIBS) -flto -fuse-linker-plugin

  72. # default action: build all
  73. all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin


  74. #######################################
  75. # build the application
  76. #######################################
  77. # list of objects
  78. OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
  79. vpath %.c $(sort $(dir $(C_SOURCES)))

  80. # list of ASM program objects
  81. OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.S=.o)))
  82. vpath %.S $(sort $(dir $(ASM_SOURCES)))

  83. $(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
  84.         $(CC) -c $(CFLAGS) [        DISCUZ_CODE_49        ]lt; -o $@

  85. $(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR)
  86.         $(AS) -c $(CFLAGS) [        DISCUZ_CODE_49        ]lt; -o $@
  87. #$(LUAOBJECTS) $(OBJECTS)
  88. $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
  89.         $(CC) $(OBJECTS) $(LDFLAGS) -o $@
  90.         $(SZ) $@

  91. $(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
  92.         $(HEX) [        DISCUZ_CODE_49        ]lt; $@

  93. $(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
  94.         $(BIN) [        DISCUZ_CODE_49        ]lt; $@

  95. $(BUILD_DIR):
  96.         mkdir $@

  97. #######################################
  98. # Program
  99. #######################################
  100. flash: $(BUILD_DIR)/$(TARGET).bin
  101.         pyocd load -e sector -t apm32f411vc $(BUILD_DIR)/$(TARGET).bin

  102. #######################################
  103. # clean up
  104. #######################################
  105. clean:
  106.         -rm -fR $(BUILD_DIR)

  107. #######################################
  108. # dependencies
  109. #######################################
  110. -include $(wildcard $(BUILD_DIR)/*.d)

编译过程发现sdk的一些问题
1.源码中apm32f4xx_sdio.h写成了apm32f4Xx_sdio.h,apm32f4xx_rcm.h写成了apm32f4Xx_rcm.h
对于区分文件大小写的文件系统来说编译会报错,修正补丁如下:
  1. diff --git a/Boards/Board_APM32F411_TINY/inc/Board_APM32F411_TINY.h b/Boards/Board_APM32F411_TINY/inc/Board_APM32F411_TINY.h
  2. index a4aac67..197b89f 100644
  3. --- a/Boards/Board_APM32F411_TINY/inc/Board_APM32F411_TINY.h
  4. +++ b/Boards/Board_APM32F411_TINY/inc/Board_APM32F411_TINY.h
  5. @[url=home.php?mod=space&uid=72445]@[/url] -40,7 +40,7 @@
  6. #include "apm32f4xx_misc.h"
  7. #include "apm32f4xx_syscfg.h"
  8. #include "apm32f4xx_dma.h"
  9. -#include "apm32f4Xx_sdio.h"
  10. +#include "apm32f4xx_sdio.h"
  11. #include "apm32f4xx_dci.h"

  12. /** @addtogroup Board
  13. diff --git a/Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_sdio.c b/Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_sdio.c
  14. index 8feb411..378dc5b 100644
  15. --- a/Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_sdio.c
  16. +++ b/Libraries/APM32F4xx_StdPeriphDriver/src/apm32f4xx_sdio.c
  17. @[url=home.php?mod=space&uid=72445]@[/url] -23,8 +23,8 @@
  18.   *  and limitations under the License.
  19.   */

  20. -#include "apm32f4Xx_sdio.h"
  21. -#include "apm32f4Xx_rcm.h"
  22. +#include "apm32f4xx_sdio.h"
  23. +#include "apm32f4xx_rcm.h"

  24. /** @addtogroup APM32F4xx_StdPeriphDriver
  25.    @{
2. 目录中"\"与"/"
“/"win和 *nix系统都能用,而"\"只有win能识别,所以建议补丁如下:
  1. diff --git a/Boards/Board.h b/Boards/Board.h
  2. index 87a4b77..7e026e9 100644
  3. --- a/Boards/Board.h
  4. +++ b/Boards/Board.h
  5. @[url=home.php?mod=space&uid=72445]@[/url] -29,16 +29,16 @@

  6. /* Includes */
  7. #if defined (APM32F407_MINI)
  8. -#include "Board_APM32F407_MINI\inc\Board_APM32F407_MINI.h"
  9. +#include "Board_APM32F407_MINI/inc/Board_APM32F407_MINI.h"^M

  10. #elif defined (APM32F407_ELE_HUETB)
  11. -#include "Board_APM32F407_ELE_HUETB\inc\Board_APM32F407_ELE_HUETB.h"
  12. +#include "Board_APM32F407_ELE_HUETB/inc/Board_APM32F407_ELE_HUETB.h"^M

  13. #elif defined (APM32F407_TINY)
  14. -#include "Board_APM32F407_TINY\inc\Board_APM32F407_TINY.h"
  15. +#include "Board_APM32F407_TINY/inc/Board_APM32F407_TINY.h"^M

  16. #elif defined (APM32F411_TINY)
  17. -#include "Board_APM32F411_TINY\inc\Board_APM32F411_TINY.h"
  18. +#include "Board_APM32F411_TINY/inc/Board_APM32F411_TINY.h"^M



点灯代码&串口打印
Examples/GPIO/GPIO_Toggle/已经能够点灯,不过笔者想同时试下串口printf打印,修改补丁如下:
  1. diff --git a/Examples/GPIO/GPIO_Toggle/Source/main.c b/Examples/GPIO/GPIO_Toggle/Source/main.c
  2. index cc572ca..eadafc2 100644
  3. --- a/Examples/GPIO/GPIO_Toggle/Source/main.c
  4. +++ b/Examples/GPIO/GPIO_Toggle/Source/main.c
  5. @[url=home.php?mod=space&uid=72445]@[/url] -63,13 +63,16 @@ int main(void)
  6. {
  7.      APM_LEDInit(LED2);
  8.      APM_LEDInit(LED3);
  9. +    USART1_Init(115200);^M
  10.      /* Init delay function */
  11.      Delay_Init();

  12.      while (1)
  13.      {
  14.          Delay_ms(500);
  15. +       printf("Toggle LED2\n");^M
  16.          APM_LEDToggle(LED2);
  17. +       printf("Toggle LED3\n");^M
  18.          APM_LEDToggle(LED3);
  19.      }
  20. }


编译&烧录
make即可编译非常方便,烧录用如下命令:
  1. pyocd load -e sector -t apm32f411ve build/apm32f411.bin
烧录完后板子重启,两颗led开始闪烁,并且swd调试器的cdc串口有打印输出
   

打赏榜单

Gfan 打赏了 50.00 元 2024-07-17
理由:APM32F411V Tiny测评活动优质测评帖

chenjun89 发表于 2024-5-5 12:55 来自手机 | 显示全部楼层
喜欢在Linux下搞开发的都是真爱
 楼主| xhackerustc 发表于 2024-5-5 13:40 | 显示全部楼层
 楼主| xhackerustc 发表于 2024-5-5 13:42 | 显示全部楼层
好像发现论坛插入代码有个bug:
"$<"               这个符号会被显示成           "[        DISCUZ_CODE_49        ]lt;"
大家如果copy Makefile用注意下
 楼主| xhackerustc 发表于 2024-5-5 20:07 | 显示全部楼层
观察板子上芯片发现是apm32f411vet6, 所以比”c“版本更高级。pyocd的target应该设成apm32f411ve, link script应该用APM32F4xxxE_FLASH.ld, 原贴已经更新
mmuuss586 发表于 2024-5-6 09:29 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

166

帖子

2

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