1、STM32F103多个串口配置DMA程序纯代码版详解软件:KeilMDK芯片:STM32F103/STM32F107串口数量:4备注:4个串口均配置为DMA读取/串口1初始化函数void uart1_init(u32 bound) /GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_G
2、PIOA, ENABLE); /使能USART1,GPIOA时钟 USART_DeInit(USART1); /复位串口1 /USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); /初始化PA9 /USART1_RX PA.10 GPIO
3、_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); /初始化PA10 /Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;/抢占优先级3 NVIC_InitStructure.NVIC_
4、IRQChannelSubPriority = 0; /子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ通道使能 NVIC_Init(&NVIC_InitStructure); /根据指定的参数初始化VIC寄存器 /*Enable DMA Channel4 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_Init
5、Structure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*Enable DMA Channel5 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQC
6、hannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /USART 参数初始化设置 USART_InitStructure.USART_BaudRate = bound;/一般设置为9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;/字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;/一个
7、停止位 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); /初始化串口 / USART_ITConfig(USART1, USAR
8、T_IT_RXNE, ENABLE);/开启中断 USART_ITConfig(USART1, USART_IT_IDLE , ENABLE); /开启空闲中断 USART_Cmd(USART1, ENABLE); /使能串口 /串口2初始化函数void uart2_init(u32 bound) GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph
9、_GPIOA, ENABLE);/使能GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);/使能USART2时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /PA2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用推挽 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure
10、.GPIO_Pin = GPIO_Pin_3;/PA3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);/复位串口2 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);/停止复位 USART_InitStructure.USART_BaudRate = bound;/一般设置为9600
11、; 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.USA
12、RT_Mode = USART_Mode_Rx | USART_Mode_Tx;/收发模式 USART_Init(USART2, &USART_InitStructure); ; /初始化串口 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; /使能串口2中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /先占优先级2级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /从优先级2级 NVIC_InitStructure
13、.NVIC_IRQChannelCmd = ENABLE; /使能外部中断通道 NVIC_Init(&NVIC_InitStructure); /根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 /Enable DMA Channel7 Interrupt / NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriori
14、ty = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*Enable DMA Channel6 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitSt
15、ructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); / USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);/开启中断 USART_ITConfig(USART2, USART_IT_IDLE , ENABLE); /开启空闲中断 USART_Cmd(USART2, ENABLE); /使能串口 /串口3初始化函数void uart3_init(u32 bound) /GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART
16、_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /使能GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); /使能USART3时钟 USART_DeInit(USART3); /复位串口3 /USART1_TX PB.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /PB.10 GP
17、IO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); /初始化PB.11 /USART1_RX PB.11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/浮空输入 GPIO_InitStructure.GPIO_Spee
18、d = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /初始化PB /USART 初始化设置 /#ifdef EN_USART3_RX /如果使能了接收 USART_InitStructure.USART_BaudRate = bound;/一般设置为9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;/字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;/一个停止位 USA
19、RT_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(USART3, &USART_InitStructure); /初始化串口 /Usart1 NVIC 配置 NVIC_InitStructure.N
20、VIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;/抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ通道使能 NVIC_Init(&NVIC_InitStructure); /根据指定的参数初始化VIC寄存器 / /*Enable DMA Channel2 Interrupt */ / NVI
21、C_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*Enable DMA Channel3 Interrupt */ NVIC_InitStructure.NVI
22、C_IRQChannel = DMA1_Channel3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); / USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);/开启中断 USART_ITConfig(USART3,
23、 USART_IT_IDLE , ENABLE); /开启空闲中断 USART_Cmd(USART3, ENABLE); /使能串口 /串口4初始化函数void uart4_init(u32 bound) GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure; /定义DMA初始化结构体DMA_InitStructure / NVIC_PriorityGrou
24、pConfig(NVIC_PriorityGroup_0); /选择NVIC优先级分组0 RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); / 打开串口外设的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); /串口4所使用管脚输出输入定义 /定义UART4 Tx (PC
25、.10)脚为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /IO口的第2脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /IO口速度 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /IO口复用推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); /初始化串口1输出IO口 /定义 UART4 Rx (PC.11)为悬空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11
26、; /IO口的第3脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/IO口悬空输入 GPIO_Init(GPIOC, &GPIO_InitStructure); /初始化串口1输入IO口 /串口4参数初始化定义部分,串口1参数为9600 , 8 ,1 ,N 接收中断方式 USART_InitStructure.USART_BaudRate = bound; /设定传输速率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; /设定传输数据位数 USART_InitS
27、tructure.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(UART4, &USART_
28、InitStructure); /初始化串口4 USART_ITConfig(UART4, USART_IT_IDLE,ENABLE); /使能串口4接收中断 USART_Cmd(UART4, ENABLE); /使能串口4 USART_ClearFlag(UART4, USART_FLAG_TC); / 清标志(后增加) DMA_DeInit(DMA2_Channel3); /重置DMA 2通道配置 DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004C04; /外设地址 DMA_InitStructure.DMA_MemoryBaseAddr
29、 = (u32)USART4_RECEIVE_DATA; /存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /外设作为数据目的地 DMA_InitStructure.DMA_BufferSize = 512; /DMA缓存大小:BufferSize DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /外设地址寄存器不递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /存地址寄存器递增 D
30、MA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /外设数据宽度为8位 DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; /存数据宽度为8位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /工作在正常缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; /设置DMA通道优先级为高 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /禁止DMA通道设置为存至存传输 DMA_Init(DMA2_Channel3, &DMA_InitStructure); /初始化
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1