历史上的今天
返回首页

历史上的今天

今天是:2024年10月11日(星期五)

正在发生

2019年10月11日 | STM32F103 UART通信讲解

2019-10-11 来源:eefocus

一、串行通信的通信方式


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);                    //使能串口


}

推荐阅读

史海拾趣

ETRI公司的发展小趣事

在5G技术的推动下,ETRI又取得了另一项重大突破。他们成功开发了世界上首个5G室内分布式天线系统,该系统将5G服务无缝扩展至室内,为用户提供了前所未有的高速体验。这一技术的出现,不仅提高了传输容量,缩小了设备尺寸,还降低了部署成本。

ELMOS公司的发展小趣事

ELMOS公司自创立以来,就专注于汽车电子领域的发展。多年来,公司不断积累在模拟混合信号集成电路设计方面的专业知识,形成了深厚的技术底蕴。这种长期的技术积累使得ELMOS在汽车和工业物理接口领域拥有广泛的产品线,特别是在供电和DC/DC方面积累了丰富的经验。这种技术积累不仅为ELMOS赢得了市场的认可,也为公司的持续发展奠定了坚实的基础。

Analog Microwave Design公司的发展小趣事

Analog Microwave Design公司一直注重企业文化的建设和传承。公司倡导创新、务实、合作的企业精神,鼓励员工敢于挑战、勇于创新。同时,公司还注重员工的培训和发展,为员工提供了良好的职业晋升通道和学习机会。这种积极向上的企业文化不仅激发了员工的工作热情和创新精神,还为公司的长期发展提供了有力保障。

以上五个故事分别从初创时期的挑战与机遇、技术创新的突破、国际化战略的实施、产品线的丰富与完善以及企业文化的建设与传承等方面,展现了Analog Microwave Design公司在电子行业发展的历程和成就。这些故事不仅反映了公司的成长轨迹,也体现了公司在面对市场变化和技术挑战时所采取的积极态度和应对策略。

3L Electronic Corporation公司的发展小趣事

3L Electronic Corporation深知人才是企业发展的根本。因此,公司注重人才培养和团队建设,为员工提供丰富的培训和发展机会。通过引进优秀人才和建立激励机制,公司形成了一支高效、专业的团队,为公司的持续创新和发展提供了有力保障。

国芯佳品公司的发展小趣事

作为一家有社会责任感的企业,3L Electronic Corporation始终关注环境保护和可持续发展。公司积极采用环保材料和生产工艺,减少对环境的影响。同时,公司还参与社会公益事业,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展创造了良好的社会环境。

请注意,上述故事是基于公开信息和行业常识的概括描述,并不代表3L Electronic Corporation公司的真实发展历程。如需了解更多关于该公司的详细信息,建议查阅其官方网站或相关新闻报道。

康奈特(CNNT)公司的发展小趣事

在光学镜片领域,产品质量是企业的生命线。康奈特深知这一点,因此从原材料采购到生产制造的每一个环节都建立了严格的品控体系。公司引进了先进的检测设备和技术手段,对每一片镜片都进行严格的检测和筛选。这种对质量的执着追求不仅赢得了消费者的信赖和认可,也为公司赢得了良好的口碑和市场份额。

问答坊 | AI 解惑

嵌入式电阻与电容

微过孔的出现被称为印制电路板的第三次革命。无源器件的内置——电阻和电容被置入电路板内部——是否会被称为第四次革命呢?该技术更有可能改变电路设计的面貌。微过孔电路实现了更高的密度、更轻的重量和更好的性能,但电路板本身仍是许多导线的连 ...…

查看全部问答>

应用程序如何查询中断

驱动使用DDK写的,不是DS+DDK,以前用DS+DDK的时候是应用把一个Event的HANDLE传进去,然后驱动里面用传进来的HANDLE生成一个KEVENT,应用那里启动一个线程,线程里面等待那个Event就行了,这样当发生中断时驱动的DPC就把KEVENT设置,应用的那个线程就 ...…

查看全部问答>

STM32处理器如何实现关所有中断功能

                                 我一直没发现STM32有关所有中断的功能,想问一下大家是不是它不能实现。或者有什么办法来实现这个功能。一个个的关 ...…

查看全部问答>

麻烦高手帮我分析一下晶振的问题

初学DSP,用了一片TMS320VC5409和10M无源晶振,板子做起来以后不能用,测量时钟信号发现X1管脚的信号是一个比较畸形的正弦波,X2管脚的波形是一个规则的正弦波;但是时钟输出CLKOUT的波形则是在高低电平两个位置剧烈震荡。由于对晶振和时钟信号不熟 ...…

查看全部问答>

连续小线段前瞻插补算法

小弟在做连续小线段前瞻插补算法 想请问下 在测试前瞻性算法的时候有什么好的仿真方法呢? 用什么软件仿真?…

查看全部问答>

430单片机12位AD一路采集温度一路采集电压程序该如何配置和处理

我用的是MSP430F149单片机想用12位的AD来采两个外部传感器的电压但是。其中用到P6.0和P6.1,我还未链接外部传感器P6.0和P6.1就已经有电压;而且两个显示的都不一样分别为1.86     1.97,用万用表去测量时P6.0和P6.1分别是3.35& ...…

查看全部问答>

山东省电子设计大赛来了

2012TI杯山东省大学生电子设计竞赛                基本仪器和主要元器件清单 1、基本仪器清单 数字电桥 直流稳压电源 量角器 米尺  四位半数字万用表  0~200℃温度 ...…

查看全部问答>

元芳,你对此电路有何看法?(7-终结)

元芳:大人,听说玉渊潭的樱花开的正好,不知大人要不要带我等同去观玩一番?狄:元芳,还是先把前日问题说完。樱花明年还会带开,先练就一身本领,明年樱花更艳……元芳:大人……狄:照数据手册推荐,高于500Hz使用III型反馈网络,即反馈电阻高端 ...…

查看全部问答>

51单片机1602液晶红外解码+波形

51单片机1602液晶红外解码+波形显示…

查看全部问答>

dsp的PWM波的基础知识

本人刚接触DSP,想问一下ACTRA设置的问题。 比如cmp6的输出方式设置为11(强制高),为什么用示波器测不出来高电平信号…

查看全部问答>