搜索
bottom↓
回复: 2

求帮助"STM8L 串口2 dma 发送的时候 会丢中间部分字节"

[复制链接]

出0入0汤圆

发表于 2017-9-12 16:08:00 | 显示全部楼层 |阅读模式
本帖最后由 lihaimeng@163 于 2017-9-12 16:19 编辑

大家好!帮忙看看。
          现象 :
调试STM8L052 的时候碰到一个奇怪的现象,就是DMA发送的时候会丢字节!且不是尾巴和头部而是中间的几个字节丢了。且是随机的丢部分。
      
        实用串口DMA接收,IDLE中断读取不定长的数据,然后串口DMA发送数据。

        代码:

#define EW_USART               USART2
#define EW_USART_CLK           CLK_Peripheral_USART2

#define EW_USART_TX_PORT       GPIOE
#define EW_USART_TX_PIN        GPIO_Pin_3

#define EW_USART_RX_PORT       GPIOE
#define EW_USART_RX_PIN        GPIO_Pin_4

/*data reg address*/
#define USART_DR_ADDRESS       (uint16_t)((uint32_t)EW_USART+1)  /* USART1 Data register Address */

#define USART_DMA_CHANNEL_RX   DMA1_Channel3
#define USART_DMA_RX_TC_FLAG   DMA1_FLAG_TC3
#define USART_DMA_RX_HT_FLAG   DMA1_FLAG_HT3

#define USART_DMA_CHANNEL_TX   DMA1_Channel0
#define USART_DMA_TX_TC_FLAG   DMA1_FLAG_TC0
#define USART_DMA_TX_HT_FLAG   DMA1_FLAG_HT0

void ewPort_usart_init(uint8_t *txBuffer,uint8_t txBufferSize,
                                                           uint8_t *rxBuffer,uint8_t rxBufferSize){
        /*9600*/
        /* Enable USART clock */
  CLK_PeripheralClockConfig((CLK_Peripheral_TypeDef)EW_USART_CLK, ENABLE);

  /* Configure USART Tx as alternate function push-pull  (software pull up)*/
  GPIO_ExternalPullUpConfig(EW_USART_TX_PORT, EW_USART_TX_PIN, ENABLE);
  
  /* Configure USART Rx as alternate function push-pull  (software pull up)*/
  GPIO_ExternalPullUpConfig(EW_USART_RX_PORT, EW_USART_RX_PIN, ENABLE);

  GPIO_Init(EW_USART_TX_PORT, EW_USART_TX_PIN, GPIO_Mode_Out_PP_High_Fast);
  /* USART configuration */
  USART_Init(EW_USART, 9600,
             USART_WordLength_8b,
             USART_StopBits_1,
             USART_Parity_No,
             (USART_Mode_TypeDef)(USART_Mode_Rx|USART_Mode_Tx));
  
  
  /*DMA config*/
  
  /* Enable DMA1 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
  
  DMA_GlobalDeInit();
  DMA_DeInit(USART_DMA_CHANNEL_RX);
  DMA_DeInit(USART_DMA_CHANNEL_TX);

   /* DMA channel Rx of USART Configuration */
  DMA_Init(USART_DMA_CHANNEL_RX, (uint32_t )rxBuffer, USART_DR_ADDRESS,
                   rxBufferSize, /* DMA_BufferSize */
           DMA_DIR_PeripheralToMemory, DMA_Mode_Circular, DMA_MemoryIncMode_Inc,
           DMA_Priority_Low, DMA_MemoryDataSize_Byte );
  
   /* DMA channel Tx of USART Configuration */
  DMA_Init(USART_DMA_CHANNEL_TX, (uint32_t)txBuffer,  USART_DR_ADDRESS,
           txBufferSize, DMA_DIR_MemoryToPeripheral, DMA_Mode_Normal,
           DMA_MemoryIncMode_Inc, DMA_Priority_High, DMA_MemoryDataSize_Byte);
  
  
  /* Enable the USART Tx/Rx DMA requests */
  USART_DMACmd(EW_USART, USART_DMAReq_TX, ENABLE);
  USART_DMACmd(EW_USART, USART_DMAReq_RX, ENABLE);
  
  DMA_Cmd(USART_DMA_CHANNEL_RX, ENABLE);
  DMA_GlobalCmd(ENABLE);
  
    /*receive idle interrupt config*/
  USART_ITConfig(EW_USART, USART_IT_IDLE, ENABLE);  
  USART_Cmd(EW_USART, ENABLE);
}


void ewPort_usart_dma_send_block(uint8_t *ptBuffer,uint8_t size){
       
   DMA_Cmd(USART_DMA_CHANNEL_TX, DISABLE);
   DMA_ClearFlag(USART_DMA_TX_TC_FLAG);
   DMA_ClearFlag(USART_DMA_TX_HT_FLAG);
   DMA_SetCurrDataCounter(USART_DMA_CHANNEL_TX, size);
   DMA_ITConfig(USART_DMA_CHANNEL_TX, DMA_ITx_TC, ENABLE);//使能TC中断
   DMA_Cmd(USART_DMA_CHANNEL_TX, ENABLE);   
}


uint16_t ewPort_usart_dma_received_size(void){
        uint16_t dataSize = 0;
       
        DMA_Cmd(USART_DMA_CHANNEL_RX, DISABLE);
        dataSize = DMA_GetCurrDataCounter(USART_DMA_CHANNEL_RX);
       
        return dataSize;
}

void ewPort_usart_dma_receive_start(uint8_t *ptBuffer,uint8_t size){
       
    DMA_ClearFlag(USART_DMA_RX_TC_FLAG);
    DMA_ClearFlag(USART_DMA_RX_HT_FLAG);  
    DMA_SetCurrDataCounter(USART_DMA_CHANNEL_RX, size);
    DMA_Cmd(USART_DMA_CHANNEL_RX, ENABLE);
}

/*isr*/

INTERRUPT_HANDLER(DMA1_CHANNEL0_1_IRQHandler,2)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
   
    //bsp_test_gpio_reverse();
        ew_rtu_tx_complete_isr( );
    DMA_ClearFlag(USART_DMA_TX_TC_FLAG);       
}


INTERRUPT_HANDLER(TIM2_CC_USART2_RX_IRQHandler,20)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
        if(USART_GetITStatus(EW_USART,  USART_IT_IDLE) != RESET)
        {
                unsigned char temp;
                temp = EW_USART->SR;
                temp = EW_USART->DR;//IDLE清零需要依次读SR 和DR 寄存器
                (void )temp;
                USART_ClearITPendingBit(EW_USART,  USART_IT_IDLE);                 
                ew_rtu_received_isr( );
        }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-9-12 16:19:42 | 显示全部楼层
串口的速率是多少?是否有可能速度太快引起的丢数据?

出0入0汤圆

 楼主| 发表于 2017-9-12 16:31:35 | 显示全部楼层
结贴,是被ADC相关的代码干扰到了,具体还在查
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 10:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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