打印
[STM32F0]

STM32F070芯片USART1+DMA方式实现MODBUS通信(波特率自适应)

[复制链接]
6524|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32F070芯片USART1+DMA方式实现MODBUS通信(波特率自适应)
学习STM32也差不多有一年了,自认在这一年中对STM32有了一定的了解,所以今天分享下自己的所学。
废话不多说,简单说下要上传的应用范例是基于STM32F070的USART1+DMA方式实现MODBUS通信(03和10指令),并且自动匹配上位机通信波特率。
工程文件见如下所示:
AutoBaudRate.rar (4.26 MB)

下面是基于Modbus Poll的测试图:

沙发
forgot| | 2015-12-3 19:54 | 只看该作者
谢谢分享

使用特权

评论回复
板凳
acguy| | 2015-12-7 07:06 | 只看该作者
说下原理,曾经想做个,自适应波特率,校验位,停止位,485极性,思路就是试错,收到一个有效帧为终结。uart硬件的波特率检测似乎用不上。

使用特权

评论回复
地板
yklstudent|  楼主 | 2015-12-7 15:31 | 只看该作者
移植的官网的UART串口波特率自适应的例程,主要在
INT8U AutoBaudRate_StartBitMethod(void)
{
        INT8U lubResult = 0;
        static INT8U lubTaskID = 0;
       
        switch(lubTaskID)
        {
                case 0:
                {
                        /* Configure the AutoBaudRate method */
                        USART_AutoBaudRateConfig(cCOM1, USART_AutoBaudRate_StartBit);
                       
                        /* Enable AutoBaudRate feature */
                        USART_AutoBaudRateCmd(cCOM1, ENABLE);
                       
                        /* Wait until Receive enable acknowledge flag is set */
                        while(USART_GetFlagStatus(cCOM1, USART_FLAG_REACK) == RESET);
                       
                        /* Wait until Transmit enable acknowledge flag is set */
                        while(USART_GetFlagStatus(cCOM1, USART_FLAG_TEACK) == RESET);
                        lubTaskID = 1;
                        break;
                }
                case 1:
                {
                        /* Loop until the end of Autobaudrate phase */
                        if(USART_GetFlagStatus(cCOM1, USART_FLAG_ABRF) != RESET)
                                lubTaskID = 2;
                        break;
                }
                case 2:
                {
                        /* If AutoBaudRate error occurred */
                        if(USART_GetFlagStatus(cCOM1, USART_FLAG_ABRE) == RESET)
                        {
                                /* Wait until RXNE flag is set */
                                while(USART_GetFlagStatus(cCOM1, USART_FLAG_RXNE) == RESET);
                               
                                /* Wait until TXE flag is set */
                                while(USART_GetFlagStatus(cCOM1, USART_FLAG_TXE) == RESET);
                               
                                /* Send received character */
                                USART_SendData(cCOM1, USART_ReceiveData(cCOM1));
                               
                                /* clear the TE bit */
                                //USART_DirectionModeCmd(cCOM1, USART_Mode_Tx, DISABLE);
                               
                                /* Check the Transfer Complete Flag */
                                while(USART_GetFlagStatus(cCOM1, USART_FLAG_TC) == RESET);
                        }
                       
                        /* Disable AutoBaudRate feature */
                        USART_AutoBaudRateCmd(cCOM1, DISABLE);
                       
                        /* Disable USART */
                        USART_Cmd(cCOM1, DISABLE);
                        lubResult = 1;
                        break;
                }
                default:
                        break;
        }
       
        return (lubResult);
}

使用特权

评论回复
5
chinamaken| | 2016-1-21 10:49 | 只看该作者
楼主真牛,请问楼主用过STM32F070F6么

使用特权

评论回复
6
yklstudent|  楼主 | 2016-1-21 13:39 | 只看该作者
chinamaken 发表于 2016-1-21 10:49
楼主真牛,请问楼主用过STM32F070F6么

抱歉,只接触过STM32F070R8

使用特权

评论回复
7
chinamaken| | 2016-1-21 13:47 | 只看该作者
yklstudent 发表于 2016-1-21 13:39
抱歉,只接触过STM32F070R8

请问楼主,是如何烧写程序的?谢谢

使用特权

评论回复
8
yklstudent|  楼主 | 2016-1-21 16:36 | 只看该作者
chinamaken 发表于 2016-1-21 13:47
请问楼主,是如何烧写程序的?谢谢

JLINK或者STLINK烧录,具体接口方式看硬件

使用特权

评论回复
9
chinamaken| | 2016-1-25 17:06 | 只看该作者
yklstudent 发表于 2016-1-21 16:36
JLINK或者STLINK烧录,具体接口方式看硬件

谢谢,我这是通过串口烧写程序的,因为没有JTAG口和SWD接口。

使用特权

评论回复
10
yklstudent|  楼主 | 2016-1-25 17:16 | 只看该作者
chinamaken 发表于 2016-1-25 17:06
谢谢,我这是通过串口烧写程序的,因为没有JTAG口和SWD接口。

芯片好像自带串口Bootloader下载的,所以你也可以用串口下载

使用特权

评论回复
11
chinamaken| | 2016-1-25 17:18 | 只看该作者
yklstudent 发表于 2016-1-25 17:16
芯片好像自带串口Bootloader下载的,所以你也可以用串口下载

:handshake

使用特权

评论回复
12
hugo0chen| | 2017-1-4 20:05 | 只看该作者
赞一个,目前在使用STM32f070CB

使用特权

评论回复
13
cdjslkj2014| | 2019-1-8 10:13 | 只看该作者
,解压不了

使用特权

评论回复
14
yklstudent|  楼主 | 2019-1-10 22:03 | 只看该作者
cdjslkj2014 发表于 2019-1-8 10:13
,解压不了

试过了可以解压啊

使用特权

评论回复
15
frfgfvfd| | 2019-1-11 15:21 | 只看该作者
自适应波特率的话,应该要首先发送0xAA或者0x55吧。

使用特权

评论回复
16
cai_mouse| | 2020-2-20 16:02 | 只看该作者
谢谢分享

使用特权

评论回复
17
greatjt| | 2020-3-9 17:44 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:本人熟悉STM32、PIC、AVR等嵌入式软件开发;联系方式:524716771.

39

主题

3256

帖子

22

粉丝