AGM芯片AGM芯片
  • 首页
  • 产品中心
    • AGM MCU
    • AG32 MCU Series
    • AGM FPGA
    • AGM CPLD
    • AGM DEMO
  • 行业资讯
    • 行业新闻
    • 产品新闻
    • 技术专栏
    • 编程教程
  • 解决方案
    • 工业应用
    • 音视频应用
      • MCU用于Mini-LED背光控制应用方案
    • 按需定制
  • 服务支持
    • 软件下载
    • 帮助文档
    • AG32用户手册
  • 关于我们
    • 关于我们
    • 联系我们

最新资讯

  • 行业新闻
  • 产品新闻
  • 编程教程
  • 软件下载

产品中心

  • AGM MCU
  • AG32 MCU Series
  • AGM CPLD
  • AGM FPGA
  • AGM DEMO

解决方案

  • 工业应用
  • 按需定制
  • 音视频应用
  • 关于AG32在无人机上的具体解决方案可参考的Github项目汇总

  • AG32的CPLD发挥奇效:UWB模组应用方案

  • 车规半导体的时机-续

  • AG32:MCU与CPLD深度交互解析与工程实践指南

  • AG32适合哪些开发者

热门标签

  • MCU
  • AG32
  • 芯片
  • RAM
  • 国产MCU
  • GPU
  • 模拟芯片
  • FPGA
  • AI芯片
  • 汽车UWB
  • 车载信息娱乐
  • CPLD
  • 集成电路芯片
  • 小米
  • 32位车用MCU

例程集合

2025年1月6日 1,358

文章目录[隐藏]

  • 一、Uart样例
  • Uart简单的收发,请参考“驱动描述”部分,这里不再建立工程。
  • 二、ADC样例
    • 1. ADC添加到cpld工程
    • 2. ADC循环采集多channal
    • 3. ADC+led控制(cpld)
  • 三、USB样例
    • 1. cdc+msc+hid+midi样例
    • 2. 枚举出两个cdc串口样例
    • 3. 枚举出一个cdc串口样例
    • 4. 枚举出U盘的样例
    • 5. 在103工程上的样例
  • 四、spi样例
    • 1.spi的一般使用spi-comm
    • 2.spi的全功能spi-ful
  • 三、联合编程样例
    • 1.cpld控制led灯闪烁
    • 2.cpld中输出ck到外部引脚
    • 3.mcu信号到cpld到pin
      • 1、在ve中定义3个信号:
      • 2、在user ip.v中关联下信号:
      • 3.在mcu代码里,初始化gpio4 1并toggle切换:
    • 4. mcu读写cpld寄存器
    • 5. cpld实现的UartTx例程
    • 6. cpld配合实现mcu的dma读取
    • 7. ADC+SPI_FULL的使用
  • 五、其他样例
    • 1. 整合SDK和freeRTOS的样例
    • 2. AG32下调用CPP代码的样例
    • 3. 用户bootloader版本升级
  • 一、Uart样例

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

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

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

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

    点击下载文件->

     

    二、ADC样例

    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端这边的代码,也是一样这样使用的。
    更多使用详情,请参考代码中的注释。

    点击下载文件->

    example_adcCircle_dma

    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控制文件点击下载文件

    三、USB样例

    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下挂的数据。

    都是最简化的样例。

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

    点击下载文件->

    样例说明-ahb-apb
    example_cpldApbTxRxReg
    example_cpldAhbTxRxReg

    5. cpld实现的UartTx例程

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

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

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

    点击下载文件->

    新建UartTx样例工程的过程  
    example_cpldUartTx 

     

    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收到的数据,就是这里返回的结果。
    更多信息参考工程 源码及注释。

    点击下载文件->

    example_cpldRxDma

    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部分。

    点击下载文件->

    example_adcAndSpi

    五、其他样例

    1. 整合SDK和freeRTOS的样例

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

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

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

    点击下载文件->

    example_withSDK_freeRTOS

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

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

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

    参考附档的文档说明

    点击下载文件->

    example_testCpp
    AG32下调用CPP代码的方法

    .

    3. 用户bootloader版本升级

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

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

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

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

    AG32 MCU AG32VH407RCT6更新RGB例程:HRAM_RGB例程【已量产】
    « 上一篇 2025年1月6日
    Supra最新更新:AGRV2K CPLD支持无源晶体做时钟输入
    下一篇 » 2025年1月6日

    相关推荐

    AGM是领先的32位AG32芯片,MCU,AI ASIC可编程SoC、和异构(MCU)芯片和方案提供商,AGM致力于为消费电子、工控和AIoT中高量市场提供智能化的设计软件和芯片系统

    产品技术

    • AGM MCU
    • AGM FPGA
    • AGM CPLD
    • AGR V2K

    行业新闻

    • 行业解决方案
    • 产品新闻
    • 行业新闻
    • 关于我们

    帮助文档

    • MCU入门
    • MCU驱动使用
    • 联合编程
    • 例程集合

    联系我们

    工程师微信
    在线留言

    © Copyright 2013-2025 AGM芯,国产强 All Rights Reserved. 版权所有

    增值电信业务经营许可证备案号:浙ICP备18045792号-5

    返回顶部

    • 首页 首页
    • 产品 产品
    • 电话 电话
    • 微信 微信