求牛人指点:
程序预实现按下key0(PA13)将50个数,采用DMA方式通过USART1发送给pc,可是按下后发现不能进行DMA发送
#include"stm32f10x_lib.h"
#include"stdio.h"
char SENTBUFF[50]={
46,47,48,44,45,46,47,48,44,45,46,47,48,44,45,46,47,48,44,45,46,47,48,44,45,
46,47,48,44,45,46,47,48,44,45,46,47,48,44,45,46,47,48,44,45,46,47,48,44,45
};
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void DMA_Configuration(void);
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
DMA_Configuration();
printf("\r\n start.... \r\n "); //初始化完成
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13)); //按下key0进行DMA发送开始
printf("\r\n start DMA.. \r\n ");
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //usart1打开DMA
DMA_Cmd(DMA1_Channel5,ENABLE); //使能DMA1Channel5
while(DMA_GetFlagStatus(DMA1_FLAG_TC5) == RESET); //等待DMA发送完成
//DMA_Cmd(DMA1_Channel5,DISABLE);
printf("\r\n start DMA SUCCESS \r\n ");
while(1);
}
void RCC_Configuration(void)
{
/* 定义枚举类型变量 HSEStartUpStatus */
ErrorStatus HSEStartUpStatus;
/* 复位系统时钟设置*/
RCC_DeInit();
/* 开启HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/* 等待HSE起振并稳定*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判断HSE起是否振成功,是则进入if()内部 */
if(HSEStartUpStatus == SUCCESS)
{
/* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 设置FLASH延时周期数为2 */
FLASH_SetLatency(FLASH_Latency_2);
/* 使能FLASH预取缓存 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能PLL */
RCC_PLLCmd(ENABLE);
/* 等待PLL输出稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 选择SYSCLK时钟源为PLL */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待PLL成为SYSCLK时钟源 */
while(RCC_GetSYSCLKSource() != 0x08);
}
/* 打开APB2总线上的GPIOA,USART1时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);
//打开AHB-DMA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
}
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIOA_Struct;
//key0——PA13
GPIOA_Struct.GPIO_Pin=GPIO_Pin_13;
GPIOA_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIOA_Struct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIOA_Struct);
/////////////////////////
//TX--PA9
GPIOA_Struct.GPIO_Pin=GPIO_Pin_9;
GPIOA_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIOA_Struct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIOA_Struct);
//RX--PA10
GPIOA_Struct.GPIO_Pin=GPIO_Pin_10;
GPIOA_Struct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIOA_Struct);
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate=115200; //波特率
USART_InitStruct.USART_WordLength=USART_WordLength_8b;//字长
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_Parity=USART_Parity_No; //奇偶
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//发送接受使能
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//数据流控制
USART_Init(USART1, &USART_InitStruct);
USART_Cmd(USART1,ENABLE);//使能USART1
}
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART1->DR;// 0x40013804
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)SENTBUFF;
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize=50; //发送50个字节
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority=DMA_Priority_High;
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
}
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (u8) ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return ch;
} |