stm32的串口空闲中断接收数据

举个例子:

1、后台数据->USART1-> USART2->其它设备,其它设备数据->USART2-> USART1->后台,这两个数据过程也可能同时进行。

2、由于硬件的限制,USART1和USART2的传输波特率不一样,比如USART1使用GPRS通信,USART2使用短距离无线通信;或者USART1使用以太网通信,USART2使用485总线通信。

现在我把我实现的过程简单描述一下:

1、 初始化设置:USART1_RX DMA1_ Channel5,USART2_RX DMA1_ Channel6,,USART1_TX DMA1_ Channel4,USART2_TX DMA1_ Channel7(具体设置请看程序包)2、 当数据发送给USART1接收完毕时候会引起USART1的串口总线中断,计算DMA1_ Channel5内存数组剩余容量,得到接收的字符长度。将接收的字符复制给DMA1_ Channel4内存数组,启动DMA1_ Channel4通道传输数据,(传输完成需要关闭。)下一次数据接收可以在启动DMA1_ Channel4时候就开始,不需要等待DMA1_ Channel4数据传输完成。但是上一次DMA1_ Channel4完成之前,不可以将数据复制给DMA1_ Channel4内存数组,会冲掉以前数据。

3、 USART2类同USART1。

源程序:

IO口定义:void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/* 第1步:打开GPIO和USART部件的时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);/* 第2步:将USART Tx的GPIO配置为推挽复用模式 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 第3步:将USART Rx的GPIO配置为浮空输入模式由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 第1步:打开GPIO和USART2部件的时钟 *///RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);/* 第2步:将USART2 Tx的GPIO配置为推挽复用模式 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 第3步:将USART2 Rx的GPIO配置为浮空输入模式由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 第3步已经做了,因此这步可以不做GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;*/GPIO_Init(GPIOA, &GPIO_InitStructure);

}

串口初始化:void USART_Configuration(void){USART_InitTypeDef USART_InitStructure;/* 第4步:配置USART参数- BaudRate = 115200 baud- Word Length = 8 Bits- One Stop Bit- No parity- Hardware flow control disabled (RTS and CTS signals)- Receive and transmit enabled*/USART_InitStructure.USART_BaudRate = 19200;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_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

//配置USART1空闲中断

USART_ITConfig(USART1, USART_IT_IDLE , ENABLE);

/* 第5步:使能 USART, 配置完毕 */USART_Cmd(USART1, ENABLE);/* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去如下语句解决第1个字节无法正确发送出去的问题 */USART_ClearFlag(USART1, USART_FLAG_TC); /* 清发送完成标志,Transmission Complete flag */USART_InitStructure.USART_BaudRate = 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_Rx | USART_Mode_Tx;

USART_Init(USART2, &USART_InitStructure);

//配置USART2空闲中断

USART_ITConfig(USART2, USART_IT_IDLE , ENABLE);USART_Cmd(USART2, ENABLE);/* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去如下语句解决第1个字节无法正确发送出去的问题 */USART_ClearFlag(USART2, USART_FLAG_TC);/* 清发送外城标志,Transmission Complete flag */

}

DMA配置:void DMA_Configuration(void){DMA_InitTypeDef DMA_InitStructure;/* DMA clock enable */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//开启DMA1外设时钟/* DMA1 Channel4 (triggered by USART1 Tx event) Config */DMA_DeInit(DMA1_Channel4);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_SEND_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStructure.DMA_BufferSize = 512;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_Circular;//循环模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel4, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE);/* Enable USART1 DMA TX request */USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);DMA_Cmd(DMA1_Channel4, DISABLE);/* DMA1 Channel5 (triggered by USART2 Tx event) Config */DMA_DeInit(DMA1_Channel7);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_SEND_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStructure.DMA_BufferSize = 512;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_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel7, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, ENABLE);/* Enable USART1 DMA TX request */USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);DMA_Cmd(DMA1_Channel7, DISABLE);/* DMA1 Channel5 (triggered by USART1 Rx event) Config */DMA_DeInit(DMA1_Channel5);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_RECEIVE_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 512;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_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel5, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, ENABLE);/* Enable USART1 DMA RX request */USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);DMA_Cmd(DMA1_Channel5, ENABLE);/* DMA1 Channel6 (triggered by USART1 Rx event) Config */DMA_DeInit(DMA1_Channel6);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_RECEIVE_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 512;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_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel6, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);DMA_ITConfig(DMA1_Channel6, DMA_IT_TE, ENABLE);/* Enable USART2 DMA RX request */USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);DMA_Cmd(DMA1_Channel6, ENABLE);

}

望着它们,我睡着了。今天已经过去——我生命中所有天中的一天,

stm32的串口空闲中断接收数据

相关文章:

你感兴趣的文章:

标签云: