| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32cubeIDE-DMA收发串口不定长数据 -> 正文阅读 |
|
[嵌入式]STM32cubeIDE-DMA收发串口不定长数据 |
硬件:STM32F103RCT6 软件:STM32CubeIDE Version: 1.8.0 时钟参数增加串口增加DMA增加中断修改main.cint main(void) { ……………………………………………… ? /* Initialize all configured peripherals */ ? MX_GPIO_Init(); ? MX_DMA_Init(); ? MX_USART1_UART_Init();? //注意这里的语句顺序,与CubeIDE生成的顺序不同。默认的顺序,使用DMA传输时,串口只能收到最后一个字节。 ? /* USER CODE BEGIN 2 */ ? //使能DMA接收 ? HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE); ? /* USER CODE END 2 */ ……………………………………………… } static void MX_USART1_UART_Init(void) { ? /* USER CODE BEGIN USART1_Init 0 */ ? /* USER CODE END USART1_Init 0 */ ? /* USER CODE BEGIN USART1_Init 1 */ ? /* USER CODE END USART1_Init 1 */ ? huart1.Instance = USART1; ? huart1.Init.BaudRate = 115200; ? huart1.Init.WordLength = UART_WORDLENGTH_8B; ? huart1.Init.StopBits = UART_STOPBITS_1; ? huart1.Init.Parity = UART_PARITY_NONE; ? huart1.Init.Mode = UART_MODE_TX_RX; ? huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; ? huart1.Init.OverSampling = UART_OVERSAMPLING_16; ? if (HAL_UART_Init(&huart1) != HAL_OK) ? { ??? Error_Handler(); ? } ? /* USER CODE BEGIN USART1_Init 2 */ ? __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断 ? /* USER CODE END USART1_Init 2 */ } 修改stm32f1xx_it.c/* USER CODE BEGIN EV */ #define BUFFER_SIZE 100 volatile uint8_t rx_len = 0;???????????? //接收到的数据长度 volatile uint8_t recv_end_flag = 0;??? //一帧数据接收完成 uint8_t rx_buffer[BUFFER_SIZE]={0};?? //DMA接收数据缓存 uint8_t tmp_buffer[BUFFER_SIZE];?? //MCU串口数据缓存 /* USER CODE END EV */ void USART1_IRQHandler(void) { ? /* USER CODE BEGIN USART1_IRQn 0 */ ?? uint32_t tmp_flag = 0; ?? uint32_t temp; ? /* USER CODE END USART1_IRQn 0 */ ? HAL_UART_IRQHandler(&huart1); ? /* USER CODE BEGIN USART1_IRQn 1 */ ? if(USART1 == huart1.Instance) ???? { ???????? tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志 ???????? if((tmp_flag != RESET))//idle标志被置 ???????? { ???????????? recv_end_flag = 1;? // 接受完成标志位置1 ???????????? __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志 ???????????? HAL_UART_DMAStop(&huart1); // ???????????? temp? =? __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA数据缓冲中未使用的数据数量 ???????????? rx_len =? BUFFER_SIZE - temp; //缓冲区长度减去未使用的数据个数,得到已经接收的数据长度。 ???????????? if(rx_len>0) ???????????? { ??????????? ? ?memcpy(tmp_buffer,rx_buffer,rx_len); //将DMA接收数据缓存里的数据复制到MCU串口数据缓存。防止数据被后面的memset语句覆盖,或者是下一帧数据覆盖。 ??????????? ? ?HAL_UART_Transmit_DMA(&huart1, (uint8_t *)tmp_buffer, rx_len);? //使用DMA方式将接收到的数据原封不动的发送出去。发送数据保存在MCU串口数据缓存tmp_buffer。由于是异步发送,后续的语句和发送过程在执行时间上是不确定的,所以需要上一条语句将数据复制到其他地址。(根据使用场景不同可以选择乒乓缓冲或者环形缓冲队列等方法快速处理DMA接收到的数据) ??????????? ? ?memset(rx_buffer,0,rx_len); //将DMA接收数据缓存复位为0。 ???????????? } ???????????? HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//重新打开DMA接收 ???????? } ???? } ? /* USER CODE END USART1_IRQn 1 */ } 实验结果: |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 1:24:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |