单片机
返回首页

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

2019-06-21 来源:eefocus

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**********************/


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章