当前位置: 首页 > news >正文

cubemx f103c8t6 串口一 DMA 简单配置和实现

1、基础配置

2、串口配置

生成代码。

3、代码部分

这样就是dma接收了。会将接收到的信息原封不动发回串口去。

4、printf重定向到dma上(拓展)

在上面代码的基础上,仅仅在usart.c文件里面添加以下ai写的部分就可以了。别的地方包含stdio.h头文件用printf就是通过dma发送了。

/* USER CODE BEGIN 1 */
// 新增:计算环形缓冲区下一个索引(静态函数,仅usart.c内调用)
static inline uint16_t uart_tx_next(uint16_t idx)
{return (idx + 1) % UART_TX_DMA_BUFFER_SIZE; // 环形溢出时回到0
}// 新增:启动DMA发送(从环形缓冲区取数据,触发DMA传输)
static void uart_start_dma_transmit(void)
{// 1. 检查UART是否就绪(避免重复触发DMA)if (huart1.gState != HAL_UART_STATE_READY)return;// 2. 读取当前读写索引(用临时变量避免中断/主程序竞争)uint16_t head = uart_tx_head;uint16_t tail = uart_tx_tail;// 3. 缓冲区为空,无需发送if (head == tail)return;// 4. 计算本次发送长度(环形缓冲区分“非跨区”和“跨区”两种情况)uint16_t send_len = (head > tail) ? (head - tail) : (UART_TX_DMA_BUFFER_SIZE - tail);// 5. 触发DMA发送(用你已配置的hdma_usart1_tx通道)HAL_UART_Transmit_DMA(&huart1, &uart_tx_dma_buffer[tail], send_len);
}// 新增:重定向printf到DMA发送(标准库fputc函数实现)
int fputc(int ch, FILE *f)
{// 1. 计算下一个“写索引”,检查缓冲区是否已满uint16_t next_head = uart_tx_next(uart_tx_head);while (next_head == uart_tx_tail) // 缓冲区满时,等待DMA腾出空间{__WFI(); // 进入低功耗睡眠(降低CPU占用,比忙等待更优)}// 2. 将printf的字符存入环形缓冲区uart_tx_dma_buffer[uart_tx_head] = (uint8_t)ch;uart_tx_head = next_head; // 更新“写索引”// 3. 启动DMA发送(若当前无DMA传输,会立即触发)uart_start_dma_transmit();return ch; // 标准库要求返回写入的字符
}// 新增:DMA发送完成回调函数(HAL库弱函数,覆盖实现)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{// 仅处理USART1的DMA发送完成事件(避免影响其他UART)if (huart->Instance != USART1)return;// 1. 关闭DMA(避免重复触发)__HAL_DMA_DISABLE(huart->hdmatx);// 2. 更新“读索引”(已发送的数据从缓冲区中移除)uart_tx_tail = (uart_tx_tail + huart->TxXferCount) % UART_TX_DMA_BUFFER_SIZE;// 3. 清除DMA完成标志(防止残留标志导致异常)__HAL_DMA_CLEAR_FLAG(huart->hdmatx, __HAL_DMA_GET_TC_FLAG_INDEX(huart->hdmatx)); // 传输完成标志__HAL_DMA_CLEAR_FLAG(huart->hdmatx, __HAL_DMA_GET_HT_FLAG_INDEX(huart->hdmatx)); // 半传输标志// 4. 检查缓冲区是否还有剩余数据,继续发送(实现“连续DMA发送”)uart_start_dma_transmit();
}
/* USER CODE END 1 */

5、测试代码(一行)和测试现象:

效果还可以,个别来不及换行,但是串口一直开着的话发送是不会停顿的。

http://www.dtcms.com/a/458617.html

相关文章:

  • 哈尔滨专业做网站公司wordpress 是免费的嘛
  • 西安哪里做网站最大交换机做网站
  • 榆中建设局网站下载优化大师并安装
  • 有没有哪种网站推荐一下wordpress google ad
  • 古董手表网站30天网站建设
  • 做网站交接需要哪些权限企业信用公示信息系统(全国)官网
  • 【论文学习】交互式图像分割顶会论文
  • 网站主办单位负责人网站竞价如何做
  • 吴恩达机器学习课程(PyTorch 适配)学习笔记:3.2 降维技术详解(PCA)
  • 一元购网站建设多少钱手机网站生成代码
  • 天津免费做网站公司网站建设30元
  • 天津智能网站建设制作做电商要关注哪些网站
  • 商店网站源码淮安做网站
  • Effective STL 第4条:调用empty()而不是检查size()是否为0
  • 家具网站开发环境与工具铜陵市网站建设
  • Mysql初阶第三讲:Mysql数据类型
  • 网络营销价格北京seo公司工作
  • 徐州cms模板建站建设购物网站多少钱
  • 视频网站点击链接怎么做的工业设计出来做什么
  • 怎样把网站做的漂亮个人网站用主机做服务器
  • 备案掉了网站会怎样开发一套小区多少钱
  • Java基础 10.8
  • 长湖南营销型网站简单网站建设公司
  • 计算机基础——浏览器、算法、计算机原理和编译原理等
  • 网站制作企业有哪些下页
  • 企业做外贸网站常用术语通江移动网站建设
  • vultr做网站广东软件公司排名
  • [1]python爬虫入门,爬取豆瓣电影top250实践
  • 学习网站开发体会与感想wordpress多语言插件:qtranslate
  • 辽源市网站建设html怎么制作网页