*附件:RtcTest.zip* 接上篇:RTC时钟同步(2)https://bbs.elecfans.com/jishu_2296747_1_1.html
下面将基于RTC的样例程序进行修改实现RTC的外部配置功能。由于RTC样例程序基本完成了RTC的各项功能,下面首先实现USART传输功能,在此使用USART2来实现。
(1)系统的通讯协议定义如下:
图9 RTC外部配置通讯协议
在上述通讯协议中,加入了地址与功能码,便于后期功能扩展。当使用RS422或RS485总线时,地址码就可以得到有效利用;当使用串口来控制系统其它逻辑时,比如擦除指定存储内容就可以利用功能码进行扩展。
系统的通讯采用一问一答的形式,主机进行配置,从机进行答复,答复时附带自身的地址码与应答的功能码。如果配置成功则回复OK,如果配置失败则回复NG。
(2)系统的通讯程序流程设计如下:
图10 USART DMA发送与接收程序流程设计
上述程序流程画的并不规范,尤其是接收数据逻辑,里面一些过程还给省略了,比如当得知功能码为0x01时,将关闭DMA,设置下次接收字节为5Byte,然后再打开DMA。大家看个热闹就好。在具体编程前,还可以画一下状态机,设定一些标志变量,然后再编写代码。
(3)程序实现过程
① 将XXXCH32V307EVTEXAM中的RTC文件夹复制并重命名为RTCTest,包括文件夹下的项目文件也进行重命名。
如果是移到其它文件夹下,需要进行以下配置
a) 修改c/C++ Build中的Refresh Policy,如图 11所示,修改为指定项目名
图11 项目配置1
b) 修改链接文件夹路径。
在MounRiver Studio的Project Explorer中,右键单击项目文件夹选属性,如图 12所示
图12 项目配置2
按图 13所示,新增SRC_LOC全局环境变量;SRC_LOC指向的是SRC文件夹。
图13 项目配置3
按图 14所示,将各链接文件夹指向正确路径
图14 项目配置4
说明:如果把XXXCH32V307EVTEXAMSRC文件夹拷贝到RTCTest文件夹下(当然也可以拷到RTCTest的父文件夹下,直接可以编译成功)。此时删除原有的Core、Debug、Ld、Peripheral、Startup链接文件夹。删除Startup下的startup_ch32v30x_D8.S,就可以编译链接成功。
图15 项目配置5
② 撰写USART相关代码
对于USART进行DMA接收与发送本以为现成的例程参考,但实际上还是费了些功夫。首先是打开DMA发送与接收中断。在例程中实现的只是DMA常规发送与接收,并没有涉及到DMA中断处理。为了打开中断,需要3步:
a)配置中断向量表
图16 配置中断向量表
b)在合适的代码处打开DMA的中断
图17 DMA中断使能
c)完善DMA中断处理函数
图18 DMA通道中断处理函数
至于为什么是DMA1的通道6与通道7请参考前面章节的叙述。
在USART2接口处理上,关键是接收中断函数的处理,在此处,根据前面的程序设计流程,要先1个字节1个字节去接,然后当获得相应的功能码后再批量获取后面的数据。因此,存在一个DMA接收过程中接收字节个数的变动问题。对于接收字节变动,在此专门写的一个函数进行实现:
图19 DMA接收过程中接收字节和接收位置调整
而接收程序主要逻辑写在DMA接收中断中,其中使用状态机方法进行主逻辑编写
图20 接收主程序与状态机宏定义
由于代码较多,大家参考一下附件中的程序。
中间的调试过程,嗯,此处省略………三千字,调试就是个熬人的事。
主要是对相关的开发板和库函数不熟悉,但整体感觉无论开发环境还是库函数的应用都是比较容易上手的。原来预计的两天完成,最后花了三天才做完,就是卡在了DMA中断上。以前没用过DMA来接串口,这次顺便挑战一下。
下面是测试装置连接图。
图21 实物连接图
唉呀,代码怎么加到附件中???怎么找不到上传的地儿?
【初试小结】
更多回帖