10670|27

145

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

关于波特率 [复制链接]

外部晶振是24M  串口波特率设置为1M的时候,串口中断接收数据没有问题,但是设置为2M的时候就会出现问题,接收不了。

是不是我在中断函数里弄太多东西还是别的原因  求助
此帖出自stm32/stm8论坛

最新回复

//usart init         USART_InitStructure.USART_BaudRate = 19200;           USART_InitStructure.USART_WordLength = USART_WordLength_8b;           USART_InitStructure.USART_StopBits = USART_StopBits_1;           USART_InitStructure.USART_Parity = USART_Parity_No;           USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;           USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;         USART_Init(USART3, &USART_InitStructure);         /***************DMA*************************/           USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE);           USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);           /* DMA1 Channel5 RX Config */           DMA_DeInit(DMA1_Channel3);           DMA_InitStructure.DMA_PeripheralBaseAddr = USART3_DR_Base;           DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Received_Data_Buffer;           DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;           DMA_InitStructure.DMA_BufferSize = COM_PACKET_SIZE;         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;           DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;           DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;           DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;           DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环模式           DMA_InitStructure.DMA_Priority = DMA_Priority_Low;           DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;           DMA_Init(DMA1_Channel3, &DMA_InitStructure);         DMA_Cmd(DMA1_Channel3, ENABLE);           USART_Cmd(USART3, ENABLE);         DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);           /* DMA1 Channel4 TX Config */           DMA_DeInit(DMA1_Channel2);           DMA_InitStructure.DMA_PeripheralBaseAddr = USART3_DR_Base;           //DMA_InitStructure.DMA_MemoryBaseAddr = (u32)(USART_INIT_MESSAGE+6);// " OK!"         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Send_Data_Buffer;           DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;           DMA_InitStructure.DMA_BufferSize = sizeof(Received_Data_Buffer);         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;           DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;           DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;           DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;           DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;           DMA_InitStructure.DMA_Priority = DMA_Priority_Low;           DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;           DMA_Init(DMA1_Channel2, &DMA_InitStructure);         DMA1_Channel2->CNDTR= SEND_BUFFER_SIZE;         DMA_Cmd(DMA1_Channel2, ENABLE);        //触发一次,使TC置1 } dma中断时处理,不需要串行中断 void DMAChannel3_IRQHandler(void) {         DMA1->IFCR |= DMA1_FLAG_TC3;        //清除传输完成标记         if (Received_Data_Buffer[0] == (u8)'R') {                 Com_Received_Command=CHG_DATA_BIGMODE((Received_Data_Buffer+0));                 Com_Received_Parameter=*(u32 *)(Received_Data_Buffer+4);         } else {                 Com_Received_Command=0;         } }  详情 回复 发表于 2013-7-23 17:36

点评

还有一种可能—— 先弄清两个问题: 1、LZ说的“串口”是否指“异步串行通信”? 2、该CPU是否带内置倍频器? ① 假如不带倍频,直接用24MHz的外部频率做异步通信的话,一般地,为了让接收器找准数据位的中  详情 回复 发表于 2013-7-13 00:26
最好别在中断中做任何数据处理,只是把数据放入缓冲。  详情 回复 发表于 2013-7-8 11:07
点赞 关注
 

回复
举报

1万

帖子

139

TA的资源

版主

沙发
 
注意,串口波特率越高,对波特率的误差即时钟的精度要求也越高,同时软件的处理也要相应跟上。
此帖出自stm32/stm8论坛

点评

我在中断里做的接收判断,我怀疑是不是因为这个原因导致在2M的时候产生的错误,接收不了。 1M下完整正常,代码按照我的思路在跑。2M就出BUG。 现在还没有想出来该如何解决  详情 回复 发表于 2013-7-8 10:18
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
频率高了最好开启DMA方式
此帖出自stm32/stm8论坛

点评

我的接收是先用串口接两个字节,然后第二个字节是DMA的长度,把这个值赋给DMA,然后开启DMA接收 波特率在2M 的时候出问题,24M的晶振对于跑2M速度一点儿问题也没有啊,还在找原因 纠结  详情 回复 发表于 2013-7-8 10:20
 
 

回复

145

帖子

2

TA的资源

一粒金砂(高级)

4
 

回复 沙发chunyang 的帖子

我在中断里做的接收判断,我怀疑是不是因为这个原因导致在2M的时候产生的错误,接收不了。

1M下完整正常,代码按照我的思路在跑。2M就出BUG。

现在还没有想出来该如何解决
此帖出自stm32/stm8论坛

点评

在中断里做数据处理一定要算好时间,中断服务程序中最好仅仅是数据转移操作。  详情 回复 发表于 2013-7-8 17:40
 
 
 

回复

145

帖子

2

TA的资源

一粒金砂(高级)

5
 

回复 板凳huo_hu 的帖子

我的接收是先用串口接两个字节,然后第二个字节是DMA的长度,把这个值赋给DMA,然后开启DMA接收  

波特率在2M 的时候出问题,24M的晶振对于跑2M速度一点儿问题也没有啊,还在找原因  纠结
此帖出自stm32/stm8论坛

点评

这个问题可能的原因有两个,1:波特率信号不理想,好像二楼说的,晶振总是有一定偏差的,特别高的波特率时误差不能忽略了,经常的表现是数据错误或乱码。这个情况除了换晶振别无它法。 2:串口处理不及时,即你的程  详情 回复 发表于 2013-7-8 20:58
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

6
 

回复 楼主小小小小菜鸟 的帖子

最好别在中断中做任何数据处理,只是把数据放入缓冲。
此帖出自stm32/stm8论坛

点评

if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART1,USART_IT_RXNE); temp = USART_ReceiveData(USART1); USART_SendData(USART1, tem  详情 回复 发表于 2013-7-8 13:48
 
个人签名我的博客
 
 

回复

145

帖子

2

TA的资源

一粒金砂(高级)

7
 

回复 6楼zhaojun_xf 的帖子

if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {  
           USART_ClearITPendingBit(USART1,USART_IT_RXNE);
          
         temp = USART_ReceiveData(USART1);
                                                  USART_SendData(USART1, temp);
          while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}


仅仅只是这样  也是只能发出去第一个字节 是不是有问题啊   板子跑不到这么高么
此帖出自stm32/stm8论坛
 
 
 

回复

1万

帖子

139

TA的资源

版主

8
 

回复 4楼小小小小菜鸟 的帖子

在中断里做数据处理一定要算好时间,中断服务程序中最好仅仅是数据转移操作。
此帖出自stm32/stm8论坛

点评

我的晶振是24M 系统时钟用的是外部时钟 波特率如果是 2M 那么执行一条单指令的时间就是5us,那么24M的处理器可以处理的大概就是100多条,肯定够用了,但是还是不行,好几天了 要疯了  详情 回复 发表于 2013-7-10 15:24
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

4008

帖子

0

TA的资源

版主

9
 

回复 5楼小小小小菜鸟 的帖子

这个问题可能的原因有两个,1:波特率信号不理想,好像二楼说的,晶振总是有一定偏差的,特别高的波特率时误差不能忽略了,经常的表现是数据错误或乱码。这个情况除了换晶振别无它法。
2:串口处理不及时,即你的程序结构不能够在极短的时间处理。经常的表现是丢失数据,但收到的都是正确的。解决的方法就是开辟缓冲将数据分成若干段,在dma传输中段里处理数据,缓冲越大就越有时间,另外考虑数据可能覆盖的情况可以开辟双缓冲交替接收。
你上面的中断处理方式并不能根本解决,特别是中断开的比较多时嵌套和优先级也要考虑。2M波特率的话你最坏情况要有5u秒的响应速度。

[ 本帖最后由 huo_hu 于 2013-7-8 21:03 编辑 ]
此帖出自stm32/stm8论坛

点评

我就只初始化串口,测试了一个串口,还是那个问题。2M的时候就会有问题,但是会接收进来一个字节。只接受一个而且只接收一次就停了。我怀疑是不是硬件的问题。 但是为什么会收进来第一个字节呢  详情 回复 发表于 2013-7-10 15:38
 
 
 

回复

145

帖子

2

TA的资源

一粒金砂(高级)

10
 

回复 8楼chunyang 的帖子

我的晶振是24M  系统时钟用的是外部时钟  波特率如果是 2M  那么执行一条单指令的时间就是5us,那么24M的处理器可以处理的大概就是100多条,肯定够用了,但是还是不行,好几天了 要疯了
此帖出自stm32/stm8论坛

点评

是波特率精度问题还是中断处理的时间问题很容易判断,修改一下中断服务程序,仅仅来个回发,然后用PC监视,如果数据没有问题则是中断处理的时间问题。  详情 回复 发表于 2013-7-10 22:28
 
 
 

回复

145

帖子

2

TA的资源

一粒金砂(高级)

11
 

回复 9楼huo_hu 的帖子

我就只初始化串口,测试了一个串口,还是那个问题。2M的时候就会有问题,但是会接收进来一个字节。只接受一个而且只接收一次就停了。我怀疑是不是硬件的问题。                   但是为什么会收进来第一个字节呢     被这个问题搞疯了,就卡在这。  

我用的是ucosii + STM32  源工程师从ucos官网下载的。  重定义了一些东西,但是也不影响这个呀,。  啊啊啊 疯了
此帖出自stm32/stm8论坛

点评

你的发送设备会不会波形不好呢?给你出几个法子你试试 你连发全0的数据看能不能收到; 或者你收发短接自发自收看看什么情况; 你先把其他的中断都关了,大循环也简化掉,然后主频设高点超一下频试试。 再强调  详情 回复 发表于 2013-7-10 21:46
 
 
 

回复

4008

帖子

0

TA的资源

版主

12
 

回复 11楼小小小小菜鸟 的帖子

你的发送设备会不会波形不好呢?给你出几个法子你试试
你连发全0的数据看能不能收到;
或者你收发短接自发自收看看什么情况;
你先把其他的中断都关了,大循环也简化掉,然后主频设高点超一下频试试。

再强调一下用dma处理,不要用中断。
此帖出自stm32/stm8论坛

点评

DMA完全没有问题 但是串口怎么就不行呢 huo_hu大大求解 这个到底原因是什么 串口怎么就跑不到2M呢  详情 回复 发表于 2013-7-11 14:21
自收自发肯定没有问题的。我用示波器看看先  详情 回复 发表于 2013-7-11 09:15
 
 
 

回复

1万

帖子

139

TA的资源

版主

13
 

回复 10楼小小小小菜鸟 的帖子

是波特率精度问题还是中断处理的时间问题很容易判断,修改一下中断服务程序,仅仅来个回发,然后用PC监视,如果数据没有问题则是中断处理的时间问题。
此帖出自stm32/stm8论坛

点评

数据有问题,2M只能收一个。中断里就只发一个来回。 是不是没救了。。。  详情 回复 发表于 2013-7-12 08:31
问题是1M波特率回发没有问题,2M就只收一个字节 真是让人崩溃  详情 回复 发表于 2013-7-11 12:20
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

145

帖子

2

TA的资源

一粒金砂(高级)

14
 

回复 12楼huo_hu 的帖子

自收自发肯定没有问题的。我用示波器看看先
此帖出自stm32/stm8论坛
 
 
 

回复

145

帖子

2

TA的资源

一粒金砂(高级)

15
 

回复 13楼chunyang 的帖子

问题是1M波特率回发没有问题,2M就只收一个字节 真是让人崩溃
此帖出自stm32/stm8论坛

点评

1M没问题不代表2M就一定没问题,都说了两个可能的原因,去测试一下就知道了。  详情 回复 发表于 2013-7-11 23:14
 
 
 

回复

145

帖子

2

TA的资源

一粒金砂(高级)

16
 

回复 12楼huo_hu 的帖子

DMA完全没有问题  但是串口怎么就不行呢  huo_hu大大求解 这个到底原因是什么 串口怎么就跑不到2M呢
此帖出自stm32/stm8论坛

点评

差别就是“时间”。  详情 回复 发表于 2013-7-11 23:15
 
 
 

回复

1万

帖子

139

TA的资源

版主

17
 

回复 15楼小小小小菜鸟 的帖子

1M没问题不代表2M就一定没问题,都说了两个可能的原因,去测试一下就知道了。
此帖出自stm32/stm8论坛
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

1万

帖子

139

TA的资源

版主

18
 

回复 16楼小小小小菜鸟 的帖子

差别就是“时间”。
此帖出自stm32/stm8论坛
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

145

帖子

2

TA的资源

一粒金砂(高级)

19
 

回复 13楼chunyang 的帖子

数据有问题,2M只能收一个。中断里就只发一个来回。  是不是没救了。。。
此帖出自stm32/stm8论坛

点评

只要你的程序编制合理是可以轻松测试出到底是什么问题所致,好好动脑筋吧,小菜一碟而已。  详情 回复 发表于 2013-7-12 14:46
 
 
 

回复

1万

帖子

139

TA的资源

版主

20
 

回复 19楼小小小小菜鸟 的帖子

只要你的程序编制合理是可以轻松测试出到底是什么问题所致,好好动脑筋吧,小菜一碟而已。
此帖出自stm32/stm8论坛

点评

我明白了 2M的速度太快 导致来不及处理 第二个字节根本来不及收 关掉中断 查询接收就Ok  详情 回复 发表于 2013-7-12 17:15
想了好久 困惑好多天了。。。  详情 回复 发表于 2013-7-12 16:11
static void BSP_USART_Init() { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GP  详情 回复 发表于 2013-7-12 16:10
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表