本帖最后由 missing01 于 2014-3-23 17:36 编辑
//#include <stm32f0xx_lib.h>
#include <stdint.h>
#include <system_stm32f0xx.h>
#include <stm32f0xx_gpio.h>
#include <Main.h>
#include "systick.h"
#include "LCD32.h"
#include "dma.h"
//#define ADC1_DR_Address 0x40013800
#define USART1_TDR_Address 0x40013828
const uint8_t TEXT_TO_SEND[]={"ALIENTEK MiniSTM32 DMA ????"};
uint8_t SendBuff[16]="nihaoshijie";
void LedInit()
{
GPIO_InitTypeDef gpiostudy;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,ENABLE);//使能AHB外设GPIOA时钟
gpiostudy.GPIO_Pin=GPIO_Pin_11;
gpiostudy.GPIO_Mode=GPIO_Mode_OUT;
gpiostudy.GPIO_Speed=GPIO_Speed_50MHz;
gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL;
gpiostudy.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA,&gpiostudy);
}
void usart_init()
{
GPIO_InitTypeDef gpiostudy;
USART_InitTypeDef USART_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);//使能AHB外设GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能串口时钟;
//PA.9 TX
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
gpiostudy.GPIO_Pin=GPIO_Pin_9;
gpiostudy.GPIO_Mode=GPIO_Mode_AF;
gpiostudy.GPIO_OType=GPIO_OType_PP;
gpiostudy.GPIO_PuPd=GPIO_PuPd_UP;
gpiostudy.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpiostudy);
// PA.10 RX
gpiostudy.GPIO_Pin=GPIO_Pin_10;
gpiostudy.GPIO_Mode=GPIO_Mode_OUT;
gpiostudy.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpiostudy);
USART_InitStructure.USART_BaudRate = 9600;//一般设置为9600;
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_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//使能串口1 的 DMA发送
// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
// USART_Cmd(USART1, ENABLE); //使能串口
}
void delay(int i)
{
int j,k;
for(j=0;j<15000;j++)
{
for(k=0;k<i;k++);
}
}
void MYDMA_Init()
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA 总线时钟
DMA_DeInit(DMA1_Channel4);
// DMA1_MEM_LEN=cndtr;
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)USART1_TDR_Address; //DMA外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SendBuff; //DMA内存基地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST; //外设作为DMA传输的目的地址
DMA_InitStructure.DMA_BufferSize=16; // DMA通道的DMA缓存大小
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设寄存器地址不变
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//DMA 内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//DMA工作在正常缓存模式
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA通道拥有中等优先级
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//DMA通道X没有设置内存到内存的操作
DMA_Init(DMA1_Channel4, &DMA_InitStructure); //按照以上参数初始化DMA
}
int main()
{
float pro=0;//进度
GPIO_SetBits(GPIOA,GPIO_Pin_11);
LedInit();
SystemInit();
Systick_NVICInit();
// MYDMA_Config(DMA1_Channel4,(uint32_t)USART1_TDR_Address,(uint32_t)SendBuff,16);//DMA1??4,?????1,????SendBuff,??5200
usart_init();
// MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!
MYDMA_Init();
DMA_Cmd(DMA1_Channel4, ENABLE); //使能USART1 TX DMA1 ??????
while(1)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC4) == SET)//等待通道4传输完成
{
DMA_ClearFlag(DMA1_FLAG_TC4); //清除发送完成标志
break;
}
pro = DMA_GetCurrDataCounter(DMA1_Channel4); //得到当前还剩余多少个数据
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
delay(1000); //1s
GPIO_SetBits(GPIOA,GPIO_Pin_11);
delay(2000); //1s
}
}
以上是主函数中的代码
|