HIZYUAN 发表于 2025-5-20 14:08

AGM AG32 MCU+FPGA 驱动使用(四)

前言:
AGM是AG32 MCU, 可编程SoC和异构MCU的解决方案提供商, 海振远科技可提供全系列的开发板及SDK资料,方便用户从0开始,快速上手开发。AGM AG32 MCU和FPGA 目前广泛应用于工业,消费,测试测量和医疗等场景。AG32内置的FPGA( AGRV2K) 可升级替代EP570, EPM1270, LATTICE XO2-256,XO2-640, XO2-1200 等。AG32 的管脚可以灵活定义,引脚与STM32。并且内置2KLE FPGA, 非常适合MCU + FPGA/CPLD的应用场景。
十四、WatchDog的使用十五、RTC的使用十六、中断与异常十七、系统休眠(sleep、stop、stanby)十八、使用自定义的logic
十四、WatchDog的使用AG32支持1个独立看门狗模块。WDOG主要性能:●自由运行的递减计数器●看门狗被激活后,则在计数器计数至0x000时产生复位默认情况下,在debug状态下看门狗是不工作的。
使用逻辑:1. 为看门狗使能时钟,并使能中断(中断可选);   SYS_EnableAPBClock(APB_MASK_WATCHDOG0);   INT_EnableIRQ(WATCHDOG0_IRQn, WDOG_PRIORITY);2. 启动看门狗,同时设置看门狗时间;   WDOG_Init(SYS_GetPclkFreq()); // 1 second3. 定时喂狗;   WDOG_Feed();   看门狗中断函数为:void WATCHDOG0_isr();喂狗函数一般写在程序的大循环里。视自己的情况而定。4. 系统启动后,可以通过查看寄存器,确定是否为看门狗导致的重启;   if (READ_BIT(SYS->RST_CNTL, SYS_RSTF_WDOG)) { /*reset by Watchdog*/}   在处理中需要自行清除掉该标记,以避免下次重启时误判。
看门狗中是否使用中断:
[*]如果开启看门狗中断,则中断来了后,必须要在中断里清除标记(清除中断的动作就是喂狗的动作),不然中断函数会一直被调用。
[*]如果关闭看门狗中断,则必须要应用程序在重启时间到来前及时喂狗。
[*]还可以中断函数和应用程序两者一起喂狗。即:开启看门狗中断,然后在中断函数和应用中都调用喂狗函数。如果应用中的喂狗周期比中断周期短,则中断函数***不会被触发。


看门狗的中断时间和重启时间:   在WDOG_Init函数中设置的时间,是看门狗中断来一次的时间。而重启的时间,是两个这样的时间(2倍整)。   比如:WDOG_Init设置了5秒,没启动看门狗中断,当应用中10秒没喂狗动作时,系统才被重启。.十五、RTC的使用RTC(Real Time CLock)是个独立的定时器。RTC模块拥有一个连续计数的计数器,可进行软件配置,提供时钟日历的功能。RTC还 包含用于管理低功耗模式的自动唤醒单元。只要芯片的备用电源一直供电,在mcu断电情况下RTC仍可以独立运行。RTC只支持LSE作为时钟源(32768);
支持3种中断类型:
[*]秒中断;
[*]溢出中断;
[*]定时中断;


主要寄存器:
[*]RTC控制寄存器 (RTC_CRH, RTC_CRL)
[*]RTC预分频装载寄存器 (RTC_PRLH, RTC_PRLL)
[*]RTC预分频余数寄存器 (RTC_DIVH, RTC_DIVL)
[*]RTC计数器寄存器 (RTC_CNTH, RTC_CNTL)
[*]RTC闹钟寄存器 (RTC_ALRH ,RTC_ALRL)
以上寄存器都有对应的函数来进行操作。执行逻辑:RTC_PRL(预分频装载寄存器)的值决定TR_CLK脉冲产生的周期,RTC_DIV(预分频器 余数寄存器)可读不可写,当RTCCLK的一个上升沿到来,RTC_DIV的值减1,减到0 后硬件重载为RTC_PRL的值同时产生一个TR_CLK脉冲,一个TR_CLK脉冲的到来会使 RTC_CNT(计数器寄存器)的值加1,同时产生一个RTC_Second中断(由软件配置是否 使能,“秒中断”并不一定是一秒触发一次,具体是根据RTC时钟和RTC_PRL的值决定)。当RTC_CNT的值溢出后从0开始,并产生一个溢出中断(由软件配置是否使能)。当 RTC_CNT等于RTC_CNTRTC_ALR(闹钟寄存器)时,产生一个闹钟中断(由软件配置是 否使能,可在用在系统待机模式下唤醒系统)。BKP备份寄存器:备份寄存器有16组16位的寄存器(每组2个)。可用来存储64个字节数据。它们处在备份区域,当VDD电源切断,仍然由VBAT维持供电。当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。一般用 BKP 来存储 RTC 的校验值或者记录一些重要的数据。
可通过以下两个函数接口来读写:
[*]RTC_WriteBackupRegister(uint16_t idx, uint16_t value)
[*]RTC_ReadBackupRegister(uint16_t idx)
RTC常用于三种定时:1. 秒中断RTC的秒中断功能类似SysTick系统滴答的功能。RTC秒中断功能其实是每计数一次 就中断一次。注意,秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决 定的“秒”的时间,当然也是可以做到1秒钟中断一次。通常通过函数 RTC_SetPrescaler(32768) 来进行设置。完整代码需要:
[*]RTC_Init(board_rtc_source());
[*]RTC_EnableInt(RTC_FLAG_SEC);
[*]RTC_SetPrescaler(32768);
[*]RTC_SetOutputMode(RTC_OUTPUT_CLOCK);
2. 溢出中断溢出中断是RTC_CNT的值溢出时触发的中断。3. 定时中断使用时一般设置秒中断周期为1s,用RTC_CNT计数器计数。假如1970设置为时间 起点为0s,通过当前时间的秒数计算得到当前的时间。RTC_ALR是设置闹钟时间, RTC_CNT计数到RTC_ALR就会产生计数中断。中断函数在SDK中已经默认关联,函数名:RTC_isr在中断函数中,需要先判断中断来源,再进行相应的处理。.十六、中断与异常RISC-V系统支持中断嵌套。但SDK中推荐(并默认)使用非嵌套中断方式,如果需要嵌套方式,请打开宏AGRV_NESTED_INTERRUPT。打开宏的方式,请在 platformio.ini 里通过 build_flags = -DAGRV_NESTED_INTERRUPT 来实现。使能中断可嵌套后,高优先级(数字越大优先级越高)的中断,会打断正在执行中的低优先级的中断。中断系统被封装在SDK的interrupt.c中,由INT_Init()函数来完成初始化。RISC-V有两套中断向量,分别对应于PLIC和CLINT。目前只有MTime是对应到CLINT 中断,其他都对应于PLIC中断。用户级别的中断设置,都通过函数INT_EnableIRQ(uint32_t irq, uint32_t priority)来设置使能。中断向量表和中断函数名都已内置定义。从用户角度,只需要设置中断使能即可使 用对应的中断函数。开关系统总中断函数:INT_EnableIntGlobal/INT_DisableIntGlobal系统中断向量表及中断函数名,可从AltaRiscv.h中查看。如:向量ID:TIMER0_IRQn中断函数:TIMER0_isr异常和中断都在这里处理。异常处理:如果程序运行中跑飞(进入异常中断函数exception_handler),可以参考专题(异常处理)。.IO口配置为外部中断的三种形式:EXT_INT 是低电平中断,不支持边沿触发。local int 是高电平中断,不支持边沿触发。如果要配置边沿触发,只能使用 GPIO中断。.EXT_INT的用法:EXT_INT是外部中断,在AG32中有8组可用。EXT_INT是低电平中断。使用方法:1.VE中配置对应引脚,如下图:

2.代码中使能该中断,配置中断函数。如下图:

以上两处配置完后,当PIN_51的电平变低后,将触发Eint_isr中断函数。使用特点:1.这个中断是不用清的。只要电平存在,中断就一直会进来。就算清了,执行完后,马上还会进来。电平置高,中断就不再进来。2.使用时,该引脚要配置成上拉。不然一启动可能就会进中断的。3.这个信号也可以从cpld过来。在VE里配置。(这时,VE里该信号不配置成PIN引脚,而配置成cpld信号).Local int的用法:Local int是从cpld接入mcu的信号。有4组可用。是高电平中断。

Local int不能配置为外部引脚接入,故无需在VE文件里配置。当cpld中设置local_int为高时,将触发mcu端的local int中断。mcu端使用如下:

注意:mcu不会缓存local_int的上升信号。当cpld给出的这个高电平脉冲太短,或者cpld置高期间mcu端正在处理其他中断,都会导致mcu漏掉该中断。
正常的做法是:1.cpld要触发mcu中断时,置高该信号 local_int = 1;2.Mcu触发中断后,要在中断里“通知”cpld,可以置低该信号。(这里的“通知”,可以是用gpio信号输出到cpld)这样“一来一回”的一个交互,是最安全的做法。.十七、系统休眠(sleep、stop、stanby)AG32支持3种休眠方式:sleep、stop、standby。代码样例参考example_system.c其中进入standby后,有三种唤醒方式:IWDG、RTC(Alarm)、WAKEUP(该引脚上升沿)。如果要使用低功耗,在系统进入休眠前,需要先关掉不需要的外设时钟。
内核电流大小:
[*]STOP mode: 5.5mA
[*]STANDBY mode:5uA
更多信息,请参考海振远科技提供的网盘资料。另外注意,standby的时候整个3.3v电源域是关掉的,这个时候cpld也就关掉了。想要 cpld运行的话只能进入stop。.十八、使用自定义的logic上边章节“ADC/DAC的使用”部分,描述了使用默认logic的方法。默认logic中只包含了ADC/DAC/CMP的功能,如果有额外需求,则需要构建自定义logic。在自定义logic中,可以编写cpld,为芯片增加更多的功能支持。构建的详细流程,更多样例,请参考海振远科技提供的网盘资料。在构建自定义logic时,需要platformio.ini中设置三项:

其中,ip_name 为新建的user_ip名字;logic_dir 为生成的文件夹名称;board_logic.ve 为生成自定义ip时共同使用的ve文件;
总结:三种情况(不用ADC、仅用ADC/DAC/CMP、使用更多的cpld功能),在platformio.ini 文件中的配置对比:1. 如果连默认ip都用不到(没有用ADC/DAC/CMP):只需要配置一项:
[*]board_logic.ve = project_xxx.ve
2. 如果仅用到默认ip(使用到ADC/DAC/CMP):需要配置两项:
[*]board_logic.ve = project_xxx.ve
[*]ip_name = analog_ip
3. 如果要用到自定义logic(需要更多的cpld功能):需要配置三项:
[*]board_logic.ve = project_xxx.ve
[*]ip_name = xxxxx_ip
[*]logic_dir = logic
关于自定义logic,这里仅是配置说明,更多信息参考cpld部分的说明。
补充信息:
AG32概述:
AG32系列32位微控制器旨在为MCU用户提供新的自由度和丰富的兼容外设以及兼容的引脚和功能。AG32产品系列提供卓越的品质、稳定性和非凡的价值。器件特征:■ 最大 CPU 速度为 248 MHZ■ 从 Flash 执行零等待■ SRAM 128KB.FLASH 1MB■ 支持浮点■ 1个CAN2.0.5个UART2个I2C■ 2 个基本定时器,5 个高级定时器■ 支持 SDIO 、以太网 MAC■ 支持 USB FS+OTG■ 看门狗■ 3个 12 位、最高 3M SPS ADC(17 通道)、2个 DAC■ 2x 比较器■ RTC, SPI■ 内置2KLE FPGA逻辑单元

联系海振远科技
页: [1]
查看完整版本: AGM AG32 MCU+FPGA 驱动使用(四)