【沁恒微CH32V307评估板试用体验】RTC时钟同步(3) - RISC-V MCU技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

崔建峰 关注 私信
[文章]

【沁恒微CH32V307评估板试用体验】RTC时钟同步(3)

*附件:RtcTest.zip* 接上篇:RTC时钟同步(2)https://bbs.elecfans.com/jishu_2296747_1_1.html


4、整体功能实现

下面将基于RTC的样例程序进行修改实现RTC的外部配置功能。由于RTC样例程序基本完成了RTC的各项功能,下面首先实现USART传输功能,在此使用USART2来实现。

(1)系统的通讯协议定义如下:

image.png

图9 RTC外部配置通讯协议

在上述通讯协议中,加入了地址与功能码,便于后期功能扩展。当使用RS422或RS485总线时,地址码就可以得到有效利用;当使用串口来控制系统其它逻辑时,比如擦除指定存储内容就可以利用功能码进行扩展。

系统的通讯采用一问一答的形式,主机进行配置,从机进行答复,答复时附带自身的地址码与应答的功能码。如果配置成功则回复OK,如果配置失败则回复NG。

(2)系统的通讯程序流程设计如下:

image.png

图10 USART DMA发送与接收程序流程设计

上述程序流程画的并不规范,尤其是接收数据逻辑,里面一些过程还给省略了,比如当得知功能码为0x01时,将关闭DMA,设置下次接收字节为5Byte,然后再打开DMA。大家看个热闹就好。在具体编程前,还可以画一下状态机,设定一些标志变量,然后再编写代码。

(3)程序实现过程

① 将XXXCH32V307EVTEXAM中的RTC文件夹复制并重命名为RTCTest,包括文件夹下的项目文件也进行重命名。

如果是移到其它文件夹下,需要进行以下配置

a) 修改c/C++ Build中的Refresh Policy,如图 11所示,修改为指定项目名

image.png

图11 项目配置1

b) 修改链接文件夹路径。

在MounRiver Studio的Project Explorer中,右键单击项目文件夹选属性,如图 12所示

image.png

图12 项目配置2

按图 13所示,新增SRC_LOC全局环境变量;SRC_LOC指向的是SRC文件夹。

image.png

图13 项目配置3

按图 14所示,将各链接文件夹指向正确路径

image.png

图14 项目配置4

说明:如果把XXXCH32V307EVTEXAMSRC文件夹拷贝到RTCTest文件夹下(当然也可以拷到RTCTest的父文件夹下,直接可以编译成功)。此时删除原有的Core、Debug、Ld、Peripheral、Startup链接文件夹。删除Startup下的startup_ch32v30x_D8.S,就可以编译链接成功。

image.png

image.png

图15 项目配置5

② 撰写USART相关代码

对于USART进行DMA接收与发送本以为现成的例程参考,但实际上还是费了些功夫。首先是打开DMA发送与接收中断。在例程中实现的只是DMA常规发送与接收,并没有涉及到DMA中断处理。为了打开中断,需要3步:

a)配置中断向量表

image.png

图16 配置中断向量表

b)在合适的代码处打开DMA的中断

image.png

图17 DMA中断使能

c)完善DMA中断处理函数

image.png

图18 DMA通道中断处理函数

至于为什么是DMA1的通道6与通道7请参考前面章节的叙述。

在USART2接口处理上,关键是接收中断函数的处理,在此处,根据前面的程序设计流程,要先1个字节1个字节去接,然后当获得相应的功能码后再批量获取后面的数据。因此,存在一个DMA接收过程中接收字节个数的变动问题。对于接收字节变动,在此专门写的一个函数进行实现:

image.png

图19 DMA接收过程中接收字节和接收位置调整

而接收程序主要逻辑写在DMA接收中断中,其中使用状态机方法进行主逻辑编写

image.png

image.png

图20 接收主程序与状态机宏定义

由于代码较多,大家参考一下附件中的程序。

中间的调试过程,嗯,此处省略………三千字,调试就是个熬人的事。

主要是对相关的开发板和库函数不熟悉,但整体感觉无论开发环境还是库函数的应用都是比较容易上手的。原来预计的两天完成,最后花了三天才做完,就是卡在了DMA中断上。以前没用过DMA来接串口,这次顺便挑战一下。

下面是测试装置连接图。

image.png

图21 实物连接图

唉呀,代码怎么加到附件中???怎么找不到上传的地儿?


【初试小结】

  • CH32V307从开发应用角度,相应的编程环境MounRiver和库的完善性还可以,比较易用。但MounRiver中查看芯片上寄存器数据好像没找到直接的接口,所以才在程序中利用变量做为中介来看。如果哪位大师知道,麻烦在评论中告知。
  • CH32V307同以前常用的ARM芯片相比,在引脚复用功能上相对简单一些,这点希望沁恒能再接再厉,做好芯片规划,让芯片更易用。国产,加油!
  • 后续如果有时间,更为关键的功能将陆续进行测试,但后续工作压的挺重,这三天的时间已经是硬抽出来的,欠债还钱,天经地义,再紧也要抽时间出来试试芯片与开发板。希望后续工作上能轻松些……

bandicam 2022-07-31 21-16-52-937

回帖(4)

崔建峰

2022-7-31 22:35:09
其实还有些小Bug:
(1)UTC时间还要再转一下本地时间
(2)串口还没有进行有效回复
(3)其实利用QT写个小程序,就可以实时获取UTC时间值,然后下发。

dianzi

2022-8-1 10:36:28
Dingtalk_20220801103235.jpg


可以把代码打包成压缩包,然后通过附件功能上传。
代码不多的话,可以直接用代码框功能。

dianzi

2022-8-1 10:37:47
国产,加油!

dskal

2022-8-1 10:55:21
感谢大佬分享!

更多回帖

×
发帖