stm32cubemx生成代码移植freemodbus

发布于 2019-04-14  587 次阅读


1、需要使能串口中断,需要使能一个定时器及其中断

2、根据源码,修改port文件夹下的c文件

3、串口初始化,串口接收中断回调,串口发送中断回调,接收函数,发送函数,串口中断使能函数和禁用函数

4、定时器初始化,定时器中断回调函数

5、关于串口波特率设置和定时器中断时间的计算。freemodbus内部有一个3.5T定时器时间,根据该个数可以计算出该波特率下的中断时间

usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate )

这里,usTimerT35_50us表示 3.5个字符,对应 50us的倍数,以波特率9600计算,刚刚理论计算为4ms左右,4000us/50us = 80

那么这个公式的计算结果是:usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ) = 7220000/(29600) = 80.2,这个值是无符号整型,所以就是80,看到这里就好奇,这个作者是怎么想到这么个通用公式的。

那么算出 80 以后怎么用呢,80代表的是80个 50us,这是作者为了移植方便,所以都用 50us作为基准,在具体使用的时候,刚说到要比t3.5稍微大点,大太多,反应慢,容易出错,作者给了一种方法:

usTimeoutMS = ( usTim1Timerout50us + 10 ) / 20;

其中 usTimeoutMS 就是要延时的ms数,还是以9600为例,那么定时器溢出时间为  (80+10)/20 = 4ms,然后移植者再根据自己的处理器,设置4ms的定时器溢出即可。

可以把定时器的计数时间设置为1ms,然后根据计算出来的值来设置定时器的重载值,这样就可以把定时器的中断时间设置为4ms一次。


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。