嵌入式stm32学习:DMA-存储到外设

发布者:心灵的旅程最新更新时间:2019-06-21 来源: eefocus关键字:stm32  DMA  存储到外设 手机看文章 扫描二维码
随时随地手机看文章

bsp_usart_dma.h


#ifndef __USART_DMA_H

#define __USART_DMA_H


#include "stm32f4xx.h"

#include



//USART

#define DEBUG_USART                       USART1

#define DEBUG_USART_CLK                   RCC_APB2Periph_USART1

#define DEBUG_USART_RX_GPIO_PORT          GPIOA

#define DEBUG_USART_RX_GPIO_CLK           RCC_AHB1Periph_GPIOA

#define DEBUG_USART_RX_PIN                GPIO_Pin_10

#define DEBUG_USART_RX_AF                 GPIO_AF_USART1

#define DEBUG_USART_RX_SOURCE             GPIO_PinSource10


#define DEBUG_USART_TX_GPIO_PORT          GPIOA

#define DEBUG_USART_TX_GPIO_CLK           RCC_AHB1Periph_GPIOA

#define DEBUG_USART_TX_PIN                GPIO_Pin_9

#define DEBUG_USART_TX_AF                 GPIO_AF_USART1

#define DEBUG_USART_TX_SOURCE             GPIO_PinSource9


#define DEBUG_USART_BAUDRATE              115200


//DMA

#define DEBUG_USART_DR_BASE               (USART1_BASE+0x04)        

#define SENDBUFF_SIZE                     5000              //发送的数据量

#define DEBUG_USART_DMA_CLK               RCC_AHB1Periph_DMA2   

#define DEBUG_USART_DMA_CHANNEL           DMA_Channel_4

#define DEBUG_USART_DMA_STREAM            DMA2_Stream7


void Debug_USART_Config(void);

void USART_DMA_Config(void);



#endif /* __USART1_H */


bsp_usart_dma.c


/**

  ******************************************************************************

  * 重定义C库函数printf到USART端口,使用DMA模式发送数据

  ******************************************************************************

  */ 


#include "./usart/bsp_usart_dma.h"


uint8_t SendBuff[SENDBUFF_SIZE];




 /**

  * @brief  USART GPIO 配置,工作模式配置。115200 8-N-1

  */

void Debug_USART_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;----------------------------


  RCC_AHB1PeriphClockCmd( DEBUG_USART_RX_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK, ENABLE);


  /* Enable UART clock */

  RCC_APB2PeriphClockCmd(DEBUG_USART_CLK, ENABLE);


  /* Connect PXx to USARTx_Tx*/

  GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE, DEBUG_USART_RX_AF);


  /* Connect PXx to USARTx_Rx*/

  GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);


  /* Configure USART Tx as alternate function  */

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;


  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN  ;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);


  /* Configure USART Rx as alternate function  */

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;

  GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);


  /* USART mode config */

  USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_Parity = USART_Parity_No ;

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(DEBUG_USART, &USART_InitStructure); 

  USART_Cmd(DEBUG_USART, ENABLE);

}


///重定向C库函数printf到USART1

int fputc(int ch, FILE *f)

{

        /* 发送一个字节数据到USART1 */

        USART_SendData(DEBUG_USART, (uint8_t) ch);


        /* 等待发送完毕 */

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


        return (ch);

}


///重定向C库函数scanf到USART1

int fgetc(FILE *f)

{

        /* 等待串口输入数据 */

        while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET);


        return (int)USART_ReceiveData(DEBUG_USART);

}



/**

  * @brief  USART1 TX DMA 配置,内存到外设(USART1->DR)

  */

void USART_DMA_Config(void)

{

  DMA_InitTypeDef DMA_InitStructure;


  /*开启DMA时钟*/

  RCC_AHB1PeriphClockCmd(DEBUG_USART_DMA_CLK, ENABLE);


  /* 复位初始化DMA数据流 */

  DMA_DeInit(DEBUG_USART_DMA_STREAM);


  /* 确保DMA数据流复位完成 */

  while (DMA_GetCmdStatus(DEBUG_USART_DMA_STREAM) != DISABLE)  {

  }


  /*USART tx对应DMA2,通道4,数据流7*/   

  DMA_InitStructure.DMA_Channel = DEBUG_USART_DMA_CHANNEL;  

  /*设置DMA源,串口数据寄存器地址*/

  DMA_InitStructure.DMA_PeripheralBaseAddr = DEBUG_USART_DR_BASE;    

  /*内存地址(要传输的变量的指针)*/

  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)SendBuff;

  /*方向:内存到外设*/      

  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;   

  /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/  

  DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;

  /*外设地址不增*/        

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 

  /*内存地址自增*/

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   

  /*外设数据单位*/    

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  /*内存数据单位 8bit*/

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;   

  /*DMA模式:循环*/

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;    

  /*优先级:中*/ 

  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;      

  /*禁用FIFO*/

  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;        

  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;    

  /*存储器突发传输16个节拍*/

  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;    

  /*外设突发传输1个节拍*/

  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;    

  /*配置DMA2的数据流7*/          

  DMA_Init(DEBUG_USART_DMA_STREAM, &DMA_InitStructure);


  /*使能DMA*/

  DMA_Cmd(DEBUG_USART_DMA_STREAM, ENABLE);


  /*等待DMA数据流有效*/

  while(DMA_GetCmdStatus(DEBUG_USART_DMA_STREAM) != ENABLE)

  {

  }   

}



/*********************************************END OF FILE**********************/


关键字:stm32  DMA  存储到外设 引用地址:嵌入式stm32学习:DMA-存储到外设

上一篇:嵌入式stm32学习:I2C-读写EEPROM
下一篇:嵌入式stm32学习:DMA-存储到存储

推荐阅读最新更新时间:2024-11-09 21:14

STM32控制步进电机实现精确转动
驱动方式为A-AB-B-BC-C-CD-D-DA-A 使用延时函数实现 主函数 #include dj.h #include delay.h #include sys.h #include key_led.h //ALIENTEK miniSTM32¿ª·¢°åʵÑé1 //ÅÜÂíµÆʵÑé //¼¼ÊõÖ§³Ö£ºwww.openedv.com //¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ int main() { int i=512; //ÕâÀïתһȦÐèÒª4096¸öÂö³åÐźŠתһȦ
[单片机]
STM8L051之通过ADC1与DMA读取内部参考电压
stm8L051芯片内部的参考电压与电源电压有一定的关系 这在芯片供电电压变化的情况下,测量外部ADC电压输入提供一个确定的参考电压。这里提前厘清下:该内部参考电压VREFINT 并非ADC 的参考电压,ADC 的参考电压依然是VDD。即使VDD 有所波动,这个VREFINT 电压恒定不变,对于ADC 电路而言,它只是个测试点。 对于某固定的ADC 参考电压情况下,所有被测电压点的AD转换值与该点电压值保持同一比例关系,换句话说,对于ADC参考电压固定情况下,各点的电压与ADC值与成线性关系。下面图形是芯片分别在3个不同参考电压的示意图,这里参考电压接VDD。下面三根斜线分别是VDD 为2.8V、3.2V、3.6V 时的A
[单片机]
STM8L051之通过ADC1与<font color='red'>DMA</font>读取内部参考电压
STM32启动过程解析-2.02固件库启动文件分析
启动过程也许平时开发的时候不用太多关注,但是了解一下有助于我们加深对芯片工作过程的理解。 相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况: 1、 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处; 2、 通过boo
[单片机]
STM32 IAP相关知识
最近因项目需求要实现STM32的在线升级即IAP功能,先将这几天的学习体会和IAP的具体实现总结出来,分享给大家,希望对同样实现IAP的童鞋有所帮助,文中最后会上传名为STM32_Update.zip的压缩文件里面包含了STM32_App、STM32_MyBoot_V1.0和升级软件STM32_UpdateSoftware的源码文件供大家参考。所有程序都经过测试,可以直接在原子哥的 开发板 上跑,上位机的升级软件大家可以直接打开 STM32_UpdateSTM32_UpdateSoftwareReleaseSTM32_UpdateSoftware.exe来升级,如果需要查看源码请用VS2010打开工程文件。 最终要实现的是: 单片
[单片机]
<font color='red'>STM32</font> IAP相关知识
STM32实现编码器M法测速接线
接线 编码器电机、电机驱动(这里用的L298n)、STM32、电源(可以是12V电池)的接线如下 3.3 代码编写 encoder.h中的内容 #ifndef _ENCODER_H_ #define _ENCODER_H_ #include stm32f1xx.h //电机1的编码器输入引脚 #define MOTO1_ENCODER1_PORT GPIOA #define MOTO1_ENCODER1_PIN GPIO_PIN_0 #define MOTO1_ENCODER2_PORT GPIOA #define MOTO1_ENCODER2_PIN GPIO_PIN_1 //定时器号 #define ENC
[单片机]
<font color='red'>STM32</font>实现编码器M法测速接线
STM32 I2C总线通信与SPI总线通信专题讲解
总线介绍: I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线(单双工),用于连接微控制器及其外围设备,在这两根线上可以挂很多设备,同一时刻只能有一个节点处于主机模式,其他节点处于从机模式,总线上数据的传送都由主机发起。I2C总线没有片选信号线,所以需要通过协议来找到对应操作的芯片。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。 总线特征: 1.两条总线线路:一条串行数据SDA,一条串行时钟线SCL(主从设备使用同一时钟,属于同步通信)来完成数据的传输及外围器件的
[单片机]
<font color='red'>STM32</font> I2C总线通信与SPI总线通信专题讲解
STM32与无源蜂鸣器
使用有源蜂鸣器,只能发出固定的”滴滴“声,当然不能满足于此呀。使用无源蜂鸣器,只要输出不同频率的PWM波,即可发出不同的音符。不同的音符组合起来就是一个曲子了。 1 乐谱简析 1.1 音阶 音阶是音乐必不可少的要素,主要由声音的频率决定。通过给蜂鸣器不同频率的音频脉冲,可以产生不同的音阶,而要产生某频率的音频脉冲,最简单的办法是算出该音频的周期,然后将此周期除以2即为半周期的时间。通过程序控制单片机某引脚半周期为“高”、半周期为“低”,不断交替变换,即可产生该频率的矩形波,接到蜂鸣器上就可发出该频率的声音。若想改变音阶,只需要改变半周期时间即可。下表为各音调音符频率对照表,据此可产生不同音阶的音符。“#”表示半
[单片机]
<font color='red'>STM32</font>与无源蜂鸣器
STM32 ADC的采样周期确定
一 STM32 ADC 采样 频率的确定   先看一些资料,确定一下STM32 ADC 的时钟:   (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步。CLK 控制器为ADC 时钟提供一个专用的可编程预分频器。   (2)一般情况下在程序 中将 PCLK2 时钟设为 与系统时钟 相同   RCC_HCLKConfig(RCC_SYSCLK_Div1);   RCC_PCLK2Config(RCC_HCLK_Div1);   RCC_PCLK1Config(RCC_HCLK_Div2);   (3)在时钟配置寄存器(RCC_CFGR) 中 有 为ADC 时钟提供一个专用的可编程预分器   位15:14 A
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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