STM32F103 UART通信讲解

2019-10-11来源: eefocus关键字:STM32F103  UART  通信讲解

一、串行通信的通信方式


1.同步通信:带时钟同步信号传输,有一根线是同步时钟。例如SPI(全双功)、IIC(半双工)通信接口


2.异步通信:不带时钟同步信号,必须约定好波特率。例如UART(全双功)


二、STM32的串口通信接口


UART:通用异步收发器。


USART:通用同步异步收发器。


STM32F10x系列包含3个USART和2个UART。

都是TTL电平交叉相连即可

与PC机可以使用USB-TTL进行通信。


三、通信引脚

四、常用串口相关寄存器


1.USART_SR状态寄存器:里面一些相关位可以用来判断是否发送接收完成等。


2.USART_DR数据寄存器:通过读写这个寄存器来发送接收数据


3.USART_BRR波特率寄存器:


波特率计算方法:波特率=fPLCLKX /(16*USARTDIV);USARTDIV=72000000/(115200*16)=39.0625


DIV_Fraction=16*0.0625=1=0X01;(小数部分)


DIV_Mantissa=39=0X27;(整数部分)


从而得到USART_BRR波特率寄存器的值为0X0271,这就是115200的波特率对应的寄存器值。


五、串口操作相关库函数


void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);


串口初始化:波特率,数据字长,奇偶校验,硬件控制流以及收发使能。


第一个成员变量是串口标号,第二个成员变量是结构体


typedef struct


{


  uint32_t USART_BaudRate;  //波特率          


  uint16_t USART_WordLength;       //位长,8位或9位  


  uint16_t USART_StopBits;          //停止位


  uint16_t USART_Parity;             //奇偶校验位


  uint16_t USART_Mode;              //使能输入输出


  uint16_t USART_HardwareFlowControl; //硬件流控制


} USART_InitTypeDef;


 


void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);


使能串口


 


void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);


使能相关中断


 


void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);


发送数据到串口


 


uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


从串口接收数据


 


FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);


获取状态标志位


 


void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);


清除状态标志位


 


ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);


获取中断状态标志位


 


void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);


清除中断状态标志位


 


六、串口配置一般步骤


1.串口时钟使能


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    


2.串口复位(不是必须的)


USART_DeInit();


3.GPIO模式设置


对GPIO口输入输出的设置


4.串口初始化设置


USART_Init(USART1, &USART_InitStructure); 


5.开启中断并且初始化NVIC


NVIC_Init();


USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


6.使能串口


USART_Cmd(USART1, ENABLE);  


7.编写中断处理函数


void USART1_IRQHandler(void)   


8.串口数据收发


void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);


uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


9.串口传输状态获取


ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);


void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);


七、串口初始化程序编写


void uart_init(u32 bound){


    GPIO_InitTypeDef GPIO_InitStructure;


    USART_InitTypeDef USART_InitStructure;


    NVIC_InitTypeDef NVIC_InitStructure;


     


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);   


  


    //GPIOA.9发送GPIO配置


  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);


   


  //GPIOA.10接收GPIO配置


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


  GPIO_Init(GPIOA, &GPIO_InitStructure);


 


  // NVIC 配置(在主函数中需要对NVIC设置分组)


    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;


    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;


    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        


    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           


    NVIC_Init(&NVIC_InitStructure);    


  


   //对USART配置波特率、停止位、校验位等配置


    USART_InitStructure.USART_BaudRate = bound;


    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); 


 


    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能接收中断


    USART_Cmd(USART1, ENABLE);                    //使能串口


}

关键字:STM32F103  UART  通信讲解 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476832.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:为物联网应用开发提速 STM32MP1 MPU贸泽开售
下一篇:STM32F103 时钟配置

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F0 ADC学习
开始时候使用的是stdlib的库,最近发现cube库用的越来越广泛了,遂开始使用cube库来完成ADC的多通道采集实验。ADC 的driver 在STM32F0XX_HAL_DRIVER当中,有stm32f0xx_hal_adc.c文件中,我们可以在stm32f0xx_hal_conf.h中开启 宏定义 ADC 模块。ADC有三种工作模式,polling interruptDMA我这里使用了polling的方式来获取多通道的数据。首先是要声明两个参数设置的结构体ADC_HandleTypeDef             AdcHandle
发表于 2019-10-09
STM32F030 使用内部时钟和外部时钟
p;  /* Wait till PLL is ready */  while((RCC->CR & RCC_CR_PLLRDY) == 0)  {  }   /* Select PLL as system clock source */  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));  RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;       /* Wait till PLL is
发表于 2019-10-09
STM32F030F4P6单片机由外部时钟改为内部时钟的步骤
一.看程序运行的时候初始化时钟部分: 二.查看systeminit定义如下: 这就是打开的函数内容这就是使用外部时钟的配置,也就是库函数的默认配置):static void SetSysClock(void){  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;    /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*//* Enable HSE */ //打开外部时钟开关&nbs
发表于 2019-10-09
STM32F030F4P6单片机由外部时钟改为内部时钟的步骤
STM32F4(Flash读保护)
1,目的在实际的产品发布中,如果不对储存在单片机Flash中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link等)把Flash中的程序读取回来,得到bin文件或hex文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把Flash设置成读保护。2,开发环境1,适用芯片:STM32F4全部芯片2,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.03,IDE:MDK5173,程序源码/**************************************************************** * Function
发表于 2019-10-09
stm32F103 DMA通道
发表于 2019-10-09
stm32F103 DMA通道
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved