非常感谢电子发烧友和AGM提供的这次测评机会。之前也了解过AGM家的MCU+FPGA,觉得肯定很强大,但是一直没有机会使用到。这次终于有机会了。
本次测评计划基于AG32开发板设计一个简易的逻辑分析仪,具体如下:
本次测评的板卡为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快上很多倍,可以单独运行也可以交互运行。
开发第一步首先需要进行开发环境的搭建。
所有的操作都需要在英文路径下面进行,并且不要开启杀毒软件。
首先我们需要先确认我们的用户名为英文,如果是中文,则需要将用户名修改为英文或者在环境变量中增加变量以指定安装路径。以上两种方式任选其一。
为了不影响其它软件,我这里选择的是第二种方法。首先右键“我的电脑”,点击“属性”,在弹出的设置框右侧,找到“高级系统设置”
在弹出框中选“高级”中的“环境变量”。在环境变量里新建一个变量PLATFORMIO_CORE_DIR,并设置一个不带中文的路径。
接下来我们就能进行SDK的下载安装了。
开发软件包及SDK下载链接如下:
百度网盘:https://pan.baidu.com/s/17bp-zAnsYRuVMRTSSVHN5A
提取码:12ej
首先我们需要从官方提供的百度网盘中下载最新的SDK
下载完SDK安装包后,我们首先在VS code安装Platform环境。
首先打开VS code,在左侧工具栏中找到扩展,
在搜索框输入“PlatformIO IDE”以查找platformIO插件,之后点击【install】安装插件。
安装完成后重启VS code,右侧会出现Platform的标志,说明我们安装成功。
之后我们将下载的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在进行闪烁了。
但在AG32 里,信号线和管脚是彻底分离的,可以把任意信号线绑定到任意引脚(除部分管脚 基础类:电源、时钟、地、RESET、BOOT0、ADC(DAC/CMP)、USB)。下面是信号线和管脚的介绍:
详细的管脚的定义,可以参考文档《AG32_pinout_100_64_48_32_2K.xlsx》,其中带IO的均为可配置的管脚。
在AG32中,管脚在ve文件中配置,格式为信号线<->管脚
,每个管脚的配置单独一行。如:
AG32中可用GPIO共80个,分为10组,每组8个。
其中各组分别为:GPIO0、GPIO1、GPIO2、...
组内各IO可表示为:GPIO_BIT0、GPIO_BIT1、GPIO_BIT2、...
使用时,用【组ID+组内id】来标识唯一的IO。
在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的初始化。首先开启相关的时钟并将LED设置为输出模型并默认设置高电平。
SYS_EnableAPBClock(LED_GPIO_MASK);
GPIO_SetOutput(LED_GPIO, LED_GPIO_BITS);
GPIO_SetHigh(LED_GPIO, LED_GPIO_BITS);
示例代码如下,这里是对GPIO的电平进行了翻转操作,从而实现LED4闪烁的效果。
void TestGpio()
{
printf("Testing gpio\\n");
int counter = 0;
while (1) {
UTIL_IdleUs(100e3);
GPIO_Toggle(LED_GPIO, LED_GPIO_BITS);
}
}
其它还有其它相关函数,具体可以参考SDK中的相关代码:
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();
}
}
}
实验效果如下:
实测这里的波特率选择任意时,设备都是可以正常接收并发送数据的。
AgRV_pio\\packages\\tool-agrv_logic\\bin
)在AG32芯片中,拥有异构双核(RISC-V+FPGA)处理器,包含2K逻辑单元。两者可以同时使用并进行交互,但是FPGA通常是作为MCU的一个外设设备来使用。
如果芯片中同时使用mcu 和cpld,cpld的开发流程的简要描述:
更多回帖