文档视界 最新最全的文档下载
当前位置:文档视界 › stm32_DMA传输数据

stm32_DMA传输数据

/*********************************************************************************************************
*
* File : main.c
* Hardware Environment: STM32F107VC
* Build Environment : RealView MDK-ARM Version: 4.74
* Version : V3.5.0
* By : 海鸥
*
* 设计思路:比较CPU传输数据和DMA传输相同数据的时间,突出DMA传输数据的优势
* 现象:Transmit Success !
* The CPU transfer time consume: 26us //数值仅供参考
* The DMA transfer time consume: 6us //数值仅供参考
*********************************************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include
#include

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
#define USART1_TX GPIO_Pin_6
#define USART1_RX GPIO_Pin_7
#define USART2_TX GPIO_Pin_5
#define USART2_RX GPIO_Pin_6
#define BufferSize 32

vu16 CurrDataCounter = 0; //定义DMA传输数目变量
vu32 Tick = 0;
uc32 SRC_Const_Buffer[BufferSize] =
{
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,
0X21222324,0X25262728,0X292A2B2C,0X2D2E2F30,
0X31323334,0X35363738,0X393A3B3C,0X3D3E3F40,
0X41424344,0X45464748,0X494A4B4C,0X4D4E4F50,
0X51525354,0X55565758,0X595A5B5C,0X5D5E5F60,
0X61626364,0X65666768,0X696A6B6C,0X6D6E6F70,
0X71727374,0X75767778,0X797A7B7C,0X7D7E7F80
};
u32 DST_Buffer[BufferSize];
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuration(void);
void Delay (uint32_t nCount);
void Putstring(uint8_t *string);
void DMA_Configuration(void);
void Senddata(uint16_t DATA);
/* Private functions ---------------------------------------------------------*/

/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
u8 i = 0;
u8 TickCntCPU = 0;
u8 TickCntDMA = 0;
uint8_t str[8]={0};
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
NVIC_Configuration();
DMA_Configuration();
SysTick_Config(72); // 1us 开启一次中断

/*——————开始使用CPU搬运数据并计时——————*/
Tick = 0;
for(i

= 0; i < BufferSize; i++)
{
DST_Buffer[i] = SRC_Const_Buffer[i];
}
TickCntCPU = Tick; // 保存计时数据

/*——————CPU搬运数据完成,清空缓存——————*/
for(i = 0; i < BufferSize; i++)
{
DST_Buffer[i] = 0;
}
/*——————DMA开始搬运数据并计时——————————*/
Tick = 0;
DMA_Cmd(DMA1_Channel6,ENABLE);
while(CurrDataCounter != 0);
TickCntDMA = Tick;

/*——————DMA搬运数据完成——————————*/
/*——————打印实验结果——————————*/
if(strncmp((const char*)SRC_Const_Buffer,(const char*)DST_Buffer,BufferSize) == 0)
{
Putstring("\r\n Transmit Success ! \r\n");
}
else
{
Putstring("\r\nTransmit Fault ! \r\n");
}
Putstring("\r\n The CPU transfer time consume:");
sprintf(str,"%d",TickCntCPU);
Putstring(str);
Putstring("us !\r\n");
for(i=0;i<8;i++) str[i] = 0;

Putstring("\r\nThe DMA transfer time consume:");
sprintf(str,"%d",TickCntDMA);
Putstring(str);
Putstring("us !\r\n");

while (1) ;


}
void Putstring(uint8_t *string)
{
while(*string!='\0')
{
USART_SendData(USART2,*string);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);
string++;
}

}
void Senddata(uint16_t DATA)
{
USART_SendData(USART2,DATA);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);
}
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD| RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //开启USART2的总线时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
/*******************************************************************************
* Function Name : GPIO_Configuration
* Description : Configure GPIO Pin
* Input : None
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

//USART2 GPIO配置
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
GPIO_InitStructure.GPIO_Pin = USART2_TX ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = USART2_RX ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD , &GPIO_InitStructure);
}
void USART_Configuration(void)
{
//USART2配置
USART_InitTypeDef USART_InitStructure;

USART_https://www.docsj.com/doc/f813356151.html,ART_BaudRate = 115200;
USART_https://www.docsj.com/doc/f813356151.html,ART_WordLength = USART_WordLength_8b;
USART_https://www.docsj.com/doc/f813356151.html,ART_StopBits = USART_StopBits_1;
USART_https://www.docsj.com/doc/f813356151.html,ART_Parity = USART_Parity_No;
USART_https://www.docsj.com/doc/f813356151.html,ART_HardwareFlowControl = USART_Hardware

FlowControl_None;
USART_https://www.docsj.com/doc/f813356151.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART2,&USART_InitStructure);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_Cmd(USART2,ENABLE);

}


void NVIC_Configuration(void)
{
/* USART2 中断配置 */
NVIC_InitTypeDef NVIC_InitStructure; //定义数据结构体

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);//将中断矢量放到Flash的0地址

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置优先级配置的模式,详情请阅读原材料中的文章

//使能串口中断,并设置优先级
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); //将结构体丢到配置函数,即写入到对应寄存器中

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel6);
DMA_InitStructure.DMA_PeripheralBaseAddr = ((u32)SRC_Const_Buffer);
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DST_Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据的来源
DMA_InitStructure.DMA_BufferSize = BufferSize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
DMA_Init(DMA1_Channel6, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel6,DMA_IT_TC,ENABLE);
CurrDataCounter = DMA_GetCurrDataCounter(DMA1_Channel6);

}


/*******************************************************************************
* Function Name : Delay
* Description : Delay Time
* Input : - nCount: Delay Time
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
void Delay (uint32_t nCount)
{
for(; nCount != 0; nCount--);
}


#ifdef USE_FULL_ASSERT

/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
e

x: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* Infinite loop */
while (1)
{
}
}
#endif

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

/* stm32f10x_it.c 文件下添加如下程序*/

extern vu16 CurrDataCounter;
extern vu32 Tick;
void SysTick_Handler(void)
{
Tick++;
}
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
USART_SendData(USART2, USART_ReceiveData(USART2));

}

}
void DMA1_Channel6_IRQHandler(void)
{
CurrDataCounter = DMA_GetCurrDataCounter(DMA1_Channel6);
DMA_ClearITPendingBit(DMA1_IT_GL6);

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

相关文档
相关文档 最新文档