实例代码,仅供参考
/*************************************************************
函数名:void USART1_Config(void)
参 数: 无
作 用: 无
说 明: 配置USART1模块
***************************************************************/
void USART1_Config(void)
{
USART1_RCC_Config();
USART1_GPIO_Config();
USART1_Mode_Config();
USART1_NVIC_Config();
USART1_DMA_Configuration();
USART1_RX_Box=OSMboxCreate((void*)0); //初始化串口1接收邮箱为空
}
/*************************************************************
函数名:void USART1_RCC_Config(void)
参 数: 无
作 用: 无
说 明: 配置TXD,RXDIO时钟,以及USART1模块的时钟
***************************************************************/
void USART1_RCC_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE); //IO口时钟在APB2总线上
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
/*************************************************************
函数名:void USART1_GPIO_Config(void)
参 数: 无
作 用: 无
说 明: 配置USART1关联的TXD(PA9),RXD(PA10)
***************************************************************/
void USART1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //IO配置
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/*************************************************************
函数名:void USART1_Mode_Config(void)
参 数: 无
作 用: 无
说 明:配置USART1 工作模式
***************************************************************/
void USART1_Mode_Config(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=115200; //配置串口属性
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
/*************************************************************
函数名:void USART1_NVIC_Config(void)
参 数: 无
作 用: 无
说 明: 配置USART的中断入口,中断优先级,并使能USART1接收中断
***************************************************************/
void USART1_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //配置串口中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = UART1_IDLE_PRIO ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART1,USART_IT_TC,DISABLE); //
USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
USART_ITConfig(USART1,USART_IT_IDLE,ENABLE); //开启空闲接收中断
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //使能DMA接收
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //使能DMA发送
}
/*************************************************************
函数名: void USART1_DMA_Configuration(void)
参 数: 无
作 用: 无
说 明: 把USART1 配置DMA接收发送方式
***************************************************************/
void USART1_DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
/*****************************************************
配置发送方式
****************************************************/
DMA_DeInit(DMA1_Channel4);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_TX_BUF;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = USART1_MAX_SEND_LEN; //
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_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
/*****************************************************
配置接收方式
****************************************************/
DMA_DeInit(DMA1_Channel5); //DMA1通道5配置
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR); //外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_RX_BUF; //内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //dma传输方向单向
DMA_InitStructure.DMA_BufferSize = USART1_MAX_RECV_LEN; //设置DMA在传输时缓冲区的长度
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式,一个外设
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据字长
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据字长
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的传输模式
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //设置DMA的优先级别
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //设置DMA的2个memory中的变量互相访问
DMA_Init(DMA1_Channel5,&DMA_InitStructure);
DMA_Cmd(DMA1_Channel5,ENABLE); //使能通道5
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
DMA_Cmd(DMA1_Channel5,DISABLE);
OSMboxPost(USART1_RX_Box,(void*)1);
USART1_RX_STA = USART1->SR;
USART1_RX_STA = USART1->DR; //清USART_IT_IDLE标志
USART1_RX_STA = USART1_MAX_RECV_LEN - DMA_GetCurrDataCounter(DMA1_Channel5); //设置传输数据长度
DMA1_Channel5->CNDTR = USART1_MAX_RECV_LEN;//重装填,并让接收地址偏址从0开始
DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA
}
__nop();
}
|