例程集合

一、Uart样例

Uart简单的收发,请参考“驱动描述”部分,这里不再建立工程。

1.Uart的Dma中断的使用
样例功能:展示如何在串口中使用DMA来收和发

点击查看说明 ->【详细说明】
这里的实现方式是:dma发送 + dma-tc中断。2025010605051885
这种方式可以用于不太精确的发送完成定位。(如果用于485这种精确定位的,需要使用uart-tc中断来替换dma-tc中断)

更多细节,参考代码中的注释。

点击下载文件->

 

1. ADC添加到cpld工程

样例功能:展示如何在自定义cpld里加入ADC部分的过程

点击查看说明 ->【详细说明】

这里包含一份文档和最终的工程。
整个过程最好自己按文档操作一遍,自己创建出来工程。
如果直接打开样例工程,注意需要把Quartus工程里的alta_sim.v文件,替换成自己本地的alta_sim.v文件。

alta_sim.v文件一般位于:C:/Users/[userName]/.platformio/packages/tool-agrv_logic/etc/arch/rodinia/
路径中的[userName],就是电脑的登录名。

ADC样例下载文件->

 

2. ADC循环采集多channal

样例功能:开启DMA来循环不间断读取ADC的多个channal的值

点击查看说明 ->【详细说明】

样例基于407开发板(100PIN的芯片)
DMA里只管循环采集,采集后把数据用覆盖方式 放到adc_table数组,至于数据什么时候使用,不管。
样例里配置了对2个channal的循环读。如果更多channal循环采集则修改对应的项即可,如果仅1个channal那就更简单,配置成1个就行。
这个demo中,只是打开了platformio.ini中的 ip_name = analog_ip 项(也就是使用默认的analog)
如果是自定义Logic(自己把ananlog_ip加入到自定义的logic里),c端这边的代码,也是一样这样使用的。
更多使用详情,请参考代码中的注释。

点击下载文件->

3. ADC+led控制(cpld)

样例功能:cpld中把ADC逻辑和led控制逻辑进行了合并

点击查看说明 ->【详细说明】

ADC逻辑,就是默认logic使用的ADC逻辑(在SDK下的platforms\AgRV\examples\analog\logic)。
自定义逻辑,是个简单的cpld根据系统时钟来控制外部led闪烁的逻辑。

简要说明:

在mcu代码里,
可以用gpio4_1控制PIN_32的led;
可以使用adc的代码,来通过cpld使用ADC功能;

在ve里定义:
LED_TEST2 PIN_31:OUTPUT # LED4
GPIO4_1 PIN_32 #
LED1
第一行定义了cpld到PIN脚的映射。在cpld里可以操作信号LED_TEST2来实现对PIN_31的操作;
第二行定义了mcu中gpio到pin脚的映射。在代码里可以操作 GPIO4_1来实现对PIN_32的操作。

在analog_ip.v中:
module的接口部分是cpld框架自动生成的;
接下来是ADC的逻辑部分;
最后一小段,是cpld根据clk控制LED_TEST2信号切换的(也就是led闪烁)。

ADC+led控制文件点击下载文件

1. cdc+msc+hid+midi样例

样例功能:工程中cdc+msc+hid+midi四种全带

点击查看说明 ->【详细说明】

基于407工程

点击下载文件

 

2. 枚举出两个cdc串口样例

样例功能:双串口cdc

点击查看说明 ->【详细说明】

基于407工程

点击下载文件

 

3. 枚举出一个cdc串口样例

样例功能:单串口cdc

点击查看说明 ->【详细说明】

基于407工程

点击下载文件->

4. 枚举出U盘的样例

样例功能:枚举出U盘(msc)

点击查看说明 ->【详细说明】

基于407工程

点击下载文件->

 

5. 在103工程上的样例

样例功能:在103工程上使用tinyUSB

点击查看说明 ->【详细说明】

基于103工程(48PIN)上建立usb工程。

点击下载文件->

 

四、spi样例

1.spi的一般使用spi-comm

样例功能:该样例展示spi(不带cpld)封装成普通函数的使用
在样例中,spi直接调用开发板上的spi-flash,用以验证发送数据和接收数据的正确性。这个样例.C中提供2个函数:
1.Send:(SPl SendExt)单纯发送数据,字节数不限制;2.SendAndRecv:(SPl SendAndRecvExt)在一个片选周期内,发送一段数据,再接收一段数据其中发送长度和接收长度都不限(最长不大于4095即可)这组函数的受限条件:
1.SPI交互时第一段只能是tx(不能是rx);
2.收和发不能同时进行(只能是发完再收)
3.rx后边不能再有tx(rx位于一次交互的最后一段);4.spi的模式必须是 cpol==1 && cpha==1;如果不满足以上的条件,则必须使用spi ful的方式。该方式参后续样例(需要使用到cpld)

spi样例下载->

 

2.spi的全功能spi-ful

样例功能:该样例展示了spi全功能(带cpld)封装成普通函数的使用
点击查看说明 ->【详细说明)
在样例中,spi直接调用开发板上的spi-flash,用以验证发送数据和接收数据的正确性。这个样例.C中提供4个函数:
1.Send:(SPl SendExt)单纯发送数据,字节数不限制;2.SendAndRecv:(SPl SendAndRecvExt)在一个片选周期内,发送一段数据,再接收一段数据?其中发送长度和接收长度都不限(最长不大于4095即可)3.Recv:单纯收取数据,单次接收最长4095byte;4.SendWithRecv:在发送数据的同时来收(双向传输),而不是发完后再收。单次发收最长4095bytes.如果设置极性和相位,用函数SPlSetCtrlParam。(不设置的情况下,默认为 cpol==1 && cpha==1)这组函数里没有什么使用限制。
cpld使用部分,参考《AG32下spi的拓展使用》说明。
点击下载文件->

example spiFull
AG32下spi的拓展使用

 

三、联合编程样例

注意:这个章节demo的使用,仅仅是用作“cpld代码参考”
直接打开Quartus工程来编译,是编译不过的(因为最终编译时,会依赖alta rv32.v这个库,这个库在本地SDK上路径不相同的),如果直接打开Quartus编译报错找不到alta rv32这个文件,就是这个原因。
正确的使用姿势是:参考mcu+cpld的联合编程的文档,自己在本地新建一个空的cpld工程,然后,再把样例中的cpld代码(使用到的“用户逻辑”)复制过去即可。
好消息是:所看到的cpld工程里的那么多的文件,其实在生成cpld空工程时,绝大部分都已经自动产生了。你所需要添加的,仅仅是user ip.v(早起版本叫analog ip.v)里边的“用户逻辑”而已。

 

1.cpld控制led灯闪烁

样例功能:在103工程上使用tinyUsB
点击查看说明 ->【详细说明】
使用说明请参考mcu+cpld联合编程里边,样例说明部分的讲解。

点击下载文件->
example logic led

 

2.cpld中输出ck到外部引脚

样例功能:以32脚的芯片为例,在cpld中,直接输出busclk和sysclk到外部管脚
点击查看说明 ->【详细说明】
这个是基于 AGRV2KQ32 开发板做的样例(使用内部晶振)。样例里,在VE里配置 sysclk和 pllclk3,以及管脚 PIN 10和PIN 11,然后在cpld里直接连接sysck到 PIN 11,pllclk3到PIN 10.
程序烧录后,可以从开发板的 PIN 10和PIN 11和量到两个clk输出的波形。

点击下载文件->
example Q32 testCpldClkOut2

 

3.mcu信号到cpld到pin

样例功能:是 mcu->cpld->pin 的简单样例
点击查看说明 ->【详细说明】
用mcu的gpio(gpio4 1)来输入信号到cpld,然后cpld把这个信号关联到2个pin上(开发板的2个led)。
然后mcu中切换gpio4 1时,两个ed灯交替闪烁。
简单说明:

1、在ve中定义3个信号:

LED TEST1 PIN 31 # LED3
LED TEST2 PIN 32 #
LED2GP104 1 iocvt chn:OUTPUT其中前两个是cpld中信号到引脚,第三个是mcu到cpld信号。在prepare LOGIC工程后,可以看到信号:inout LED TEST1.inout LED TEST2input iocvt chn out data,
input iocvt chn out en,

2、在user ip.v中关联下信号:

assign LED TEST1 = iocvt chn out data,
assign LED TEST2 = !iocvt chn out data;这样,
当iocvt chn out data为高时,LED TEST1为高,即PIN 31为高,led3亮当iocvt chn out data为高时,LED TEST2为低,即PIN 32为低,led2灭

 

3.在mcu代码里,初始化gpio4 1并toggle切换:

SYS_EnableAPBClock(APB_MASK_GPIO4);
GPIO_SetOutput(GPIO4, GPIO_BIT1);
while (1) {
UTIL_IdleUs(200e3);
GPIO_Toggle(GPIO4, GPIO_BIT1);
}

然后就可以看到一个gpio4_1控制两个led灯交替闪烁。

点击下载文件->

4. mcu读写cpld寄存器

样例功能:展示了 mcu端如何读写cpld寄存器(ahb和apb)

点击查看说明 ->【详细说明】

这个里边包含两个样例,一个是mcu读cpld下ahb上挂的数据,一个是读apb下挂的数据。

都是最简化的样例。

这里只是展示读取的逻辑,用户最终使用应该远比这个复杂。

点击下载文件->

5. cpld实现的UartTx例程

样例功能:如何用cpld实现一个Uart的tx功能,及mcu端如何与之交互使用

点击查看说明 ->【详细说明】

更多信息参考工程 源码及注释。

点击下载文件->

 

6. cpld配合实现mcu的dma读取

样例功能:展示了如何用cpld中实现dma的流控,让mcu中配置的dma能正常从cpld中接收数据

点击查看说明 ->【详细说明】

//实验思路:
//展示cpld中如何配合mcu的dma,实现dma对cpld数据的读取(带流控)。
//
//mcu的代码里,先配置好dma收数据(从0x60000004位置收);
//mcu的C代码里,给0x60000000循环写入一串数据,
// 然后cpld中每收到一个值,就触发一次dma请求,让mcu的dma来读取一次。
// (dma的读取和mcu直接读取对cpld来说是一样的)只不过dma读取完后,会多触发一个clear的信号。
//mcu的C代码里,等发送完成时,查看dma收到的数据,就是这里返回的结果。
更多信息参考工程 源码及注释。

点击下载文件->

7. ADC+SPI_FULL的使用

样例功能:展示了 ADC+SPI_Full 的使用,包括cpld的代码和mcu端的代码。

点击查看说明 ->【详细说明】

这个样例,展示了 ADC+SPI_Full 的使用。
这个样例,是基于100PIN的407开发板测试的。主频200M,BUSCLK为100M。
在mcu端:

  1. Adc部分使用example_analog.c的样例;
    使用的地址:
    ADC0 0x60000000
    ADC1 0x60001000
    ADC2 0x60002000
    DAC0 0x60003000
    DAC1 0x60004000
    CMP 0x60005000
  2. Spi部分使用example_spi_advanced.c的样例;
    使用的地址:
    SPI 0x60006000
    注:这个地址不再是单纯使用spi时默认的那个 0x60000000 了。
  3. main函数里,分别调用ADC和SPI的测试函数;
    在cpld端:
  4. 同时集成adc和spi的逻辑,根据地址来区分使能哪个。
  5. 实现步骤:
    a. 生成空的cpld工程;
    b. 把adc的logic部分合并进来;
    c. 把spi的logic部分合并进来;
    d. 修改冲突的点(包括ready信号、read信号、DMA使用);
  6. 合并后的使用限制:
    spi不要和ADC2或DAC1同时使用dma功能(分时使用没问题)。(在cpld内,ADC2/DAC1/SPI三个共享一个dma)
    ----对于spi来说,dma功能就是收的dma,代码中的EXT_DMA2_REQ部分。

点击下载文件->

1. 整合SDK和freeRTOS的样例

样例功能:把SDK整合到项目工程,把freeRTOS也整合到项目工程,增加了专门log输出

点击查看说明 ->【详细说明】

该工程使用100PIN的开发板(agrv2k_407)
工程以example为基础,把SDK整合到项目工程,把freeRTOS也整合到项目工程,增加了专门log输出。
其中,
log输出部分,是通过增加了一个专用线程(优先级很低)实现的。
实现方式:
其他线程中把需要输出(printf)的信息,通过互斥的方式,先丢到这个线程(的一个RingBuff)。
然后这个线程在系统空闲时,再一点点通过串口输出。
可以认为是异步输出。
在这个里边,RingBuff的大小和一次输出信息的长度,目前默认大小分别是2K和256字节。
必要时,请根据自己的实际使用情况合理配置。

点击下载文件->

2. AG32下调用CPP代码的样例

样例功能:工程中展示了AG32下调用CPP代码的方法

点击查看说明 ->【详细说明】

参考附档的文档说明

点击下载文件->

AG32下调用CPP代码的方法

.

3. 用户bootloader版本升级

样例功能:工程中展示了bootloader的近端升级的样例(boot+app)

点击查看说明 ->【详细说明】

该工程使用100PIN的开发板(agrv2k_407),展示出bootloader近端串口升级的样例。

这部分的使用教为复杂,后续我们更新相应的教程来完善