
Daplink(或 Jlink)仿真
烧录完成后,如果要仿真跟踪代码时,可通过 daplink 或 jlink 的方式。
使用时,需要在 platformio.ini 中指定:
用 daplink 时:debug_tool = cmsis-dap-openocd
用 jlink 时:debug_tool = jlink-openocd
在仿真的操作上,两种方式完全相同。
按以下步骤启动:
正常运行起来后,这个样子:
接下来就可以单步程序了。debug 调试中的快捷键和 VS 一致。

进入开发
前边已经了解 SDK 工程的编译烧录,这里简单介绍 gpio 和串口的使用。
举例 gpio 的使用:
举例:用 pin3 引脚接 led 灯,并控制亮灯(高为亮),则需要做:
1. ve 文件中设置: GPIO4_5 PIN_3
2. 代码中定义三个宏:
#define LED_G_GPIO GPIO4
#define LED_G_GPIO_MASK APB_MASK_GPIO4
#define LED_G_GPIO_BITS GPIO_BIT5
3. 代码中调用:
SYS_EnableAPBClock(LED_G_GPIO_MASK);
GPIO_SetOutput(LED_G_GPIO, LED_G_GPIO_BITS);
GPIO_SetHigh(LED_G_GPIO, LED_G_GPIO_BITS);
4. 先烧录 ve 部分;
5. 再编译烧录代码部分;
以上代码的解释:
1. 不管外部封装是多少 pin(48pin/64pin/100pin),芯片内部可用 gpio 都有 80 个。
在使用 gpio 时,需要把使用到的 gpio 关联到外部 pin 脚。
(没被关联的 gpio,即使在代码中操作它,也不会传导到外部 pin 脚)
这步关联动作是在 ve 文件中进行的。
ve 文件里的配置,GPIOx_y PIN_z,就是关联的语句。
PIN_z,对应外部哪个引脚。z 取值范围(48 脚封装:0~47;64 脚封装:0~63)
GPIOx_y,对应内部哪个 GPIO。x 取值范围(0~9),y 取值范围(0~7);
80 个 gpio 分为 10 组,每组 8 个。用 GPIOx_y 的格式来表达。如:
GPIO0_1 对应第 0 组的第 1 个 IO;
GPIO4_5 对应第 4 组的第 5 个 IO;GPIO9_7 对应第 9 组的第 7 个 IO…
2. 在代码中如何操作 GPIO:
仍以 GPIO4_5 举例:
在代码里定义:
#define LED_G_GPIO GPIO4
#define LED_G_GPIO_BITS (1 << 5) (或用宏 GPIO_BIT5)
则意味着 LED 对应到了 GPIO4_5。
调用函数 GPIO_SetOutput 设置改 IO 为输出模式:
GPIO_SetOutput(LED_G_GPIO, LED_G_GPIO_BITS);
然后就可以通过 GPIO_SetHigh/GPIO_SetLow 来置高置低 IO 口。
如果要设置上拉下拉,请参考文档《AG32 驱动的使用.pdf》中对 gpio 部分的详述。
举例 log 输出:
通过串口烧录 mcu 程序时,是固定使用 mcu 的 uart0。建议 mcu 在运行时也使用uart0 来输出 log。
在 VE 里设置后,代码中的 printf 函数将通过 uart0 来输出。
1. 在 ve 中配置输出 Log 的串口:
logger_if = UART0
build_flags = -DBAUD_RATE=115200 //增加系统宏 BAUD_RATE 为 115200
从 SDK1.5.0 之后,最好使用 monitor_speed = 115200 替代这种宏的用法。
2. 在 ve 中设置串口 0 的映射引脚,如:
UART0_UARTRXD PIN_69
UART0_UARTTXD PIN_68
3. 在程序的 board_init()函数中,有 UART0 的初始化:
在该初始化中,会设置串口的波特率、位宽、停止位、奇偶位。
如果不想使用 UART0 输出 log,要改用 UART1。那么在 ve 配置中对应修改:
logger_if = UART1
UART1_UARTRXD PIN_xx
UART1_UARTTXD PIN_xx
即可。
关于系统的宏定义:
在代码中出现的宏,在 VSCode 中通过鼠标停留在上边,可以看到其定义值。
这些宏,除了代码中定义的外,还有“系统预制宏”也可以被代码中使用。
系统宏的两类:
1. 定义在 platformio.ini 中的 build_flags 字段中;
如 上边定义的波特率:build_flags = -DBAUD_RATE=115200
在 build_flags 后边用 -D 表示是系统宏。后边的紧跟的字符串 BAUD_RATE=115200
(字符串中间不能有空格),则相当于 C 代码中的 #define BAUD_RATE 115200
如果有多个宏,则 -D 与下个 -D 之间用空格 隔开。
2. 在 platformio.ini 中定义后再由 main.py 经过转换拼接,才最终使用的宏。
比如上边截图中的 LOGGER_UART。
这个宏并没有在代码中定义,也没在 build_flags 中定义。但它是在 agrv_sdk.py 中引用
时再拼接的。
第二种方式了解即可,不要使用。开发者使用第一种就够了。

增加编译目录
在开发中,新增了 c 文件和 h 文件,怎么编译进来?
1. 如果新增文件在原有路径下,则会被自动关联进来编译;
2. 如果新增一个文件夹,则要把该文件夹加入到编译选项中;
如果文件夹下存放 C 文件:在 src_filter 中增加该文件夹
如果文件夹下存放 h 文件:在 src_build_flags 中增加该文件夹
举例:
在 example 项目里,只有一个 src 文件夹(里边存放全部.c 和.h)。编译设置为:
src_dir = .
include_dir = ./src
build_src_filter = "-<*> +<./src/**/*.c>"
其中:
src_dir 定义“.c 文件编译时,查找路径的基路径”
include_dir 定义“.h 文
src_build_flags 是新增的“设置头文件查找路径”的选项。每个头文件路径用 -I 来加入,
多个-I 之间加空格。
注意:在 build_src_filter 和 src_build_flags 中,都是使用相对路径。他们是从
src_dir/include_dir 定义的基路径上再开始的。
如果工程含有 c++的文件,只需在 build_src_filter 的选项中增加 cpp 选项,如:
build_src_filter = "-<*> +<./src/**/*.c> +<./src/**/*.cpp>"
件编译时,查找路径的基路径”
build_src_filter 定义 “.c 文件从哪些路径下搜索”,星号代表通配,双星代表子目录通
配,+表示增加一个搜索路径,-表示去除一个搜索路径
如果要新增一个文件夹 print(跟 src 同级),里边也有.c 和.h,可以设置如下:
src_dir = .
include_dir = .
build_src_filter = "-<*> +<./src/**/*.c> +<./print/**/*.c>"
src_build_flags = -Isrc -Iprint
其中:
include_dir 路径也退回到根路径下;
build_src_filter 加入 print 文件夹的选项;

小结
本章节主要展示和示范AG32使用的Daplink(或 Jlink)仿真,进入开发, 增加编译目录。下一章节,我们将介绍展示和示范AG32 使用的脱机烧录,flash 的大小与两个 bin, 更多:了解 platformio 插件,如需要了解更多信息,或者订购芯片,欢迎联系海振远科技。