#申请原创#
@21小跑堂
AG32开发板是一款基于国产异构双核 (RISC-V+FPGA) 处理器的开发板,它采用的是AG32VF407系列32位微控制器,相当于一个主频248MHz的MCU + 2KLES (FPGA) 。其内部是通过AHB总线,把MCU和FPGA链接在一起,在速度方面要比传统SPI快很多倍,它既可以单独运行,也可交互运行。其MCU在初始时是与STM32管脚相兼容,但在实际应用中是可以通过配置文件来灵活加以重定义的。 AG32开发板的整体开发工具由两部分构成,AG32开发板和AGM专用下载器,详见图1和图2所示。 图1 开发板
图2 下载器 该开发板的功能布局如图3所示,在初识状况下,其上电后除电源指示灯被点亮外,下方的4个绿色LED也在不停地闪烁,见图4所示。 图3 功能分布
图4 上电效果 那面对这样一款开发板该如何进行开发呢? 其开发工具主要由VSCODE、python及相应的sdk所构成,在进行cpld 开发时,还会用到quartus和supra。 在完成软件安装及配置后,打开VSCODE软件其界面如图5所示。 图5 界面形式 那又该如何在这款开发板上完成NTC温度测控记录功能呢? 1. 选取引脚并建立映射 为驱动串行数码管模块,所使用的引脚为:PIN_92、PIN_95及PIN_96。 为了通过串口来进行数据记录,所使用的引脚为:PIN_69和PIN_68。 为此需要example_board.ve中建立如下的映射关系: GPIO4_5 PIN_96 # CLK GPIO4_6 PIN_95 # DIN GPIO4_7 PIN_92 # CS UART0_UARTRXD PIN_69 UART0_UARTTXD PIN_68 有了以上的映射关系,在进行程序设计时就可以GPIO4_5的形式来使用 PIN_96这个引脚。 就AG32 而言,其芯片内部可向用户提供的GPIO可达 80 个,共分为 10 组,每组则有 8 个。 在代码中,各组对应着GPIO0、GPIO1、GPIO2、... GPIO9。 在各组内,其 IO 是用 bit 来表示,即GPIO_BIT0、GPIO_BIT1、GPIO_BIT2、... GPIO_BIT7。 2. 串行数码管显示驱动 这里所用的串行数码管模块是以MAX7219为主控芯片,可显示8位数值,并支持级联使用。除电源外,它只需3个GPIO口,故十分节省引脚资源,其外观如图6所示。 图6 串行数码管显示模块 为便于向串行数码管显示模块提供高低电平的输出,定义的语句为: #define CLK_SetLow GPIO_SetLow(GPIO4,GPIO_BIT5) #define CLK_SetHigh GPIO_SetHigh(GPIO4,GPIO_BIT5) #define DIN_SetLow GPIO_SetLow(GPIO4,GPIO_BIT6) #define DIN_SetHigh GPIO_SetHigh(GPIO4,GPIO_BIT6) #define CS_SetLow GPIO_SetLow(GPIO4,GPIO_BIT7) #define CS_SetHigh GPIO_SetHigh(GPIO4,GPIO_BIT7) 由于该串行数码管显示模块所使用的关键芯片为MAX7219,故为它配置了一个串行发送字节数据的函数,其内容为: void Write_Max7219_byte(char DATA)
{
char i;
CS_SetLow;
UTIL_IdleUs(10);
for(i=8;i>=1;i--)
{
CLK_SetLow;
if(DATA&0x80)
DIN_SetHigh;
else
DIN_SetLow;
UTIL_IdleUs(10);
DATA=(char)(DATA<<1);
CLK_SetHigh;
UTIL_IdleUs(10);
}
}
以函数Write_Max7219_byte()为基础,向指定地址发送数据的函数为: void Write_Max7219(char address,char dat)
{
CS_SetLow;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh;
}
对于该串行数码管显示模块,其初始化函数为: void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff);
Write_Max7219(0x0a, 0x02);
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x00);
}
要实现串行数码管显示模块的测试,相应的主程序为: int main(void)
{
board_init();
SYS_EnableAHBClock(APB_MASK_GPIO4);
GPIO_SetOutput(GPIO4,GPIO_BIT5);
GPIO_SetOutput(GPIO4,GPIO_BIT6);
GPIO_SetOutput(GPIO4,GPIO_BIT7);
Init_MAX7219();
Write_Max7219(1,1);
Write_Max7219(2,2);
Write_Max7219(3,3);
Write_Max7219(4,4);
Write_Max7219(5,5);
Write_Max7219(6,6);
Write_Max7219(7,7);
Write_Max7219(8,8);
while (1) ;
}
经程序编译及烧录ve和烧录程序,其运行效果如图7所示。 图7 显示效果图 这样,就完成了串行数码管模块的显示驱动,后面的数值显示就由它来完成,对NTC检测的温度值显示。 3. NTC温度检测与显示 NTC温度检测是建立在A/D数据采集的基础上,通过添加感温器件即可进行温度检测。 NTC是一种温度敏感器件,其阻值会随温度的升高而呈下降的热敏特性。 AG32开发板在外接NTC热敏电阻模块的情况下,可进行温度的检测,其电路如图8所示,它与开发板的连接如图9所示。 图8 测温电路
图9 电路连接 对于A/D数据采集,其涉及模拟电路,需要 fpga 部分的支持。 AG32 自带一套 fpga 逻辑(默认 ip), 在默认的 ip 中,支持 3 路 ADC 和 2 路 DAC,1 路比较器 CMP(双通道,可独立运行)。 在通常情况下,ADC 默认是宏关闭的。需在 platformio.ini 中使能默认的 ip。 在 platformio.ini 中的配置为: ip_name = analog_ip 在NTC温度检测模块与ADC的通道2(PIN_25)相连接的情况下,实现温度检测的与形式的函数为: void TestAdc(ADC_TypeDef *adc)
{
uint32_t u,V;
int channel = ADC_CHANNEL2;
ADC_SetChannel(adc, channel);
ADC_Start(adc, sclk_div);
ADC_WaitForEoc(adc);
printf(" channel %d: 0x%03x\n", channel - ADC_CHANNEL0, ADC_GetData(adc));
u=ADC_GetData(adc)*3300/0XFFF;
printf(" channel %d: %d\n", channel - ADC_CHANNEL0, u);
实现秒间隔均匀温度检测的函数为: void TestAnalog(void)
{
Init_MAX7219();
while (1) {
TestAdc(ADC0);
UTIL_IdleUs(1000e3);
}
}
实现温度检测与显示的主程序为: int main(void)
{
board_init();
TestAnalog();
}
经程序的编译及烧录ve和烧录程序,其运行效果如图10和图11所示。在手指接触NTC热敏电阻的外部铠甲时,可明显观察到温度在缓慢地上升。 图10 室温检测
图11 体温检测 4. 数据记录 为进行检测温度的记录,可使用串口数据记录模块来实现。 该数据记录模块是一种串口设备,在使用时其工作的波特率为9600bps,在接收到开发板所发送的数据时,就将数据完整地记录到TF卡的文件中。 串口数据记录模块与开发板的连接如图12所示,就是与开发板上的UART0相连。 图12 电路连接 为产生9600bps的波特率,需在platformio.ini文件中进行如下设置: build_flags = -DBAUD_RATE=9600 这样在编译和烧录后,即可通过串口调试工具来查看其记录的内容,见图13所示。 图13发送数据 在接入数据记录模块的情况下,其记录数据的状态如图14所示,即写指示灯在不停地闪亮,数据被不断地写入TF卡。
图14 数据记录状态 在结束数据记录后,通过读取TF卡可见到相应的记录文件,其文件名由“urc+数字串”构成,其记录文件的格式及内容如图15所示。 图9 记录格式及内容 这样就完整地实现了温度检测与记录功能,若进行温度控制,可在程序中添加一个限定值,当温度超过限定值时,就输出控制信号以停止加热过程,否则就启动加热过程。 由此可见,使用AG32开发板进行项目开发还是比较方便的,特点也较为鲜明!
|