【AG32开发板体验连载】简易逻辑分析仪 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

[活动]

【AG32开发板体验连载】简易逻辑分析仪

非常感谢电子发烧友和AGM提供的这次测评机会。之前也了解过AGM家的MCU+FPGA,觉得肯定很强大,但是一直没有机会使用到。这次终于有机会了。

项目计划

本次测评计划基于AG32开发板设计一个简易的逻辑分析仪,具体如下:

  1. 完成开发环境的搭建
  2. 基于VS Code进行MCU编程及测试
  3. 基于Quartus完成FPGA功能的测试
  4. 完成FPGA采集信号部分的代码编写及测试
  5. 完成信号处理及上传上位机部分的功能实现及测试

开发板简介

本次测评的板卡为AG32 demo V2,并且提供了一个AGM专用的DAP LINK。

AG32 demo V2板卡上板载了一颗AG32VF407VGT6芯片,它是国产唯一的异构双核(RISC-V+FPGA)处理器,包含2K逻辑单元。最大CPU速度为248 MHz,具有128KB的SRAM和1MB的FLASH,支持浮点运算,包含

1个CAN2.0, 5个UART, 2个I2C;支持SDIO、以太网MAC;支持USB FS+OTG;具有3个12位、最高3M SPS ADC(16通道)、2个DAC。具体参数如下:

该芯片具有多种用法,既可以独立当做CPLD/FPGA使用(无需开启MCU,MCU处于静默状态);也可以独立当做MCU使用,与STM32管脚兼容(无需开启CPLD/FPGA,CPLD/FPGA处于静默状态);还可以同时使用MCU和FPGA/CPLD,通过AHB总线交互。

在开发时,MCU部分使用VScode搭建开发环境(我们提供所有安装包);CPLD/FPGA使用Quartus开发(兼容Altera,代码可以直接参考Quartus所编写的Verilog语言),并需要通过Supra工具进行综合转换。MCU与FPGA/CPLD交互使用通过AHB总线挂在一起(可以参考下ADC,DAC,以及比较器),FPGA/CPLD通过类似于MCU外设的型号挂在MCU上,速度比传统的SPI快上很多倍,可以单独运行也可以交互运行。

回帖(27)

aquamanfeng

2024-10-5 16:31:44

开发第一步首先需要进行开发环境的搭建。

PC环境

  • Win11(不支持Win7)
  • VS code
  • python3.11

环境设置

所有的操作都需要在英文路径下面进行,并且不要开启杀毒软件。

首先我们需要先确认我们的用户名为英文,如果是中文,则需要将用户名修改为英文或者在环境变量中增加变量以指定安装路径。以上两种方式任选其一。

为了不影响其它软件,我这里选择的是第二种方法。首先右键“我的电脑”,点击“属性”,在弹出的设置框右侧,找到“高级系统设置”

在弹出框中选“高级”中的“环境变量”。在环境变量里新建一个变量PLATFORMIO_CORE_DIR,并设置一个不带中文的路径。

SDK安装

接下来我们就能进行SDK的下载安装了。

SDK下载

开发软件包及SDK下载链接如下:

百度网盘:https://pan.baidu.com/s/17bp-zAnsYRuVMRTSSVHN5A

提取码:12ej

首先我们需要从官方提供的百度网盘中下载最新的SDK

SDK环境配置

下载完SDK安装包后,我们首先在VS code安装Platform环境。

首先打开VS code,在左侧工具栏中找到扩展,

在搜索框输入“PlatformIO IDE”以查找platformIO插件,之后点击【install】安装插件。

安装完成后重启VS code,右侧会出现Platform的标志,说明我们安装成功。

SDK解压

之后我们将下载的SDK进行解压到指定的文件夹中

按照指示一步步完成安装后,得到的文件夹结构如下:

至此就完成了SDK的解压。

样例程序编译

我们使用VS code打开示例程序的文件夹platforms\\AgRV\\examples\\example

由于开发板使用的是407 芯片,需要先修改platformio.ini 中的board 类型:

board = agrv2k_103

修改为:

board = agrv2k_407

此外为了正常使用官方的dap link进行下载,需要将platformio.ini 中的以下一行配置修改如下

protocol = cmsis-dap-openocd

程序烧录

新开发板第一次使用,要先烧录VE 配置。(不烧录VE 而先烧录程序bin,会报错)。之后就可以修改哪个文件烧录哪个文件了。

之后我们烧录程序

完成之后,就能看到我们的开发板上LED在进行闪烁了。

aquamanfeng

2024-10-7 11:37:06

管脚配置及GPIO使用

管脚配置

但在AG32 里,信号线和管脚是彻底分离的,可以把任意信号线绑定到任意引脚(除部分管脚 基础类:电源、时钟、地、RESET、BOOT0、ADC(DAC/CMP)、USB)。下面是信号线和管脚的介绍:

  • 信号线:指MCU 里能操作的信号线,比如gpio1_1/uart0_tx/spi_cs 等等;
  • 管脚:芯片裸露在外边的引脚(32PIN 的有32 个管脚,64PIN 的有64 个管脚...)

详细的管脚的定义,可以参考文档《AG32_pinout_100_64_48_32_2K.xlsx》,其中带IO的均为可配置的管脚。

在AG32中,管脚在ve文件中配置,格式为信号线<->管脚,每个管脚的配置单独一行。如:

  1. 配置GPIO0_1 为PIN2,则定义:GPIO0_1 PIN_2
  2. 配置UART1_TX 为PIN3,则定义:UART1_UARTTXD PIN_3
  3. 配置SPI0 的clk 为PIN4,则定义:SPI0_SCK PIN_4
  4. 配置CAN0 的TX 为PIN5,则定义:CAN0_TX0 PIN_5

GPIO使用

GPIO简介

AG32中可用GPIO共80个,分为10组,每组8个。

其中各组分别为:GPIO0、GPIO1、GPIO2、...

组内各IO可表示为:GPIO_BIT0、GPIO_BIT1、GPIO_BIT2、...

使用时,用【组ID+组内id】来标识唯一的IO。

GPIO配置

管脚映射

在ve文件中对管脚映射进行配置,这里将GPIO4_1GPIO4_4分别映射到PIN_34PIN_31上,这四个管脚分别对应四个LED。

GPIO4_1 PIN_34 # LED1
GPIO4_2 PIN_33 # LED2
GPIO4_3 PIN_32 # LED3
GPIO4_4 PIN_31 # LED4

管脚配置

类似于STM32,首先定义相关的宏,这里的LED_GPIO_BITS仅选择了LED4进行操作。

#define LED_GPIO GPIO4
#define LED_GPIO_MASK APB_MASK_GPIO4
#define LED_GPIO_BITS (1 << 4) // LED 4

GPIO初始化

接下来进行GPIO的初始化。首先开启相关的时钟并将LED设置为输出模型并默认设置高电平。

SYS_EnableAPBClock(LED_GPIO_MASK);
  GPIO_SetOutput(LED_GPIO, LED_GPIO_BITS);
  GPIO_SetHigh(LED_GPIO, LED_GPIO_BITS);

GPIO操作

示例代码如下,这里是对GPIO的电平进行了翻转操作,从而实现LED4闪烁的效果。

void TestGpio()
{
  printf("Testing gpio\\n");
  int counter = 0;
  while (1) {
    UTIL_IdleUs(100e3);
    GPIO_Toggle(LED_GPIO, LED_GPIO_BITS);
  }
}

其它还有其它相关函数,具体可以参考SDK中的相关代码:

  • GPIO_SetOutput/GPIO_SetInput ---设置IO 为输入输出
  • GPIO_SetHigh/GPIO_SetLow ---置高置低
  • GPIO_Toggle ---高低切换
  • GPIO_IntConfig ---配置中断触发方式
  • GPIO_EnableInt/GPIO_DisableInt/GPIO_ClearInt ---中断控制
  • GPIO_AF_ENABLE/GPIO_AF_DISABLE ---切换GPIO 模式(如果有复用)

aquamanfeng

2024-10-8 21:09:32

USB使用

TinyUSB 是一个用于嵌入式系统的开源跨平台 USB 主机/设备堆栈, 设计为内存安全,没有动态分配,线程安全,所有中断事件都被延迟,然后在非 ISR 任务函数中处理。但是看tinyUSB的官方介绍里不能使用DMA进行数据传输,这也是个遗憾的地方。

在AG32官方提供的SDK中,已经集成了tinyUSB,可自行关联使用。值得注意的是AG32中usb 使用到的PIN 脚是固定的管脚,不能在ve 中进行改变。目前AG32支持:单纯device 端、单纯host 端、OTG 自动切换主从端。三种情况要支持的枚举类型,可以在配置头文件中自行配置。目前针对三种情况,在platforms\\AgRV\\examples\\usb文件夹中也有官方提供的示例工程。

这里我们仅需要将AG32做为设备端,将采集到的数据发送给电脑上位机,因此这里我们以示例工程中的cdc_msc工程为例进行介绍。

首先使用VS code打开cdc_msc文件夹,并对其中的platformio.ini文件进行如下修改:

board = agrv2k_407
protocol = cmsis-dap-openocd

之后查看main.c文件,首先是将头文件包含了进去

#include "tusb.h"

然后是main函数

int main(void)
{
  board_init();

  // init device stack on configured roothub port
  tud_init(BOARD_TUD_RHPORT);

  while (1)
  {
    tud_task(); // tinyusb device task

    cdc_task();
  }

  return 0;
}

其中首先对板子进行了初始化,并且调用了tud_init函数对tud进行了初始化。因为我们这里没有使用RTOS,所以则需要持续和/或定期调用tud_task()函数(在 tinyUSB 库中,tud_task()tuh_task() 分别是设备模式(Device Mode)和主机模式(Host Mode)的任务处理函数。)。所有回调和功能都在该任务运行程序的调用中处理和调用。

cdc_task函数中,我们定义了对于插入设备和接收到数据的操作,当检测到设备插入或接受到数据时,将会调用tud_cdc_read函数读取数据并使用tud_cdc_write函数发送”message received!“,最后调用函数tud_cdc_write_flush清空缓存区。

void cdc_task(void)
{
  // connected() check for DTR bit
  // Most but not all terminal client set this when making connection
  // if ( tud_cdc_connected() )
  {
    // connected and there are data available
    if ( tud_cdc_available() )
    {
      // read data
      char buf[64];
      uint32_t count = tud_cdc_read(buf, sizeof(buf));
      (void) count;

      // Echo back
      // Note: Skip echo by commenting out write() and write_flush()
      // for throughput test e.g
      //    $ dd if=/dev/zero of=/dev/ttyACM0 count=10000
      tud_cdc_write("message received!", 17);
      tud_cdc_write_flush();
    }
  }
}

实验效果如下:

实测这里的波特率选择任意时,设备都是可以正常接收并发送数据的。

aquamanfeng

2024-10-9 10:37:46

FPGA使用

环境

  • Quartus 13.0(Quartus 不能使用Lite 版本,需要使用Full 版本)
  • AGM SDK
  • Supra(快捷方式在SDK目录下,具体路径为AgRV_pio\\packages\\tool-agrv_logic\\bin

FPGA编程

在AG32芯片中,拥有异构双核(RISC-V+FPGA)处理器,包含2K逻辑单元。两者可以同时使用并进行交互,但是FPGA通常是作为MCU的一个外设设备来使用。

简要概述

如果芯片中同时使用mcu 和cpld,cpld的开发流程的简要描述:

  1. 在VE 文件里配置用到的mcu 和pin 之间、mcu 和cpld 之间、cpld 和pin 之间的信号关联。
  2. 在VS code中点击“prepare LOGIC”按钮,生成cpld 的框架工程。
  3. 用quartus 打开该工程并添加自己的逻辑代码,最后转换工程,生成vo;
  4. 用supra 打开转换后的工程,编译出bin,最后回到VS code进行烧录。

更多回帖

×
发帖