1、STM32 串口 4 接收 DMA+闲时中断void uart4_init(u32 bound)GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /使能 UART4,GPIOA 时钟/UART4_TX GPIOC.1
2、0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /PC.10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用推挽输出GPIO_Init(GPIOC, /初始化 GPIOC.10/UART4_RX GPIOC.11 初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;/PC11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLO
3、ATING;/浮空输入GPIO_Init(GPIOC, /初始化 GPIOC11 /Uart4 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;/抢占优先级 3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; /子优先级 3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/IRQ 通道使能NVIC_Init( /根据指定的参数
4、初始化 VIC寄存器/USART 初始化设置USART_InitStructure.USART_BaudRate = bound;/串口波特率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_HardwareFlowCo
5、ntrol = USART_HardwareFlowControl_None;/无硬件数据流控制USART_InitStructure.USART_Mode =USART_Mode_Tx| USART_Mode_Rx; /收发模式USART_Init(UART4, /初始化串口 4USART_ITConfig(UART4, USART_IT_IDLE, ENABLE);USART_DMACmd(UART4,USART_DMAReq_Rx,ENABLE);USART_Cmd(UART4, ENABLE); /使能串口 4void MYDMA_Config(DMA_Channel_TypeDef*
6、 DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);/使能 DMA 传输DMA_DeInit(DMA_CHx); /将 DMA 的通道 1 寄存器重设为缺省值DMA1_MEM_LEN=cndtr;DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; /DMA 外设基地址DMA_InitStructure.DMA_MemoryBaseAddr =cmar; /DMA 内存基地址DMA_InitStructure.DMA_DIR =
7、DMA_DIR_PeripheralSRC; /外设作为数据源,从外设发到片内DMA_InitStructure.DMA_BufferSize = cndtr; /DMA 通道的DMA 缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralData
8、Size_Byte; /外设数据宽度为 8 位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /数据宽度为 8 位DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; /工作在正常缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /DMA 通道 x 拥有中优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /DMA 通道 x 没有设置为内存到内存传输DMA_Init(
9、DMA_CHx, /根据DMA_InitStruct 中指定的参数初始化 DMA 的通道USART1_Tx_DMA_Channel 所标识的寄存器DMA_Cmd(DMA_CHx, DISABLE); /关闭 UART4 TX DMA1 所指示的通道 DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);/DMA通道的 DMA 缓存的大小DMA_Cmd(DMA_CHx, ENABLE); /使能 UART4 TX DMA2 所指示的通道 void UART4_IRQHandler(void) /串口 4 中断服务程序unsigned char num=0;if
10、(USART_GetITStatus(UART4,USART_IT_IDLE) = SET)num = UART4-SR;/先读 SR,再读 DR 才能清楚标志位num = UART4-DR; /SR、DR 赋值清标志位,清USART_IT_IDLE 标志DMA_Cmd(DMA2_Channel3, DISABLE); /关闭 DMAnum = DMA_GetCurrDataCounter(DMA2_Channel3); /得到真正接收数据个数 DMA2_Channel3-CNDTR=20; /重新设置接收数据个数 DMA_Cmd(DMA2_Channel3,ENABLE); /开启 DMAvoid main(void)MYDMA_Config(DMA2_Channel3,(u32)/初始化串口 4DMA