你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

USART-DMA 空闲模式 接收不等长数据

[复制链接]
jtc_88 发布时间:2018-6-19 17:13
本帖最后由 jtc_88 于 2018-6-19 17:15 编辑

1529399400(1).png
1529399500(1).png
/* USER CODE BEGIN Private defines */
#define                RX_DATA_NUM                (30)                        //接收数据 数组
#define                DataPacketHeaderNum                (5)                //数据包,头及CRC校验 数据量 总和
#define                DATA_NUM_INDEX                (2)                        //通讯协议,数据数量数组索引位
/* USER CODE END Private defines */


/* Private variables ---------------------------------------------------------*/
        uint8_t         RX_DATA[RX_DATA_NUM] = {0};                        //命令接收缓冲 数组
        
/* USER CODE END PV */     

/* USER CODE BEGIN 2 */
      HAL_UART_Receive_DMA(&huart1, RX_DATA, RX_DATA_NUM);
        __HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE);//关闭DMA 错误 传输一半 全部完成 中断

        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能 串口 空闲中断

        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(USART1_IRQn);                        //使能中断
      /* USER CODE END 2 */

void USART1_IRQHandler(void)
{
        if((__HAL_DMA_GET_COUNTER(huart1.hdmarx) + RX_DATA[DATA_NUM_INDEX]) == (RX_DATA_NUM - DataPacketHeaderNum))
        {
                Flag_RX = 1;//接收到数据 标记位
        }
        
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        
        __HAL_DMA_DISABLE(huart1.hdmarx);
        huart1.hdmarx->Instance->CNDTR = RX_DATA_NUM;
        __HAL_DMA_ENABLE(huart1.hdmarx);                                //DMA接收数据 必须在 DMA 禁止 时 重新写入

}

注:这是STM32F103的例子,其他的 类似,思路一样,小有区别,USART状态清除方式不同;


收藏 评论4 发布时间:2018-6-19 17:13

举报

4个回答
zero99 回答时间:2018-6-19 17:32:17
学习了
me浩 回答时间:2018-6-20 09:30:54
ZDPHPN 回答时间:2018-6-21 11:15:43
我也分享一个串口空闲中断+DMA收发的例子,只要发送是连续的,使用空闲中断+DMA接收不定长数据还是可以的

RS232.rar

下载

1.67 KB, 下载次数: 9

文件名任意,就是一个串口收发,包括.c/.h两个文件

ZDPHPN 回答时间:2018-6-21 11:19:20
混点经验,上述主要代码:
  1. if(USART_GetITStatus(RS232_USARTx,USART_IT_IDLE)!=RESET)
  2.         {
  3.                 RS232_USARTx->DR;
  4.                 RS232_USARTx->SR;                                                                                                                                                                                                                       
  5.                
  6.                 RS232_RecvDataLen=sizeof(RS232_RecvData)-DMA_GetCurrDataCounter(RS232Rx_DMAx_Channelx);
  7.                
  8.                 DMA_Cmd(RS232Rx_DMAx_Channelx,DISABLE);
  9.                 DMA_SetCurrDataCounter(RS232Rx_DMAx_Channelx,sizeof(RS232_RecvData));       
  10.                 DMA_Cmd(RS232Rx_DMAx_Channelx,ENABLE);
  11.                
  12.        
  13.         }
复制代码

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版