注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

wo4fisher的个人空间 http://home.eeworld.com.cn/space-uid-296469.html [收藏] [复制] [分享] [RSS]

日志

[GD32F350]第四弹:modbusRTU协议实现

已有 69 次阅读2018-9-9 23:52 |个人分类:GD32

1、继上一帖之后,本帖实现modbusRTU客户端,用于和威伦触摸屏的数据通信。
上一帖实现功能:usart DMA方式发送数据和利用usart的IDLE中断来接收不定长字节数据。
本帖是实现基本的MODBUS RTU协议数据解析、数据处理和数据返回。
实现了基本的线圈读写、寄存器读写功能,主要有功能码0x01、0x03、0x05、0x06、0x010。

[attachimg]374755[/attachimg]
功能测试:
[attachimg]374756[/attachimg]
使用MODBUS RTU协议格式发送数据到GD32后,GD32返回的调试信息。
[attachimg]374757[/attachimg]
使用modscan来连续读取GD32模拟线圈数据,这里传送两个字节的位状态,也就是16位,其中高8位为0x33,低8位位0x66,动图里是建立连接以及读取数据的过程,可以看出,GD32和modscan通信正常。
相关代码随后在作品提交时一并附上。
2、利用systick查询方式实现delay_us()和delay_ms()
GD32的systick时钟由AHB的8分频提供。
systick的初始化:
  1. void delay_init()
  2. {
  3.   fac_us=rcu_clock_freq_get(CK_AHB)/8000000;        //为AHB时钟的1/8  
  4.     fac_ms=(u32)rcu_clock_freq_get(CK_AHB)/8000;//代表每个ms需要的systick时钟数
  5.     SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
  6. }
复制代码

delay_us()函数实现:
  1. void delay_us(u32 nus)
  2. {
  3.     u32 temp;
  4.     SysTick->LOAD =(u32)nus*fac_us-1; //时间加载
  5.     SysTick->VAL   = 0UL;          //清空计数器
  6.     SysTick->CTRL  = SysTick_CTRL_ENABLE_Msk;
  7.     do
  8.     {
  9.         temp=SysTick->CTRL ;
  10.     }
  11.     while(temp&0x01&&!(temp&SysTick_CTRL_COUNTFLAG_Msk));//等待时间到达
  12.     SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
  13.     SysTick->VAL =0X00;       //清空计数器
  14. }
复制代码

delay_ms()实现:
  1. void delay_ms(u16 nms)
  2. {
  3.     u32 temp;
  4.     SysTick->LOAD=(u32)((u32)nms*fac_ms-1);//时间加载(SysTick->LOAD为24bit)
  5.     SysTick->VAL =0x00;           //清空计数器
  6.     SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
  7.     do
  8.     {
  9.         temp=SysTick->CTRL;
  10.     }
  11.     while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
  12.     SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
  13.     SysTick->VAL =0X00;       //清空计数器
  14. }
复制代码

3、关于GD32F350的bitband操作

[attachimg]374759[/attachimg]
在STM32中用到过位带操作来设置gpio输出状态或者读取gpio引脚输入状态。
[attachimg]374760[/attachimg]
调了一下午,GD32F350的gpio_base地址在0x4800 0000开始的地方,GD32F350片上外设是从0x40000000~0x40100000之间才可用位绑定,而GPIO的基地址远远超过了0x40100000,也就是说,GPIO不能用位绑定。
下一贴,gd32定时器中断设置。

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-10-24 10:52 , Processed in 0.015051 second(s), 10 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2018 http://bbs.eeworld.com.cn/

返回顶部