1.初始化
void usart1_dma_init(void) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); // Enable GPIO clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//USART 端口配置
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX GPIOA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART 初始化设置
USART_InitStructure.USART_BaudRate = 115200; // 波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长为8 位数据格式
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_Rx | USART_Mode_Tx; // 收发模式
USART_Init(TEST_UART, &USART_InitStructure); // 初始化串口
USART_ITConfig(TEST_UART, USART_IT_RXNE, ENABLE); // 开启空闲中断
USART_ITConfig(TEST_UART, USART_IT_IDLE, ENABLE); // 开启空闲中断
USART_Cmd(TEST_UART, ENABLE); // 使能串口
//Usart NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = TEST_UART_IRQn; // 串口中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); // 根据指定的参数初始化VIC 寄存器
}
2.空闲中断
//空闲中断 void USART1_IRQHandler(void) { unsigned int data;
if(USART_GetITStatus(TEST_UART,USART_IT_RXNE) != RESET)
{
rx_buff[rx_cnt] = USART_ReceiveData(TEST_UART);
rx_cnt++;
}
if(USART_GetITStatus(TEST_UART,USART_IT_IDLE) != RESET)
{
data = TEST_UART->SR; // 清空闲中断
data = TEST_UART->DR;
usart_idle_flag = 1; // 产生空闲中断
}
}
3.主函数
while(1) { if(1 == usart_idle_flag) { usart_idle_flag = 0; 数据解析 rx_cnt = 0; } }
4.函数定义
extern unsigned char usart_idle_flag; //空闲中断标志位 extern unsigned char rx_buff[15]; extern unsigned char rx_cnt;
|