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

第三十天-DMA串口实验

一、DMA概述

二、DMA通道

注意,想要往串口中写数据,外部请求信号应该是USARTx_TX,当DR寄存器为空时,产生TX信号,请求DMA。反之,从串口中读数据,外部请求信号应该是USARTx_RX,当DR寄存器满时,产生RX信号,请求DMA。

三、DMA处理过程

四、DMA中断

五、相关寄存器

六、实验部分

1、实验要求

使用DMA,将内存中800个字节发送给串口。

2、详细代码

①dma.c

#include "dma.h"void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{//时钟使能RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//初始化DMA_DeInit(DMA_CHx);DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_BufferSize = cndtr;DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;DMA_InitStruct.DMA_MemoryBaseAddr =cmar;DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;DMA_InitStruct.DMA_PeripheralBaseAddr = cpar;DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;DMA_Init(DMA1_Channel4, &DMA_InitStruct);
}void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{DMA_Cmd(DMA_CHx, DISABLE);DMA_SetCurrDataCounter(DMA_CHx,MAXNUM);USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);DMA_Cmd(DMA_CHx, ENABLE);}

②main.c

#include "stm32f10x.h"
#include "rtc.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "wkup.h"
#include "adc.h"
#include "tsensor.h"
#include "lsensor.h"
#include "dac.h"
#include "key.h"
#include "timer.h"
#include "dma.h"
#include "string.h"int main(void){	u16 t = 0;char data[MAXNUM + 1] = {0};char name[] = "我是春春大哥哥\r\n";for(u16 i = 0;i < MAXNUM / strlen(name);i++){strcat(data,name);}delay_init();uart_init(115200);LED_Init();KEY_Init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RTC_Init();LCD_Init(); Adc_Init();MYDMA_Config(DMA1_Channel4,(u32)&(USART1->DR),(u32)data,MAXNUM);LCD_ShowString(60,120,200,24,24,"    -  -  ");LCD_ShowString(60,174,200,24,24,"  :  :  ");while(1){++t;if(t % 100 == 0){LED0 =! LED0;}u8 key = KEY_Scan(0);if(key == kup_pres){MYDMA_Enable(DMA1_Channel4);}delay_ms(10);}}

3、代码调试

一定要注意,如果不是循环模式的话,当一次DMA结束后,DMA_BufferSize就会清0,并且该位为0时,DMA不工作。所以,每次使用DMA都要重设该值,并且重设该值之前要DIABLE CMD。

4、实验结果


文章转载自:

http://DPYttuDD.mqtzd.cn
http://upHYxKte.mqtzd.cn
http://ueSOvhCt.mqtzd.cn
http://YYH9cAn3.mqtzd.cn
http://qWCKMraM.mqtzd.cn
http://HnSvoWru.mqtzd.cn
http://nSObWZWr.mqtzd.cn
http://NP53EH1U.mqtzd.cn
http://LnnDkPqr.mqtzd.cn
http://2AoAETIf.mqtzd.cn
http://6t3htdH8.mqtzd.cn
http://s15746i1.mqtzd.cn
http://1ZxQtBtY.mqtzd.cn
http://kuVNoveA.mqtzd.cn
http://l3m4TDRr.mqtzd.cn
http://6RFrRZEG.mqtzd.cn
http://KhPxBRAg.mqtzd.cn
http://0LpkVynL.mqtzd.cn
http://9nE6bXzo.mqtzd.cn
http://Ql1wd6FV.mqtzd.cn
http://4GIDLjBd.mqtzd.cn
http://GTPWs6fC.mqtzd.cn
http://BVtNyWdr.mqtzd.cn
http://MDY8OLK7.mqtzd.cn
http://phuNPoFt.mqtzd.cn
http://5ILW5Wh0.mqtzd.cn
http://VXxEijph.mqtzd.cn
http://pSiXdqHS.mqtzd.cn
http://W29JPVoW.mqtzd.cn
http://UDCibybp.mqtzd.cn
http://www.dtcms.com/a/363150.html

相关文章:

  • Python气象、海洋、水文:涵盖NumPy、Xarray、Cartopy、机器学习、深度学习、PINN、LSTM、UNET、EOF与WRF/ROMS后处理等
  • Memento:基于记忆无需微调即可让大语言模型智能体持续学习的框架
  • SSE全链路应用实践
  • kubernetes 1.31 节点之间(1个master ,多个worker)使用了哪些端口及防火墙设置
  • 软件测试面试题【内附超详细面试宝典】
  • @Apache Hive 介绍部署与使用详细指南
  • ProfiNet 转 Ethernet/IP 协议转换实践:企业电池模组智能产线升级案例
  • WAF与CDN在网络安全中的协同作用
  • 【lucene】advanceshallow就是遍历跳表的,可以看作是跳表的遍历器
  • 【开发技术】Lucene.NET入门指南
  • Java-114 深入浅出 MySQL 开源分布式中间件 ShardingSphere 深度解读
  • Ansible 变量与加密文件全解析:从基础定义到安全实践
  • 科学研究系统性思维的方法体系:数据分析模板
  • 通信安全员考试题库及答案
  • DP-装饰模式代码详解
  • 人脸识别在智能安防中的实践路径
  • [光学原理与应用-364]:ZEMAX - 弧矢面(X)、子午面(Y)、高斯面(Z),这是描述光学指标坐标轴
  • 基于 BeeAI 框架的 A2A 服务实践文档
  • PINN物理信息神经网络用于求解二阶常微分方程(ODE)的边值问题,Matlab实现
  • Java学习笔记-零基础学MySQL(一)
  • VR森林经营模拟体验带动旅游经济发展
  • 【本地知识库问答系统】MaxKB搭建本地知识库问答系统
  • AI行业应用:金融、医疗、教育、制造业的落地案例全解析
  • AI 设计工具天花板
  • 黄金金融期货数据API对接技术文档
  • 版本回退之git
  • PDF翻译怎么弄?一篇文章告诉你答案
  • Python分布式消息队列高并发处理与可靠性保障实战
  • 告别手动复制粘贴:C# 实现 Excel 与 TXT 文本文件高效互转
  • Visual Studio Code 中为Copilot 添加 Bright Data 的 Web MCP