stm32专题十三:DMA(三)存储器到外设

发布者:SerendipityGlow最新更新时间:2021-10-19 来源: eefocus关键字:DMA  存储器  外设 手机看文章 扫描二维码
随时随地手机看文章

DMA的存储器到外设的配置,其实和存储器到存储器的配置非常类似。


只是需要注意一点,就是外设寄存器的地址如何获得?比如USART->DR数据寄存器,我们可以这样定义(基址 + 偏移)


// 外设寄存器地址

#define USART_DR_ADDRESS        (USART1_BASE + 0x04)

然后的配置就跟USART和DMA非常类似,直接上初始化过程:


bsp_dma.c


#include "bsp_dma.h"

#include

 

uint8_t SendBuff[SENDBUFF_SIZE];

 

void USART_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStruct;

USART_InitTypeDef USART_InitStruct;

// 开启串口的GPIO时钟

DEBUG_UASRT_GPIO_APBxClkCmd(DEBUG_UASRT_GPIO_CLK, ENABLE);

 

  // USART的TX配置为复用推挽输出

GPIO_InitStruct.GPIO_Pin = DEBUG_UASRT_TX_GPIO_PIN;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(DEBUG_UASRT_TX_GPIO_PORT, &GPIO_InitStruct);

// USART的RX配置为浮空输入(由中文参考手册查询)

GPIO_InitStruct.GPIO_Pin = DEBUG_UASRT_RX_GPIO_PIN;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(DEBUG_UASRT_RX_GPIO_PORT, &GPIO_InitStruct);

// 开启串口时钟

DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

// 配置串口参数(波特率、8位数据、1位停止位、无校验、发送接收模式、无硬件流控)

USART_InitStruct.USART_BaudRate = DEBUG_USART_BAUDRATE;

USART_InitStruct.USART_WordLength = USART_WordLength_8b;

USART_InitStruct.USART_StopBits = USART_StopBits_1;

USART_InitStruct.USART_Parity = USART_Parity_No;

USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_Init(DEBUG_USARTx, &USART_InitStruct);

 

// 使能串口

USART_Cmd(DEBUG_USARTx, ENABLE);

}

 

int fputc(int ch, FILE *f)

{

USART_SendData(DEBUG_USARTx, (uint8_t)ch);

while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);

 

return ch;

}

 

// Memory -> P(USART->DR)

void USARTx_DMA_Config(void)

{

DMA_InitTypeDef DMA_InitStruct;

// 开时钟,我经常会忘记这一步(DMA挂载在AHB总线

RCC_AHBPeriphClockCmd(USART_TX_DMA_CLK, ENABLE);

// 配置初始化结构体

DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)USART_DR_ADDRESS;

DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)SendBuff;

/* DMA_DIR_PeripheralSRC:外设为源,DMA_DIR_PeripheralDST:外设为目的地 */

DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;

DMA_InitStruct.DMA_BufferSize = SENDBUFF_SIZE;

DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;

DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;

DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;

DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;

DMA_Init(DMA1_Channel4, &DMA_InitStruct);

DMA_Cmd(DMA1_Channel4, ENABLE);

}

bsp_dma.h头文件


#ifndef __BSP_DMA_H

#define __BSP_DMA_H

 

#include "stm32f10x.h"

 

// 串口1 USART1

#define DEBUG_USARTx    USART1

#define DEBUG_USART_BAUDRATE    115200

#define DEBUG_USART_CLK    RCC_APB2Periph_USART1

#define DEBUG_USART_APBxClkCmd    RCC_APB2PeriphClockCmd

 

// USART GPIO引脚宏定义

#define DEBUG_UASRT_GPIO_CLK RCC_APB2Periph_GPIOA

#define DEBUG_UASRT_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd

 

#define DEBUG_UASRT_TX_GPIO_PORT GPIOA

#define DEBUG_UASRT_TX_GPIO_PIN GPIO_Pin_9

#define DEBUG_UASRT_RX_GPIO_PORT GPIOA

#define DEBUG_UASRT_RX_GPIO_PIN GPIO_Pin_10

 

 

#define USART_TX_DMA_CLK RCC_AHBPeriph_DMA1

// 外设寄存器地址

#define USART_DR_ADDRESS        (USART1_BASE + 0x04)

// 一次发送的数据量

#define SENDBUFF_SIZE            5000

// 串口对应的DMA请求通道

#define USART_TX_DMA_CHANNEL      DMA1_Channel4

 

extern uint8_t SendBuff[SENDBUFF_SIZE];

 

void USART_Config(void);

void USARTx_DMA_Config(void);

 

 

#endif /* __BSP_DMA_H */

然后再主函数中进行调用。注意,这里有一点与Memory to Memory不同,MtM一旦使能就会进行传输,不需要触发。而这里需要USART发送一个DMA请求,然后DMA才会开始进行数据传输,请求函数为:


/**

  * @brief  Enables or disables the USART抯 DMA interface.

  * @param  USARTx: Select the USART or the UART peripheral. 

  *   This parameter can be one of the following values:

  *   USART1, USART2, USART3, UART4 or UART5.

  * @param  USART_DMAReq: specifies the DMA request.

  *   This parameter can be any combination of the following values:

  *     @arg USART_DMAReq_Tx: USART DMA transmit request

  *     @arg USART_DMAReq_Rx: USART DMA receive request

  * @param  NewState: new state of the DMA Request sources.

  *   This parameter can be: ENABLE or DISABLE. 

  * @retval None

  */

void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState)

{

  if (NewState != DISABLE)

  {

    /* Enable the DMA transfer for selected requests by setting the DMAT and/or

       DMAR bits in the USART CR3 register */

    USARTx->CR3 |= USART_DMAReq;

  }

  else

  {

    /* Disable the DMA transfer for selected requests by clearing the DMAT and/or

       DMAR bits in the USART CR3 register */

    USARTx->CR3 &= (uint16_t)~USART_DMAReq;

  }

}

可以看到,USART-DMA请求函数,实际上配置的是UASRT_CR3寄存器,两个参数如下,分别配置的是CR3的第7位和第6位,对应发送请求使能和接受请求使能。


#define USART_DMAReq_Tx                      ((uint16_t)0x0080)

#define USART_DMAReq_Rx                      ((uint16_t)0x0040)

我们在完成初始化配置后,调用这个USART_DMACmd函数,DMA就会立刻开始传输。


在主函数中进行测试


main.c


#include "stm32f10x.h"

#include "bsp_led.h"

#include "bsp_dma.h"

 

void delay(uint32_t count);

 

int main(void)

{

uint16_t i = 0;

LED_GPIO_Config();

USART_Config();

USARTx_DMA_Config();

for (; i < SENDBUFF_SIZE; i++)

{

SendBuff[i] = 'P';

}

USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE);

 

while (1)

{

LED_R_TOGGLE;

delay(0XFFFFF);

}

}

 

void delay(uint32_t count)

{

for (; count != 0; count--);

}

关键字:DMA  存储器  外设 引用地址:stm32专题十三:DMA(三)存储器到外设

上一篇:stm32专题一:GPIO输出—点亮LED
下一篇:stm32专题二:GPIO输入—按键检测

推荐阅读最新更新时间:2024-11-07 19:59

高深宽比刻蚀和纳米级图形化推进存储器的路线图
随着市场需求推动存储器技术向更高密度、更优性能、新材料、3D堆栈、高深宽比 (HAR) 刻蚀和极紫外 (EUV) 光刻发展,泛林集团正在探索未来三到五年生产可能面临的挑战,以经济的成本为晶圆厂提供解决方案。 增加 3D NAND闪存存储容量 的一种方法是堆栈加层,但堆栈高度的增加会带来更大的挑战。虽然这些挑战中最明显的是结构稳定性问题, 但层数的增加意味着需要使用更深的通道来触及每个字线、以及更窄的狭缝沟槽以隔离连接到位线的通道(图1)。 图1:随着3D NAND堆栈超过128层,堆栈高度接近7微米,并将所需的通道孔和狭缝转变为高深宽比 (HAR) 特征,刻蚀的挑战越来越大。 高深宽比刻蚀的挑战 在硬掩膜沉
[嵌入式]
高深宽比刻蚀和纳米级图形化推进<font color='red'>存储器</font>的路线图
单片机的“灵魂”—数据存储器的使用
我们可以说程序存储器的里面存放的是单片机的灵魂,它就是工作程序。小的可能只有1KB(最多只能装1024条8位数据,因为实际指令还有许多2字节、3字节指令,所以它还装不下1024条指令)大的也有128KB的。这些8位数据要么在工厂里做摸子光刻进去,要么一次性的烧写进去,要么 用编程器这个特殊工具把调试成功的机器码装载进去,或者像AVR单片机那样自己花几块钱做一条下载线,把电脑里这些东西灌进去(或许是AVR最吸引人之处),它一旦进驻电脑的程序存储器中,除了借助上述装置便不能自由改写,在单片机运行时,只是从其中读出指令或固定的数据,所以给程序存储器一个 只读存储器 的别名,简写为ROM,包括用编程器写紫外线擦除内容的EPROM.用电擦除
[电源管理]
西数告东芝案美法院判决:未禁售东芝存储器出售案
集微网消息,据海外媒体报道,为了东芝存储器公司的出售案,日本东芝企业与合作伙伴美国西部数据(Western Digital)间展开的法律战,终于在7月29日这一天在美国法院暂时告一段落。 日前,西数提诉要求禁止出售东芝存储器,美国法院在 29 日命令东芝须在完成出售前两周通知西部数据,并没有禁止东芝进行出售协商。由于东芝并未被法院禁止出售,将与日美韩联盟继续协商。 西部数据声称这个价值达到180亿美元内存芯片业务的出售牵涉到它与东芝之间的合资企业股份,因此这一出售应该获得西部数据的同意。 东芝给西部数据的通知,将让西部数据提供机会回到法庭或仲裁小组,获得叫停止该交易的机会。此外,该协议还对有关加州的该法庭对东芝是否拥有司法管辖权疑
[手机便携]
设计移动电子产品时如何选择快闪存储器
当今无线电话。PDA等移动系统的设计人员,面对各种不同的使用要求,对如何选择合适的微处理器,存储器子系统,以及I/O器件,感到十分困惑。需要综合考虑进入市场的时限,成本,开发的工作量,尺寸,功耗,重量,性能等等一大堆限制和要求,结合各种各样器件的特长,进行优化搭配。由于各个项目的侧重点不同,项目的最佳解决方案也不可能相同。 一切运行算法的电子系统基本上都可以看作是一台有限状态机。处理器可以看作是下一状态的解码器,存储器可以看作是记录该状态机当前状态的寄存器。机器一通电,系统必须从非易失性存储器取得数据进行初始化;还需要得到向下一状态转换的全部程序编码。快闪存储器作为移动通信设备存储程序编码的存储器,作用非同小可。 系统的存
[缓冲存储]
人工智能重振存储器式运算架构
业界开始重新审视十年前开发的处理器架构,看好速度较GPU更快1万倍的所谓「存储器式运算」(In-Memory Computing;IMC),将有助于新一代AI加速器发展。 新创公司、企业巨擘和学术界开始重新审视十年前开发的处理器架构,看好它或许刚好就是机器学习(machine learning)的理想选择。他们认为,「存储器式运算」(In-Memory Computing;IMC)架构可望推动新型的人工智能(AI)加速器进展,使其速度较现行的GPU更快1万倍。 这些处理器承诺可在CMOS微缩速度放缓之际扩展芯片性能,而要求密集乘法累积阵列的深度学习演算法也正逐渐获得动能。这些芯片虽然距离商用化上市还有一年多的时间,但也可能
[半导体设计/制造]
STM32IO口复用时外设不工作问题的解决
近来碰到很多客户在使用STM32的外设时,由于IO口被用作复用功能,但是外设的初始化正确,GPIO口初始化正确,外设的时钟也已开启,但是外设无法正常运行。 其中最关键的一项,大多数使用者多没有设置,就是某个IO口被用作外设的接口时,需要开启IO口的复用功能的时钟,即进行外设、IO的时钟使能时,需要如下代码 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx | RCC_APB2Periph_AFIO, ENABLE);/* GPIOx and AFIO clock enable */ x --- 为对应的GPIO口,如:A、B、C、D、E。 希望用户在使用时,注意该要点!
[单片机]
为何所有的示波器采集存储器并非都相同
大部分人不会嫌他们的汽车太省油,或是嫌他们的房子太宽敞。同样地,大多数示波器用户总是会觉得示波器的采集存储器不够大。但是,正如您在汽油油耗(比如加速较慢)或住房面积上(供暖和制冷费用)的权衡一样;考虑到示波器的架构,您可能也会对更高的采集存储器做出最契合实际的取舍。 示波器采集存储器的重要性 采集存储器是示波器的重要组成部分。在简易的示波器中,采集存储器是由一个负责采集模拟信号的前端组成;随后将这个信号发送到模数转换器进行数字化处理。在数字化之后,信号的信息会被储存到存储器(采集存储器)中,然后进行处理和绘制/显示。示波器的采集存储器与采样率直接挂钩。存储器的容量越大,示波器的采样率就会越高,您就能捕获更长时间的波形。采样率越
[测试测量]
为何所有的示波器采集<font color='red'>存储器</font>并非都相同
意法半导体推出Page EEPROM二合一存储器 提升智能边缘设备的性能和能效
意法半导体推出Page EEPROM二合一存储器 提升智能边缘设备的性能和能效 新存储器兼备串行闪存的读取速度与EEPROM的字节级写操作灵活性,实现真正的两全其美 2024 年 10 月 15 日,中国—— 意法半导体的 Page EEPROM兼备EEPROM存储技术的能效和耐用性与闪存的存储容量和读写速度,为面临极端尺寸和功率限制的应用场景提供了一个混合存储器。 嵌入式系统需要支持日益复杂的先进功能,运行数据密集型的边缘 AI 算法,意法半导体的新存储器可以满足嵌入式应用对存储容量的日益增长的需求。例如,在耳背式助听器中,Page EEPROM可以降低物料清单成本,让助听器变得更纤薄,佩戴更舒适。 除
[嵌入式]
意法半导体推出Page EEPROM二合一<font color='red'>存储器</font>  提升智能边缘设备的性能和能效
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved