完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
STM32中串口通信的基本操作
USART_SR状态寄存器 比较常用的位 操纵该寄存器的函数 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); USART_DR数据寄存器 DR寄存器的操作流程 操作DR寄存器的函数 发送数据 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 接收数据 uint16_t USART_ReceiveData(USART_TypeDef* USARTx); USART_BRR波特率寄存器 操作BRR寄存器的函数 void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 注:除此之外,这个函数还用来配置串口通信的其他参数,具体参数如下: 波特率与USARTDIV只知其一如何求解另一个参数? 串口配置一般流程 具体配置步骤 综合代码 #include “stm32f10x.h” void My_USART1_Init(void) { // 定义变量要在最前面 GPIO_InitTypeDef GPIOA_InitStructure; USART_InitTypeDef USART1_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE); // 串口/GPIO时钟使能 USART_DeInit(USART1); // 将USARTx外围寄存器初始化为其默认重置值 GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIOA_InitStructure); // 使能GPIOA的PA9引脚 GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIOA_InitStructure); // 使能GPIOA的PA10引脚 USART1_InitStructure.USART_BaudRate = 115200; USART1_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART1_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; // 表示全双工,可以同时双向通信 USART1_InitStructure.USART_Parity = USART_Parity_No; USART1_InitStructure.USART_StopBits = USART_StopBits_1; USART1_InitStructure.USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &USART1_InitStructure); // 配置串口的属性 USART_Cmd(USART1, ENABLE); // 启用或禁用指定的USART外围设备 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断优先级分组 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_Init(&NVIC_InitStructure); // 使能串口通信的总中断位并且配置该中断的优先级 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能串口通信具体的中断 } void USART1_IRQHandler(void) { u8 ReceiveData; if(USART_GetITStatus(USART1, USART_IT_RXNE)) { ReceiveData = USART_ReceiveData(USART1); // 接收到从PC端发来的数据 USART_SendData(USART1, ReceiveData); // 将数据传输至PC端 } } int main(void) { My_USART1_Init(); USART1_IRQHandler(); while(1); } 第一步:使能GPIOx时钟 我们看“芯片资料-》STM32F103ZET6-》Pin Description”,即可得知:STM32除了VCC,GND这些特殊功能引脚,其他都是IO口,如果我们想将IO口用作其他功能引脚,我们必须进行端口的重用。 注:使能GPIO的时钟并不代表GPIO已经打开,我们需要先配置一下GPIO的属性,包括端口的输入输出模式,输出速度……等,再使能GPIO端口。 代码示例 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIO时钟使能 第二步:使能USART1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 串口时钟使能 第三步:重置USART1 USART_DeInit(USART1); // 将USARTx外围寄存器初始化为其默认重置值 第四步:配置GPIOA的PA9,PA10引脚的属性 GPIO_InitTypeDef GPIOA_InitStructure; GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIOA_InitStructure); // 使能GPIOA的PA9引脚 GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIOA_InitStructure); // 使能GPIOA的PA10引脚 第五步:配置串口1的属性 USART_InitTypeDef USART1_InitStructure; USART1_InitStructure.USART_BaudRate = 115200; USART1_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART1_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; // 表示全双工,可以同时双向通信 USART1_InitStructure.USART_Parity = USART_Parity_No; USART1_InitStructure.USART_StopBits = USART_StopBits_1; USART1_InitStructure.USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &USART1_InitStructure); // 配置串口的属性 第六步:使能USART1 USART_Cmd(USART1, ENABLE); // 启用或禁用指定的USART外围设备 第七步:配置USART1的中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断优先级分组 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_Init(&NVIC_InitStructure); // 使能串口通信的总中断位并且配置该中断的优先级 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能串口通信具体的中断 注:在哪里查找USART1的中断向量地址? 中断向量地址在“startup_stm32f10x_hd.s”启动文件中,全部中断向量地址如下: __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler ; External Interrupts DCD WWDG_IRQHandler ; Window Watchdog DCD PVD_IRQHandler ; PVD through EXTI Line detect DCD TAMPER_IRQHandler ; Tamper DCD RTC_IRQHandler ; RTC DCD FLASH_IRQHandler ; Flash DCD RCC_IRQHandler ; RCC DCD EXTI0_IRQHandler ; EXTI Line 0 DCD EXTI1_IRQHandler ; EXTI Line 1 DCD EXTI2_IRQHandler ; EXTI Line 2 DCD EXTI3_IRQHandler ; EXTI Line 3 DCD EXTI4_IRQHandler ; EXTI Line 4 DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 DCD ADC1_2_IRQHandler ; ADC1 & ADC2 DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 DCD CAN1_RX1_IRQHandler ; CAN1 RX1 DCD CAN1_SCE_IRQHandler ; CAN1 SCE DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 DCD TIM1_BRK_IRQHandler ; TIM1 Break DCD TIM1_UP_IRQHandler ; TIM1 Update DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare DCD TIM2_IRQHandler ; TIM2 DCD TIM3_IRQHandler ; TIM3 DCD TIM4_IRQHandler ; TIM4 DCD I2C1_EV_IRQHandler ; I2C1 Event DCD I2C1_ER_IRQHandler ; I2C1 Error DCD I2C2_EV_IRQHandler ; I2C2 Event DCD I2C2_ER_IRQHandler ; I2C2 Error DCD SPI1_IRQHandler ; SPI1 DCD SPI2_IRQHandler ; SPI2 DCD USART1_IRQHandler ; USART1 DCD USART2_IRQHandler ; USART2 DCD USART3_IRQHandler ; USART3 DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend DCD TIM8_BRK_IRQHandler ; TIM8 Break DCD TIM8_UP_IRQHandler ; TIM8 Update DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare DCD ADC3_IRQHandler ; ADC3 DCD FSMC_IRQHandler ; FSMC DCD SDIO_IRQHandler ; SDIO DCD TIM5_IRQHandler ; TIM5 DCD SPI3_IRQHandler ; SPI3 DCD UART4_IRQHandler ; UART4 DCD UART5_IRQHandler ; UART5 DCD TIM6_IRQHandler ; TIM6 DCD TIM7_IRQHandler ; TIM7 DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 __Vectors_End |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4145 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3230 浏览 1 评论
2756 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2185 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
14998 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3093浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1899浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2070浏览 3评论
1981浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2172浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 15:06 , Processed in 0.590625 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2041