#include "stm32f4xx.h" // Device header
#include "delay.h"
#include "serial.h"
#include <stdio.h>
#define BUFF_SIZE 100
void DMA_USART_to_RAM();
uint8_t RxData;
uint8_t RxFlag;
uint8_t RxBuf[BUFF_SIZE]={0};
void DMA_USART_ENABLE();
int main(){
Serial_Init();
DMA_USART_to_RAM();
printf("success\r\n");
while(1){
if(RxFlag==1){
printf("into interrupt\r\n");
DMA_USART_ENABLE();
printf("RxData=%d\r\n",RxData);
printf("USART_ReceiveData(USART2)=%d\r\n",USART_ReceiveData(USART2));
while(DMA_GetFlagStatus(DMA1_Stream5,DMA_FLAG_TCIF5)==RESET);
for(uint16_t k=0;k<BUFF_SIZE;k++){
printf("RxBuf[%d]=%d\r\n",k,RxBuf[k]);
}
RxFlag=0;
}
}
}
void DMA_USART_to_RAM(){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_BufferSize=BUFF_SIZE;
DMA_InitStructure.DMA_Channel=DMA_Channel_4;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&RxBuf;
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)&USART2->DR;
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_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority=DMA_Priority_High;
DMA_Init(DMA1_Stream5,&DMA_InitStructure);
DMA_ITConfig(DMA1_Stream5,DMA_IT_TC,ENABLE);
}
void DMA_USART_ENABLE(){
USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
DMA_Cmd(DMA1_Stream5,ENABLE);
}
void USART2_IRQHandler(){
if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET){
RxData=USART_ReceiveData(USART2);
RxFlag=1;
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
}
#include "stm32f4xx.h" // Device header
#include "delay.h"
#include "serial.h"
#include <stdio.h>
#define BUFF_SIZE 100
void DMA_USART_to_RAM();
uint8_t RxData;
uint8_t RxFlag;
uint8_t RxBuf[BUFF_SIZE]={0};
void DMA_USART_ENABLE();
int main(){
Serial_Init();
DMA_USART_to_RAM();
printf("success\r\n");
while(1){
if(RxFlag==1){
printf("into interrupt\r\n");
DMA_USART_ENABLE();
printf("RxData=%d\r\n",RxData);
printf("USART_ReceiveData(USART2)=%d\r\n",USART_ReceiveData(USART2));
while(DMA_GetFlagStatus(DMA1_Stream5,DMA_FLAG_TCIF5)==RESET);
for(uint16_t k=0;k<BUFF_SIZE;k++){
printf("RxBuf[%d]=%d\r\n",k,RxBuf[k]);
}
RxFlag=0;
}
}
}
void DMA_USART_to_RAM(){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_BufferSize=BUFF_SIZE;
DMA_InitStructure.DMA_Channel=DMA_Channel_4;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&RxBuf;
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)&USART2->DR;
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_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority=DMA_Priority_High;
DMA_Init(DMA1_Stream5,&DMA_InitStructure);
DMA_ITConfig(DMA1_Stream5,DMA_IT_TC,ENABLE);
}
void DMA_USART_ENABLE(){
USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
DMA_Cmd(DMA1_Stream5,ENABLE);
}
void USART2_IRQHandler(){
if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET){
RxData=USART_ReceiveData(USART2);
RxFlag=1;
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
}
为什么DMA不能实现USART2->DR到RxBuf数据转运?