OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6257|回复: 16

原子哥求指点啊

[复制链接]

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
发表于 2013-6-24 09:54:41 | 显示全部楼层 |阅读模式

我现在是在用DMA接收数据,然后发送出去。

但是有个问题,当我接收进来一帧数据往外发的时候又进来一帧数据,那么就会发生数据覆盖的问题。
现在的想法就是把接收进来的数据存到一个大BUF里面,这样就不会发生数据丢失了。

流程是这样的:
    串口中断接收进来数据——》知道要接收的数据长度————》把数据长度给DMA——》关串口中断——》开DMA中断——》DMA中断接收数据——》关DMA中断——》开串口中断

如此循环,问题出现了,当数据不断进来的时候就会发生数据覆盖。
所以就想把接收到的数据存起来,但是怎么把DMA接收到的小BUF存到一个大BUF里面呢  纠结中


求你原子哥指点

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-24 10:22:03 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
 楼主| 发表于 2013-6-25 09:00:07 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
DMA发送 咱们论坛有DMA发送的例程么 看了很多例子好像很少发送的
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-25 14:42:03 | 显示全部楼层
我们的dma例程,就有用dma发送啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
 楼主| 发表于 2013-6-26 08:55:47 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
好 谢谢原子哥
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-6-26 09:30:34 | 显示全部楼层
回复【3楼】pzhu:
---------------------------------
发送一般都是 DMA的, 而接收 用DMA反而挺麻烦
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
 楼主| 发表于 2013-7-3 16:24:41 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥 有个问题  就是我RCC初始化的时候  串口 GPIO使能了  但是在程序里面LED能亮,但是串口并不能起作用。  这是我在使用外部时钟的时候的情况

使用内部时钟就没有问题 
/* Enable HSI Clock */
  RCC_HSICmd(ENABLE);
  
  /*!< Wait till HSI is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

  /* Set HSI as sys clock*/
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
  
  /* Set MSI clock range to ~4.194MHz*/
  RCC_MSIRangeConfig(RCC_MSIRange_6);
  
  /* Enable the GPIOs clocks */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC| RCC_AHBPeriph_GPIOD| RCC_AHBPeriph_GPIOE| RCC_AHBPeriph_GPIOH | RCC_AHBPeriph_DMA1, ENABLE);     

  /* Enable comparator, LCD and WR mngt clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP | RCC_APB1Periph_LCD | RCC_APB1Periph_PWR  | RCC_APB1Periph_USART2,ENABLE);
    
  /* Enable ADC & SYSCFG clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SYSCFG | RCC_APB2Periph_USART1, ENABLE);

  /* Allow access to the RTC */
  WR_RTCAccessCmd(ENABLE);

  /* Reset RTC Backup Domain */
  RCC_RTCResetCmd(ENABLE);
  RCC_RTCResetCmd(DISABLE);

  /* LSE Enable */
  RCC_LSEConfig(RCC_LSE_ON);

  /* Wait until LSE is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
  
   /* RTC Clock Source Selection */ 
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); 
  
  /* Enable the RTC */
  RCC_RTCCLKCmd(ENABLE);   
  
  /*Disable HSE*/
  RCC_HSEConfig(RCC_HSE_OFF);
  if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET )
  {
    /* Stay in infinite loop if HSE is not disabled*/
  while(1); 
  }


上面这个是使用内部时钟的时候


下面是使用外部时钟时候 

    BSP_IntInit();

    RCC_DeInit();

    RCC_HSEConfig(RCC_HSE_ON);                                  /* Enable HSE Clock                                     */

    while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) {       /* Wait till HSE is ready                               */
        ;
    }

    FLASH_ReadAccess64Cmd(ENABLE);                              /* Enable 64-bit access                                 */
    FLASH_PrefetchBufferCmd(ENABLE);                            /* Enable refetch Buffer                               */
    FLASH_SetLatency(FLASH_Latency_1);                          /* Flash 1 wait state                                   */

  /* Enable the GPIOs clocks */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC| RCC_AHBPeriph_GPIOD| RCC_AHBPeriph_GPIOE| RCC_AHBPeriph_GPIOH | RCC_AHBPeriph_DMA1, ENABLE);     

  /* Enable comparator, LCD and WR mngt clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP | RCC_APB1Periph_LCD | RCC_APB1Periph_PWR  | RCC_APB1Periph_USART2,ENABLE);
    
  /* Enable ADC & SYSCFG clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SYSCFG | RCC_APB2Periph_USART1, ENABLE);

//    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);         /* Enable the WR APB1 Clock                            */
    WR_VoltageScalingConfig(PWR_VoltageScaling_Range1);        /* Select the Voltage Range 1 (1.8V)                    */

    while (PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET) {
        ;
    }

    RCC_HCLKConfig(RCC_SYSCLK_Div1);                            /* HCLK = SYSCLK = AHBCLK               = 32MHz.        */
    RCC_PCLK2Config(RCC_HCLK_Div1);                             /* APB2CLK = AHBCLK  / APB2DIV(1)       = 32MHz.        */
    RCC_PCLK1Config(RCC_HCLK_Div1);                             /* APB1CLK = AHBCLK  / APB1DIV(1)       = 32MHz.        */

                                                                /* LLCLK = (HSE * LLMUL) / LLDIV     = 32Mhz.        */
    RCC_PLLConfig(RCC_PLLSource_HSE,
                  RCC_PLLMul_3,
                  RCC_PLLDiv_3);

    RCC_PLLCmd(ENABLE);                                         /* Enable LL                                           */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {       /* Wait for PLL to lock.                                */
        ;
    }

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                  /* Select PLL as system clock source                    */
    while (RCC_GetSYSCLKSource() != RCC_CFGR_SWS_PLL) {         /* Wait till PLL is used as system clock source         */
        ;
    }
求原子哥指点啊   因为波特率是921600的时候传输出错  而115200的时候没有问题 我怀疑是时钟跑不上去 用外部的试试
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-4 00:57:05 | 显示全部楼层
软防,看一下实际波特率是多少.
和921600差多远...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
 楼主| 发表于 2013-7-4 11:06:14 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
115200完全没有错误 程序就是按照预想的跑的    16M的HSI  绝对够用

921600的波特率  我用DMA收一组数据进来用串口发出去是对的呀  就说明通讯是没有问题的 

当好几组数据一起的时候就会出现问题了   收乱了都   可能是在中断里做了太多事    找不到原因  原子哥求救啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-4 14:18:40 | 显示全部楼层
回复【9楼】pzhu:
---------------------------------
精简中断服务函数.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
 楼主| 发表于 2013-7-5 09:24:45 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
中断里做太多事了,对后期结构肯定不利。

谢谢原子哥,最近老麻烦你
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
 楼主| 发表于 2013-7-8 15:36:01 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
 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);
}



原子哥 我在串口中断里做了这个  2M就只能发送第一个数据而且只能发一次        1M波特率就没有问题   是不是跑不到2M啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-8 15:39:19 | 显示全部楼层
没测试过,呵呵.我最大也就用用115200
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
 楼主| 发表于 2013-7-11 14:49:06 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
原子哥   我用DMA  2M没有问题 为什么串口不行啊
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
 楼主| 发表于 2013-7-16 17:04:44 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
原子哥   if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {  
    USART_ClearITPendingBit(USART1,USART_IT_RXNE);
这两句话  第二句  手册里面说读取的时候就能自动清零 等于说是这一句没有用  receivedata()的时候就会自动清这一位

但是在不同的波特率下面 这句话加不加的直接结果就是  我要的结果对不对  这是为什么呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-16 21:11:50 | 显示全部楼层
回复【15楼】pzhu:
---------------------------------
这我也不知道哦,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
 楼主| 发表于 2013-7-24 17:14:14 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------
问题解决啦  时间问题 

原子哥 遇到一个疑惑 我把LCD加进去  然后在打开串口调试工具就不断地发00  不应该 有这个问题啊  这是怎么回事
把LCD初始化去调就不会     原因就在LCD的初始化里了 但是我不知道到底错哪了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-16 11:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表