OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
楼主: 八度空间
打印 上一主题 下一主题

FreeModbus在STM32上移植

  [复制链接]

117

主题

7694

帖子

12

精华

资深版主

Rank: 8Rank: 8

积分
11322
金钱
11322
注册时间
2013-9-10
在线时间
380 小时
251#
 楼主| 发表于 2018-12-29 21:21:32 | 只看该作者
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

6

主题

36

帖子

1

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2018-12-5
在线时间
4 小时
252#
发表于 2019-1-3 11:15:03 | 只看该作者
多谢分享
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-9-11
在线时间
5 小时
253#
发表于 2019-1-23 11:12:33 | 只看该作者
移植了MODBUS
可是用MODBUS POLL连接显示一直是timeout error
希望有大佬帮忙看看代码
不知道问题出在了哪!求帮助
谢谢啦

0190123111153.png (56.06 KB, 下载次数: 2)

timeout error

timeout error

MODBUS测试.rar

8.66 MB, 下载次数: 4

回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-1-26
在线时间
6 小时
254#
发表于 2019-1-26 16:29:52 | 只看该作者
八度大神  新人小白 第一次接触到modbus  按照你的移植步骤移植以后发送0A 04 00 01 00 01 61 71 串口助手如图,也不知道问题出在哪了  好像是串口中断函数中的清中断有问题  也不知道怎么修改 ,还请不吝赐教


void
vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
    /* If xRXEnable enable serial receive interrupts. If xTxENable enable
     * transmitter empty interrupts.
     */
                if (xRxEnable)  //接收使能
                {
                        USART3->CR1 |=(1<<5); //使能接收中断
                       
                }
                else  //失能
                {
                        USART3->CR1 &=~(1<<5);  //失能接收中断
                }
                 
                if (xTxEnable)  //发送使能
                {
                        USART3->CR1 |=(1<<7);  //使能
                }
                else  //失能
                {
                        USART3->CR1 &=~(1<<7);  //使能
                }
       
}



BOOL
xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
{
        (void)ucPORT;  //不修改串口号
  (void)ucDataBits;  //不修改数据位长度
  (void)eParity;  //不修改检验格式
       
        u8 over; //过采样率
        float USARTDIV; //小数波特率
        u32 DIV_Mantissa; //小数波特率整数部分
        u32 DIV_Fraction; //小数波特率小数部分
       
        /************IO的配置 PB10 PB11 复用为USART3的功能************/
        //打开USART3的时钟
        RCC->APB1ENR|=(0x1<<18);
        //打开GPIOB时钟
        RCC->AHB1ENR |=(1<<1);
        //模式寄存器选择复用功能
        GPIOB->MODER &=~(0xf<<20);
        GPIOB->MODER |=(0xa<<20);
        //选择具体的复用功能 都复用成USART3
        GPIOB->AFR[1] &=~(0xff<<8);//清零
        GPIOB->AFR[1] |=(0x77<<8);//复用为USART3功能
       
        //打开串口使能
        USART3->CR1 |=(1<<13);
        //奇偶校验的选择(不使用)
        USART3->CR1 &=~(1<<10);
        //断路字符 不发送
        USART3->CR1 &=~(1<<0);
        //发送器使能
        USART3->CR1 |=(1<<3);
        //接收器使能
        USART3->CR1 |=(1<<2);
       
        /*****************小数波特率设置**********************/
        #ifdef USART3_OVER8  //采用16倍采样
                        USART3->CR1 &=~(1<<15);
                        over=0;
        #else   //采用8倍采样
                        USART1->CR1 |=(1<<15);
                        over=1;
       
        #endif
       
        USARTDIV=(float)42000000/(ulBaudRate*8*(2-over));
        DIV_Mantissa=USARTDIV;
        DIV_Fraction=(USARTDIV-DIV_Mantissa)*8*(2-over);
       
        //写入小数波特率寄存器中
        USART3->BRR=(DIV_Mantissa<<4|DIV_Fraction);
       
       
        /******************USART3中断************************/
        //打开接收中断
        USART3->CR1 |=(1<<5);
        //打开发送中断
        USART3->CR1 |=(1<<7);
        //设置优先级
                my_nvic_init(7-2, 0, 0, USART3_IRQn);
    return FALSE;
}


BOOL
xMBPortSerialPutByte( CHAR ucByte )
{
        //等待数据发送完成
        while((USART3->SR &(1<<6))==0){;}
        USART3->DR=ucByte;
    return TRUE;
}
BOOL
xMBPortSerialGetByte( CHAR * pucByte )
{
        //等待数据接受完成 SR  5位 如果改为 为 0 数据没有接收到 一直等待数据接收
        while((USART3->SR &(1<<5))==0){;}
        *pucByte=USART3->DR;
    return TRUE;
}

//USART3中断服务函数
void USART3_IRQHandler(void)
{
        if(USART3->SR&(1<<5))//接收中断
        {
                u8 data;
                prvvUARTRxISR();
                //清中断
                data=USART3->DR;
               
        }
        if(USART3->SR&(1<<7))//发送中断
        {
                prvvUARTTxReadyISR();
                //清中断
                USART3->DR=0x0000;
        }
       
}

/* ----------------------- Start implementation -----------------------------*/
BOOL
xMBPortTimersInit( USHORT usTim1Timerout50us )
{
       
        uint16_t psc = 0;
        psc = (uint16_t)((SystemCoreClock / 20000) - 1);
       
        //1.打开TIM4时钟
        RCC->APB1ENR |=(0x1<<2);
        //2.选择内部时钟
        TIM4->SMCR &=~(0x7<<0);
        //3.选择分频值
        TIM4->SC =psc-1;
        //4.写入自动重装载值
        TIM4->ARR =usTim1Timerout50us;
        //预装载使能
        TIM4->CR1 |=(0x1<<7);
        //5.选择计数方式 递增计数
        TIM4->CR1 &=~(0x1<<4);
        //6.关闭更新中断
        TIM4->DIER &=~(0x1<<0);
        //7.进入NVIC设置
        my_nvic_init(7-2,0,3,TIM4_IRQn);
        //8.关闭计数器使能
        TIM4->CR1 &=~(0x1<<0);
       
  return FALSE;
}


inline void
vMBPortTimersEnable(  )
{
    /* Enable the timer with the timeout passed to xMBPortTimersInit( ) */
        //打开更新中断
        TIM4->DIER |=(0x1<<0);
        TIM4->CNT=0;
        //打开计数器使能
        TIM4->CR1 |=(0x1<<0);
}

inline void
vMBPortTimersDisable(  )
{
    /* Disable any pending timers. */
        //关闭更新中断
        TIM4->DIER &=~(0x1<<0);
        TIM4->CNT=0;
        //关闭计数器使能
        TIM4->CR1 &=~(0x1<<0);
}

/* Create an ISR which is called whenever the timer has expired. This function
* must then call pxMBPortCBTimerExpired( ) to notify the protocol stack that
* the timer has expired.
*/
void prvvTIMERExpiredISR( void )
{
    ( void )pxMBPortCBTimerExpired(  );
}

void TIM4_IRQHandler(void)
{
        if((TIM4->DIER&(0x1<<0))!=0)
        {
                //清中断
               TIM4->SR &=~(1<<0);
                prvvTIMERExpiredISR();
        }


}  

QQ截图20190126162515.png (21.74 KB, 下载次数: 2)

QQ截图20190126162515.png
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-1-26
在线时间
6 小时
255#
发表于 2019-1-26 16:31:07 | 只看该作者
飞天神猪 发表于 2019-1-26 16:29
八度大神  新人小白 第一次接触到modbus  按照你的移植步骤移植以后发送0A 04 00 01 00 01 61 71 串口助手 ...

用的是232通信
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-1-26
在线时间
6 小时
256#
发表于 2019-1-26 16:54:01 | 只看该作者
飞天神猪 发表于 2019-1-26 16:29
八度大神  新人小白 第一次接触到modbus  按照你的移植步骤移植以后发送0A 04 00 01 00 01 61 71 串口助手 ...

串口初始化和定时器初始化返回值我返回的都是TURE 还是跟原来的一样
回复 支持 反对

使用道具 举报

117

主题

7694

帖子

12

精华

资深版主

Rank: 8Rank: 8

积分
11322
金钱
11322
注册时间
2013-9-10
在线时间
380 小时
257#
 楼主| 发表于 2019-1-27 13:50:47 | 只看该作者
飞天神猪 发表于 2019-1-26 16:54
串口初始化和定时器初始化返回值我返回的都是TURE 还是跟原来的一样

单步跟踪一下看看
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-1-26
在线时间
6 小时
258#
发表于 2019-1-28 10:22:46 | 只看该作者
初始化完成后先进入定时器中断,然后串口发送数据进入接收中断,接着进入如图的红框1的函数,随后进入发送中断 ,进入如图的函数中的红框2部分,最后进入定时器中断,结束。 问题是出在了红框2函数那一部分吗 ?

QQ截图.png (53.35 KB, 下载次数: 3)

QQ截图.png

QQ截图20190126162515.png (51.47 KB, 下载次数: 4)

QQ截图20190126162515.png
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-1-26
在线时间
6 小时
259#
发表于 2019-1-28 10:58:23 | 只看该作者
我用你的源码修改了一下    把USART2 修改成了USART3  其他的没动, 结果发送数据后进入串口中断后也进入了上图红框1的部分  后面进入定时中断就没反映了   也没有收到回发的数据, 我用的是407VGT6  按理说应该跟ZET6是兼容的吧   晶振分频那里改过了, 也不知道哪里出了问题  
回复 支持 反对

使用道具 举报

117

主题

7694

帖子

12

精华

资深版主

Rank: 8Rank: 8

积分
11322
金钱
11322
注册时间
2013-9-10
在线时间
380 小时
260#
 楼主| 发表于 2019-1-30 12:59:19 | 只看该作者
飞天神猪 发表于 2019-1-28 10:58
我用你的源码修改了一下    把USART2 修改成了USART3  其他的没动, 结果发送数据后进入串口中断后也进入了 ...

初始化会有一次进入定时器中断的,这个没错,你定时器初始化的代码贴出来看看
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-1-26
在线时间
6 小时
261#
发表于 2019-2-12 13:21:27 | 只看该作者
八度空间 发表于 2019-1-30 12:59
初始化会有一次进入定时器中断的,这个没错,你定时器初始化的代码贴出来看看

定时器初始化代码是你自己的 我没动过  我就用你的源码改的  就把串口号改了一下 其他的没动
回复 支持 反对

使用道具 举报

117

主题

7694

帖子

12

精华

资深版主

Rank: 8Rank: 8

积分
11322
金钱
11322
注册时间
2013-9-10
在线时间
380 小时
262#
 楼主| 发表于 2019-2-20 20:01:59 | 只看该作者
飞天神猪 发表于 2019-2-12 13:21
定时器初始化代码是你自己的 我没动过  我就用你的源码改的  就把串口号改了一下 其他的没动

哦,那就奇怪了,你下载我的能跑啵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-11-24
在线时间
2 小时
263#
发表于 2019-2-28 20:40:57 | 只看该作者
shiqinghai 发表于 2016-6-14 16:35
搞定了,提供的工程里面没加void __aeabi_assert(const char * x1, const char * x2, int x3){}这段代码 ...

大神,能不能告诉我一下,开发板上怎么接线吗?
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-3-25
在线时间
6 小时
264#
发表于 2019-3-26 08:53:36 | 只看该作者
我按照楼主的方法移植到精英版上,不知道为啥没返回数值,有大佬版帮忙看看吗

实验24 485实验.zip

6.81 MB, 下载次数: 8

回复 支持 反对

使用道具 举报

117

主题

7694

帖子

12

精华

资深版主

Rank: 8Rank: 8

积分
11322
金钱
11322
注册时间
2013-9-10
在线时间
380 小时
265#
 楼主| 发表于 2019-4-4 22:30:00 | 只看该作者
6Vision 发表于 2019-3-26 08:53
我按照楼主的方法移植到精英版上,不知道为啥没返回数值,有大佬版帮忙看看吗

不会吧,我项目中都用了很久了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-3-25
在线时间
6 小时
266#
发表于 2019-4-11 21:08:06 | 只看该作者
八度空间 发表于 2019-4-4 22:30
不会吧,我项目中都用了很久了

谢谢大佬  已经调试好了 不知道大神可有主机程序 我项目是做一个主机 对多个从机
回复 支持 反对

使用道具 举报

6

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2015-1-10
在线时间
31 小时
267#
发表于 2019-4-12 09:25:43 | 只看该作者

感谢八度哥,庆幸我每一楼都看了一下。
回复 支持 反对

使用道具 举报

117

主题

7694

帖子

12

精华

资深版主

Rank: 8Rank: 8

积分
11322
金钱
11322
注册时间
2013-9-10
在线时间
380 小时
268#
 楼主| 发表于 2019-4-21 11:39:52 | 只看该作者
6Vision 发表于 2019-4-11 21:08
谢谢大佬  已经调试好了 不知道大神可有主机程序 我项目是做一个主机 对多个从机

我用C#做的上位机主机,目前用着还没什么问题
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

6

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2015-7-4
在线时间
36 小时
269#
发表于 2019-4-22 16:21:14 | 只看该作者
好东西,顶起来
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-4-8
在线时间
5 小时
270#
发表于 2019-4-23 11:41:20 | 只看该作者
mark。。! 学习了!
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2018-5-26
在线时间
69 小时
271#
发表于 2019-6-6 11:23:22 | 只看该作者
本帖最后由 SJL128549 于 2019-6-6 11:24 编辑

原子哥,把你的程序移植到F1上,返回值有错误。显示非法装载值,不知道怎么回事

微信图片_20190606112341.png (29.39 KB, 下载次数: 0)

微信图片_20190606112341.png
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-7-22
在线时间
7 小时
272#
发表于 2019-6-7 22:26:36 | 只看该作者
有人往f103上移植过嘛?单步调试,ucRTUBuf数组能收到串口发来的数据,也能更新出往回发送的数,可是串口助手就是收不到呀,,,?
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-7-22
在线时间
7 小时
273#
发表于 2019-6-8 13:26:12 | 只看该作者
高德辛 发表于 2019-6-7 22:26
有人往f103上移植过嘛?单步调试,ucRTUBuf数组能收到串口发来的数据,也能更新出往回发送的数,可是串口助 ...

接受引脚配置错误,已解决
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2018-5-26
在线时间
69 小时
274#
发表于 2019-6-11 11:04:36 | 只看该作者
高德辛 发表于 2019-6-8 13:26
接受引脚配置错误,已解决

你好,你在F1上移植对了吗?可不可以共享一下,我的一直返回数据错误
回复 支持 反对

使用道具 举报

0

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2012-6-27
在线时间
9 小时
275#
发表于 2019-6-13 12:01:56 | 只看该作者
学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

正点原子STM32/FPGA资料免费下载上一条 /1 下一条

正点原子公众号

QQ|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2019-7-12 20:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
三级片电影