历史上的今天
返回首页

历史上的今天

今天是:2025年01月04日(星期六)

2019年01月04日 | STM32F4 UART DMA初始化

2019-01-04 来源:eefocus

F4的片子内部DMA初始化和F103的有很大区别,在这里引入了数据流(Stream),2个DMA共16的数据流(每个控制器8个),每个数据流则可已处理多达8个通道的数据,每个通道都有一个仲裁器处理DMA请求的优先级。下面贴出DMA请求映射事例




在DMA2中可以看出UART1的发送是数据流7的第4通道,接收是数据流5的第4通道。所以在配置DMA时要注意选择对应的数据流然后配置对应的通道,最后初始化对应数据流和对应的通道。


下面贴出代码


	//****************************配置UART1 DMA发送
	DMA_DeInit(DMA2_Stream7);
	while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE);//等待DMA可配置 
	/* 配置 DMA Stream */
	DMA_InitStructure.DMA_Channel = DMA_Channel_4;  //通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr = (u32)SendBuff;//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式
	DMA_InitStructure.DMA_BufferSize = SEND_BUF_SIZE;//数据传输量 
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度:8位
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式 
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
	DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
	DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
	DMA_Init(DMA2_Stream7, &DMA_InitStructure);//初始化DMA Stream
	//DMA NVIC  
	NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;  
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
	NVIC_Init(&NVIC_InitStructure);  
	DMA_ITConfig(DMA2_Stream7,DMA_IT_TC,ENABLE);

	//****************************配置UART1 DMA接收
	DMA_DeInit(DMA2_Stream5);
	while (DMA_GetCmdStatus(DMA2_Stream5) != DISABLE);//等待DMA可配置 
	/* 配置 DMA Stream */
	DMA_InitStructure.DMA_Channel = DMA_Channel_4;  //通道选择
	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;//DMA外设地址
	DMA_InitStructure.DMA_Memory0BaseAddr = (u32)ReceiveBuff;//DMA 存储器0地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ;//外设到存储器模式
	DMA_InitStructure.DMA_BufferSize = RECEIVE_BUF_SIZE;//数据传输量 
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度:8位
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式 
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
	DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
	DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
	DMA_Init(DMA2_Stream5, &DMA_InitStructure);//初始化DMA Stream
	//DMA NVIC  
	NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream5_IRQn;  
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
	NVIC_Init(&NVIC_InitStructure);  
	DMA_Cmd(DMA2_Stream5, ENABLE);  //开启DMA传输 
	
	DMA_ITConfig(DMA2_Stream5,DMA_IT_TC,ENABLE);


推荐阅读

史海拾趣

台湾富晶(FORTUNE)公司的发展小趣事
使用示波器等工具检查时钟信号的波形和频率是否正常。
ABECO公司的发展小趣事

品质是ABECO的生命线。公司始终坚持严格的质量管理体系,从原材料的采购到生产过程的控制,再到产品的检测和包装,每一个环节都严格把关。此外,公司还定期举行质量培训活动,提高员工的质量意识。这种对品质的执着追求,使得ABECO的产品在市场上始终保持着良好的口碑和竞争力。

台湾肯尼威(CANNYWELL)公司的发展小趣事

台湾肯尼威公司成立于1986年,其创始人李明(化名)是一位对电子技术充满热情的工程师。在当时的台湾,电子制造业正处于蓬勃发展的阶段。李明看到电源滤波器在电子设备中的重要性,于是决定专注于这一领域的研发和生产。他带领一支小团队,经过无数次的试验和改进,终于成功研发出CW系列单相电源滤波器,为公司的发展奠定了坚实的技术基础。

Horn公司的发展小趣事

面对电子行业日益复杂的加工需求和激烈的市场竞争,Horn公司不断进行自我调整和转型。公司加大了对自动化生产线的投入,提高了生产效率和产品质量。同时,Horn公司还加强了与下游客户的沟通与合作,深入了解市场需求变化,为客户提供更加个性化的解决方案。这些举措帮助Horn公司在电子行业中保持了竞争优势。

Datalogic公司的发展小趣事

在2022年,Datalogic推出了PowerScan 9600系列工业手持式扫描枪。这款扫描枪具有坚固的设计、IP67等级防护和出色的性能,能够在严酷的工业环境中稳定运行。PowerScan 9600系列的推出进一步提升了Datalogic在电子行业中的产品竞争力。

B&B Electronics Manufacturing Company公司的发展小趣事

随着科技的不断进步,B&B公司意识到,要在竞争激烈的电子行业中立足,必须不断进行技术革新和产品升级。因此,公司加大了在研发上的投入,推出了一系列具有创新性的产品,如智能无线M2M和物联网连接解决方案。这些产品不仅提升了数据传输的效率和稳定性,也为客户提供了更加便捷和高效的解决方案。

问答坊 | AI 解惑

什么是移动通信网络优化(扫盲篇)

什么是移动通信网络优化(扫盲篇) 西安巨人培训中心  党军虎   注:转载请注明出处“西安巨人培训中心”,不得修改原文,否则追究相关责任! 前言 当前咨询或参加我们培训的学员多次要求:希望能够给大家介绍什么是移动 ...…

查看全部问答>

IAP 后程序启动的疑惑

M0开发板IAP疑问,,,,,,   if (*GpulFlagPoint == HIGH) {        userProgram = (void (*)()) (HIGH+1);    } else {        if (*GpulFlagPo ...…

查看全部问答>

FPGA配置芯片epc2L20工作电压

如题  找了好久没找到...…

查看全部问答>

怎么判断按键已经弹起

就是我想用一个按钮控制51单片机的一个中断(低电平触法),中断执行完后就根据中断程序去执行其他的程序。但是在这里遇到一个问题:就是我的中断程序很短(几微秒就执行完),我按下按钮的时候瞬间就执行完了。但是由于此时我的按钮还是处于按下状 ...…

查看全部问答>

给点自适应开发的经验吧

本人还在上学,要写毕业论文。很想搞一个和航空有关的项目。因为学校有一台真机,供研究用的。导师提议我可以用软件模拟巡航速度的控制,其实汽车也有这个系统。 看了一点资料,发现很多都和自适应控制有关。 我以前只学过C++,学了点JAVA,编过 ...…

查看全部问答>

请教OSC_IN和OSC_OUT管脚的问题

我用STM32F103VB做了个板子,现在已经接好了电源、复位、BOOT0和BOOT1、还有JTAG口,晶振部分没有接,用内部的8M晶振跑了个小程序一切正常。 但现在准备做HSE的时候却发现OSC_IN和OSC_OUT两个管脚上都出现了0.2V左右的电压,请问怎么解决这个 ...…

查看全部问答>

STM32F103VBT6L版本与Y版本的区别?

                                 请问版主主 STM32F103VBT6 L版本与Y版本的最大区别是什么?我最近买了一些L版本的,程序烧上去后不稳定,以前的Y版 ...…

查看全部问答>

请问如何把ad12当作16位来用

各位师兄:我记得在那里看到过可以把12位的ad当作16位来用,但是忘了出处,那位师兄可以给个提示?…

查看全部问答>

提取微弱小信号的锁相放大器试制 总结

从提出方案到设计本子,调试花了许多业余时间。问了许多从事电子的工程师,包括博士和工作几年的老师都不清楚锁相放大器。总是和锁相环弄混。再次在说明一下锁相放大器和锁相环是两个东西。锁相环(PLL)一般是所频率的,锁相放大器一般用在提取微 ...…

查看全部问答>