这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 有奖活动 » AG32VH407开发板例程体系的构成与使用方法

共2条 1/1 1 跳转至

AG32VH407开发板例程体系的构成与使用方法

助工
2026-03-11 09:53:42     打赏

AG32VH407一款AG32 MCU系列三合一芯片,芯片内部包含了MCU2K CPLD64Mbit PSRAM存储空间,它可以同时满足多种应用开发需求其围观如图1所示

image.png

1 开发板外观

在程序提示和烧录方面,是通过外挂的调试器,见图2所示。

image.png

2 调试器 

有了硬件的基础,要进行开发就免不了开发环境的主持及相关的例程。

在通常情况下,厂家为了便于用户学习和使用都会提供相应的例程以展示其内核的性能和使用方法。

其中,最普遍的方式就是按内核的性能分成多个文件目录,在每个目录下,又细分为多种工作模式或使用方式。

而对于AG32VH407开发板来说,其例程体系结构则是采用另一种方式,即在一个项目工程下,将各种例程都容纳旗下,然后在主程序里都排列其中,使用哪一个就去除注释加以使用,否则就注释掉免除其运行。

该主程序处于文件example.c中,见图3所示。

image.png

3 包含内容 

其具体的内容如下:

#include "example.h"
void Button_isr(void)
{
  if (button_isr_cb) {
    button_isr_cb();
  }
  UTIL_IdleMs(400); 
  GPIO_ClearInt(BUT_GPIO, BUT_GPIO_BITS);
}
void MTIMER_isr(void)
{
  GPIO_Toggle(EXT_GPIO, EXT_GPIO_BITS);
  INT_SetMtime(0);
}
 
void TestMtimer(int ms)
{
  clint_isr[IRQ_M_TIMER] = MTIMER_isr;
  INT_SetMtime(0);
  INT_SetMtimeCmp(SYS_GetSysClkFreq() / 1000 * ms);
  INT_EnableIntTimer();
  while (1);
}
int main(void)
{
  // This will init clock and uart on the board
  board_init(); 
  // The default isr table is plic_isr. The default entries in the table are peripheral name based like CAN0_isr() or
  // GPIO0_isr(), and can be re-assigned.
  plic_isr[BUT_GPIO_IRQ] = Button_isr;
  // Any interrupt priority needs to be greater than MIN_IRQ_PRIORITY to be effective
  INT_SetIRQThreshold(MIN_IRQ_PRIORITY);
  // Enable interrupt from BUT_GPIO
  INT_EnableIRQ(BUT_GPIO_IRQ, PLIC_MAX_PRIORITY);
  // TestMtimer(500);
  // TestAnalog();
  // TestCan();
  // TestCrc();
  // TestFcb();
  // TestGpTimer();
  // TestGpTimerPwm();
  // TestI2c();
  // TestRTC();
  // TestSpi();
  // TestSystem();
  // TestTimer();
  // TestWdog();
  // TestUart();
  // TestFlash();
  TestGpio();
}

在主程序里,真正被使用的是TestGpio(),其它的测试均被注释掉而暂停使用。我们要进行其它的测试,完全可将其注释掉,而解开所调用的注释。

那函数TestGpio()又是啥内容呢?

其内容如下:

#include "example.h"
#include <stdio.h> 
void TestGpio()
{
  printf("Testing gpio\n");
  int counter = 0;
  while (1) {
    printf("Test log\r\n");
    UTIL_IdleUs(100e3);
    GPIO_Toggle(EXT_GPIO, EXT_GPIO_BITS);
  }
}

也就是说,这是一个测试GPIO使用及 printf输出的函数。

至于所使用的GPIO引脚则是在文件board.h进行宏定义,其内容为:

#define LED_GPIO GPIO4

#define LED_GPIO_MASK APB_MASK_GPIO4

#define LED_GPIO_BITS (1 << 4)

为了能观察LED的变化效果,需配置这4个LED及所用串口的引脚,以匹配开发板上的硬件连接,其内容在文件example_board.ve中,即:

GPIO4_1 PIN_39 # LED1

GPIO4_2 PIN_38 # LED2

GPIO4_3 PIN_37 # LED3

GPIO4_4 PIN_36 # LED4 

UART0_UARTRXD PIN_43

UART0_UARTTXD PIN_42 

其中:GPIO4_1是引脚名称,PIN_39则是引脚号,这样就建立他们的对应关系。

image.png

4 LED电路

弄清了例程的结构关系之后,即可自主地选取测试的功能或改造成所需的用途。

当然,要观察到运行结果的话,还需进行程序的编译和烧录。

与普通开发板不同的是,常规的开发板只需一次程序下载即可运行查看效果。

为了进行测试,需在 platformio.ini 中,对芯片及调试器的类型加以设置,其内容为:

board = agrv2k_103

board_logic.device = AGRV2KL64

debug_tool = cmsis-dap-openocd

upload_protocol = cmsis-dap-openocd 

对于AG32VH407开发板来说,由于其特殊的设计结构,在烧录时通常要进行两次,即烧录VEbin,见图5和图6所示。

image.png

5烧录VE

image.png

6 烧录bin 

这便是AG32VH407开发板的例程体系构成及使用方法,对这方面的了解将有助于使用者快速进入程序设计的角色。









关键词: AG32VH407    

高工
2026-03-14 20:11:42     打赏
2楼

这颗芯片需要烧录两次固件的原因是?之前我用过的其他双核甚至多核的芯片,要么同一份代码编程,要么把一个核的代码编译好后,将生成的文件放在另一个核的代码中打包成最终固件,运行时加载。很少见两个完全单独烧录的情况


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]