简 介:本文介绍了STC32G144K246高性能微控制器及其开源库在智能车竞赛中的应用。该芯片相比前代STC32G12K显著提升了硬件资源,包括6组16位PWM定时器、14个24位定时器和8组USART串口,解决了资源瓶颈问题。开源库优化了延时精度、串口灵活性和下载方式,新增了总钻风摄像头采集和SPI-WIFI图传功能,后者通过DMA传输可达3.9MB/s速率。文章详细说明了开源库的目录结构、驱动层功能模块及常用外设适配,并通过编码器采集示例展示了库的使用方法,为参赛者提供了开发支持。
关键词:STC32G144,开源库,逐飞科技
01开源库:STC32G144K246
0、前言
参加第21届智能车竞赛的车友们好,第二十届智能汽车竞赛竞速赛规则已经发布,从竞速赛规则中大家已经知道今年的飞檐走壁、雁过留痕组的主控限定使用STC的微控制器,蚂蚁搬家组可选用。雁过留痕组其实是传统的摄像头组的演变,首次用到了STC的单片机在需要使用摄像头的组别做主控,STC也推出了他们的高性能MCU:STC32G144K
我们应该是最先拿到样品的用户之一,拿到样品后,首先肯定是如何采集摄像头图像,解决了这个刚需之后。我们便着手编写对应的开源库。方便大家使用该芯片进行开发,为大家的参赛之路提供支撑。该芯片相比STC32G12K硬件资源显著增加,不仅解决了旧款芯片的资源瓶颈,还新增了多项实用功能。下面先对其进行简单介绍。
一、硬件资源提升
STC32G144K搭载六组16位高级PWM定时器(均支持正交解码)、14个24位定时器/计数器以及8组USART串口。此前STC32G12K的PWM接口虽支持正交编码器采集,但受限于资源,比赛中启用该功能后,便无法再用PWM接口驱动电机;而STC32G144K的充足资源可同时满足正交编码器采集与电机驱动需求。
二、基础功能优化
2.1 、延时功能
旧版STC32G12K库采用软件模拟延时,存在精度不足问题;新版 STC32G144K_100Pin库改用定时器11实现系统延时,提升了延时准确性。
2.2 、串口使用
STC32G系列串口需依赖定时器作为波特率发生器。旧款STC32G12K因资源紧张,库中固定用定时器2为所有串口提供波特率发生器,导致多串口同时使用时波特率必须一致;STC32G144K_100Pin资源充裕,每个串口可独立绑定定时器,各串口波特率可灵活设置。
2.3 、下载方式
此前一直使用USB转串口下载,当单片机编译的hex文件较大时,下载速度较慢。STC32G144K改为USB下载,且支持无需按按键即可下载,经测试,USB下载非常稳定。
三、开源库新增核心功能
本次为STC32G144K_100Pin库新增两项关键功能。
3.1 、总钻风图像采集功能
开源库已实现总钻风摄像头的采集驱动,并支持通过TCP协议将采集图像传输至PC端进行显示。
▲ 图1.4.1 总钻风图像采集以及显示结果3.2 、SPI-WIFI 图传模块
该驱动采用SPI-DMA传输机制,DMA控制器可自主完成数据搬移,无需占用CPU资源,保障系统并行处理能力。实测数据显示,该模块在STC32G144K_100Pin硬件平台上通过TCP协议传输数据时,速率可达3.9MB/S;针对188×120分辨率的总钻风图像,理论传输帧率最高可达170+FPS。需说明的是,总钻风摄像头的图像采集过程存在固有耗时,实际应用中帧率无法达到上述理论值,该测试数据仅用于验证SPI-WiFi模块的传输性能。
▲ 图1.4.2 WiFI图像性能测试四、STC32G144K_100Pin逐飞开源库简介
STC32G144K_100Pin逐飞开源库使用单片机寄存器作为最底层。然后将各个模块使用的寄存器进行封装,提升易用性。若有同学有更多需求,发现库的现有功能不满足自己使用需求时,可以采用同样的方式自己调用寄存器来实现所需要的功能。因此,大家也可以通过查看逐飞开源库底层来了解单片机的寄存器怎么使用,当自己学会怎么使用官方的寄存器之后也可以直接使用寄存器,这样的好处是没有多余的代码,降低自己代码的体积,提高效率。制作开源库的目的是希望初学者不被直接操作寄存器这个门槛给拦在外面,逐飞开源库只是提供一个入门学习的渠道,方便大家快速地将STC的新产品用起来。
4.1 、STC32G144K_100Pin逐飞开源库目录接口
roject/code:文件夹下放置的是用户自己添加的代码文件,当用户自己添加文件的时候我们建议全部添加在这个文件夹内;
roject/mdk:文件夹下放置的是MDK的工程文件(需要注意的是必须要使用 MDK FOR C251 才能正常进行编译);
roject/user:文件夹下放置的是main.c、isr.h、isr.c文件;
libraries/doc:文件夹下放置的是 STC32G144K_100Pin 逐飞开源库版本文档等;
libraries/zf_common:文件夹下放置的是逐飞科技编写的基于芯片的公共层源码,包括时钟、调试、中断配置接口等;
libraries/zf_components:文件夹下放置的是基于STC32G144K_100Pin逐飞开源库实现的功能组件库;
libraries/zf_driver:文件夹下放置的是逐飞V3库的驱动层,包含智能车需求范围内的各种芯片驱动,比如PWM输出、PIT定时中断、编码器数据采集、ADC模数转换采集、GPIO及外部中断、UART串口通讯、SPI通讯等;
libraries/zf_device:文件夹下放置的是逐飞V3库的设备层,包含逐飞科技的各类外设模块,只需要简单调用函数即可驱动模块实现相应功能。目前已添加TOF激光测距、各类在售陀螺仪、各类在售型号的屏幕、无线串口、SPI_WIFI图传模块、总钻风摄像头等;
4.2 、zf_driver驱动层详细说明
目前逐飞STC32G144K_100Pin库实现了芯片中ADC、GPIO、FLASH、UART、SPI、PIT、ENCODER、PWM、DELAY功能模块的使用。
ADC模块:将指定引脚初始化为AD模拟输入功能,用于采集外部电压模拟量输入;
GPIO模块:将指定的引脚初始化为指定功能,用于引脚的配置与操作;
FLASH模块:对指定的扇区指定的页的内部FLASH进行读或写的操作;
UART模块:是将对应UART选择对应的引脚并初始化,并通过函数进行数据收发;
SPI模块:将对应SPI选择对应的引脚并初始化,并通过函数进行数据交换;
PIT模块:通过定时器模块,实现周期中断功能;
ENCODER模块:使用PWM模块和TIM模块共同组成,PWM模块做编码器采集支持正交编码器和方向编码器。TIM模块仅支持方向编码器采集。通过 TIM 模块将外部引脚配置为输入捕获模式,实现方向编码器的采集解码,该方式仅支持带方向的编码器解码。
PWM模块:通过专用的PWM模块,拥有6组高级PWM定时器,每一组定时器可以输出4个通道,每一个通道可以切换3个或者4个引脚;
DELAY模块:通过TIM11实现的硬件延时模块,可提供毫秒与微秒级别精准延时。
4.3、常用外设模块适配
在逐飞STC32G144K_100Pin开源库的zf_device目录下包含常用的外设模块,开源库对这些模块提供了底层程序适配,用户可以非常方便的调用函数使用,模块目录如下:
五、使用示例
接下来我们通过一个示例来简单演示STC32G144K_100Pin逐飞开源库如何使用。
示例:编码器数据采集。
//****************************代码区域****************************#define WIFI_SSID_TEST "AAAAA"#define WIFI_PASSWORD_TEST "12345678" // 如果需要连接的WIFI 没有密码则需要将 这里 替换为 NULLvoid main(void){clock_init(SYSTEM_CLOCK_96M);//时钟配置及系统初始化<务必保留>debug_init();//调试串口信息初始化while(wifi_spi_init(WIFI_SSID_TEST,WIFI_PASSWORD_TEST)){printf("\r\n connect wifi failed. \r\n");system_delay_ms(100);//初始化失败 等待 100ms}printf("\r\n module version:%s \r\n",wifi_spi_version);//模块固件版本 printf("\r\n module mac :%s \r\n",wifi_spi_mac_addr);//模块 MAC 信息 printf("\r\n module ip :%s \r\n",wifi_spi_ip_addr_port);//模块 IP 地址//使用高速 WIFI SPI模块时无法使用屏幕(因为引脚有共用)//使用高速 WIFI SPI模块时无法使用屏幕(因为引脚有共用)//使用高速 WIFI SPI模块时无法使用屏幕(因为引脚有共用)//zf_device_wifi_spi.h 文件内的宏定义可以更改模块连接(建立)WIFI 之后,是否自动连接 TCP 服务器、创建 UDP 连接、创建 TCP 服务器等操作if(1!=WIFI_SPI_AUTO_CONNECT)//如果没有开启自动连接 就需要手动连接目标 IP{while(wifi_spi_socket_connect(//向指定目标 IP 的端口建立 TCP 连接"TCP",//指定使用TCP方式通讯 WIFI_SPI_TARGET_IP,//指定远端的IP地址,填写上位机的IP地址 WIFI_SPI_TARGET_PORT,//指定远端的端口号,填写上位机的端口号,通常上位机默认是8080WIFI_SPI_LOCAL_PORT))//指定本机的端口号{//如果一直建立失败 考虑一下是不是没有接硬件复位 printf("\r\n Connect TCP Servers error, try again. \r\n");system_delay_ms(100);//建立连接失败 等待 100ms}}//逐飞助手初始化 数据传输使用高速WIFI SPI seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI);//此处编写用户代码 例如外设初始化代码等while(1){//写入需要发送的数据,有几个通道就写多少个数据//这里仅写入4个通道数据 seekfree_assistant_oscilloscope_data.dat[0]+=0.1;seekfree_assistant_oscilloscope_data.dat[1]+=0.5;seekfree_assistant_oscilloscope_data.dat[2]+=1;seekfree_assistant_oscilloscope_data.dat[3]+=2;//设置本次需要发送几个通道的数据 seekfree_assistant_oscilloscope_data.channel_num=4;//这里进发送了4个通道的数据,最大支持8通道 seekfree_assistant_oscilloscope_send(&seekfree_assistant_oscilloscope_data);system_delay_ms(20);//有可能会在逐飞助手软件上看到波形更新不够连续,这是因为使用WIFI有不确定的延迟导致的//解析上位机发送过来的参数,解析后数据会存放在seekfree_assistant_oscilloscope_data数组中,可以通过在线调试的方式查看数据//例程为了方便因此写在了主循环,实际使用中推荐放到周期中断等位置,需要确保函数能够及时的被调用,调用周期不超过20ms seekfree_assistant_data_analysis();//此处编写需要循环执行的代码}}//****************************代码区域****************************六、总结
使用过逐飞开源库的同学看完上面的介绍一定很熟悉啦,没使用过的小白也完全不用担心,使用逐飞开源库来进行开发的底层工作变得非常简单。但需要再次声明,我们做开源库的目的是为了让初学者能通过这份学习资料快速上手,能尽快让单片机跑起来,用起来,不被门槛拦在外面,尽快入门。因为想要把一块全新的单片机使用起来,的确需要多查阅一些资料,去学习怎么使用这些单片机的资源,我们做的工作也仅限于方便初学者能多一条路子把单片机用起来。同时,我们也鼓励学有余力的车友们自己开发底层,这个过程会让你积累很多嵌入式开发的技能和知识。
最后,接下来附上开源链接,还没下载使用的同学们应该迫切的想知道开源库在哪里下载吧。
逐飞STC32G144K_100Pin开源库链接:https://gitee.com/seekfree/STC32G144K246_100Pin_Library
逐飞STC32G144K_100Pin核心板已同步上架逐飞科技淘宝店(https://seekfree.taobao.com),在使用开源库的同时也欢迎大家多多支持,你们的支持是我们开源的动力,感谢各位!
本期推文STC32G144K_100Pin逐飞开源库介绍就到这里了,大家在使用库的过程中如果遇到疑问或BUG,请及时联系我们,我们将尽快解答或修复。PS:可通过QQ群咨询交流或在本文后留言交流,QQ群技术交流平台(STC雁过留痕组交流群:700507120)。
也欢迎各位持续关注“逐飞科技”微信公众号,逐飞的开源项目、技术分享及智能车竞赛的相关信息更新都会在该公众号上发布,点击下方通道或识别下方二维码即可关注。
● 相关图表链接:
- 图1.4.1 总钻风图像采集以及显示结果
- 图1.4.2 WiFI图像性能测试