STM32单片机实现串口通信

本文详细介绍了串口通信的原理、并行与串行的区别,以及如何在STM32中使用USART进行通信,包括时钟配置、GPIO设置、参数初始化、中断管理等步骤。
摘要由CSDN通过智能技术生成

=============串口通信================
1.通信方式
  处理器和外围设备进行通信的方式:并行通信和串行通信
  
  并行通信:
  传输原理:数据的每一个位都在同时传输
  优点:    速度快
  缺点:    占用很多引脚资源


  
  串行通信:
  传输原理:数据按位的顺序传输
  优点:    占用引脚少
  缺点:    传输速度慢
  
--------------------------------------------------
 对于大部分的设备来讲,引脚资源是有限的,所以在通信方面要节约IO口
 串口作为MCU的重要外接设备,同时也作为软件调试手段
 
串行通信按照传送的方向分几种:
单工  :数据在传输的时候只支持一个方向的传输
半双工:允许数据在两个方向传输,但是在同一时刻只允许数据一个方向传输
全双工:允许数据在两个方向传输,但是设备要具有收发功能

----------------------------------------------------
串行通信又分为同步通信和异步通信

同步通信:带时钟的同步信号去传输,比如IIC和SPI

异步通信:不带时钟的同步信号,如UART(通用的异步收发设备)

   通信标准     引脚        通信方式    通信方向
    UART      TXD:发送端     异步通信    全双工
              RXD:接收端
    IIC       SCL:同步时钟   同步通信    半双工
              SDA:数据IO口

===================================================
串口应该怎么使用(七步曲)
1.使能串口时钟+使能GPIO时钟
2.设置引脚的复位映射
3.配置GPIO引脚初始化,GPIO引脚的模式改为复用模式
4.配置串口的参数
5.中断优先级+配置NVIC初始化
6.使能串口
7.编写中断服务函数

---------------------------------
1.硬件图   (day04/串口.png)

2.
  a.使能串口时钟 RCC_APB2PeriphClockCmd
   void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
   参数1:uint32_t RCC_APB2Periph   串口号
          RCC_APB2Periph_USART1
   参数2:FunctionalState NewState
          ENABLE 开启使能  DISABLE 关闭使能
          
  b.设置引脚的复位映射 GPIO_PinAFConfig()
   void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
   参数1:GPIO_TypeDef* GPIOx     组别
          GPIOA  ---GPIOG
   参数2:uint16_t GPIO_PinSource  引脚号
          GPIO_PinSourcex where x can be (0..15).
   参数3:uint8_t GPIO_AF
          @arg GPIO_AF_USART1: Connect USART1 pins to AF7
          @arg GPIO_AF_USART2: Connect USART2 pins to AF7
          @arg GPIO_AF_USART3: Connect USART3 pins to AF7
          @arg GPIO_AF_UART4: Connect UART4 pins to AF8
          @arg GPIO_AF_UART5: Connect UART5 pins to AF8
          @arg GPIO_AF_USART6: Connect USART6 pins to AF8
          @arg GPIO_AF_UART7: Connect UART7 pins to AF8
          @arg GPIO_AF_UART8: Connect UART8 pins to AF8
        等下配置复用功能 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;//复用模式
    
  c.配置串口的参数  USART_Init
    void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
    参数1:USART_TypeDef* USARTx    串口号
           USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8
    参数2:USART_InitTypeDef* USART_InitStruct
        typedef struct
        {
          uint32_t USART_BaudRate;            /*!< 波特率 */

          uint16_t USART_WordLength;          /*!< 字节长度 */

          uint16_t USART_StopBits;            /*!< 停止位 */

          uint16_t USART_Parity;              /*!< 奇偶校验位 */
         
          uint16_t USART_Mode;                /*!< 模式配置*/

          uint16_t USART_HardwareFlowControl; /*!< 硬件控制流 */
        } USART_InitTypeDef; 
        
        1.常用的波特率 是9600 115200
        
        2.
        /** @defgroup USART_Word_Length 
          * @{
          */       
          #define USART_WordLength_8b  ((uint16_t)0x0000)//8位
          #define USART_WordLength_9b  ((uint16_t)0x1000)//9位

        3.
        /** @defgroup USART_Stop_Bits 
          * @{
          */ 
        #define USART_StopBits_1   ((uint16_t)0x0000)
        #define USART_StopBits_0_5 ((uint16_t)0x1000)
        #define USART_StopBits_2   ((uint16_t)0x2000)
        #define USART_StopBits_1_5 ((uint16_t)0x3000)

        4./** @defgroup USART_Parity 
          * @{
          */ 
          
        #define USART_Parity_No  ((uint16_t)0x0000)//常用
        #define USART_Parity_Even((uint16_t)0x0400)//奇校验
        #define USART_Parity_Odd ((uint16_t)0x0600)//偶校验
        
        5.
        /** @defgroup USART_Mode 
          * @{
          */ 
          
        #define USART_Mode_Rx ((uint16_t)0x0004)//接收
        #define USART_Mode_Tx ((uint16_t)0x0008)//发送
 
        6.
        /** @defgroup USART_Hardware_Flow_Control 
          * @{
          */ 
        #define USART_HardwareFlowControl_None       ((uint16_t)0x0000)//无流控
        #define USART_HardwareFlowControl_RTS        ((uint16_t)0x0100)
        #define USART_HardwareFlowControl_CTS        ((uint16_t)0x0200)
        #define USART_HardwareFlowControl_RTS_CTS    ((uint16_t)0x0300)

   d.中断优先级+配置NVIC初始化
     void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
     参数:uint32_t NVIC_PriorityGroup
     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
                                4 bits for subpriority
     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
                                3 bits for subpriority
     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
                                2 bits for subpriority
     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
                                1 bits for subpriority
     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
                               0 bits for subpriority

    配置中断分组  NVIC_Init()
   void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
    typedef struct
    {
      uint8_t NVIC_IRQChannel;                    /*!<中断线 */

      uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< 抢占优先级 */

      uint8_t NVIC_IRQChannelSubPriority;         /*!< 响应优先级*/

      FunctionalState NVIC_IRQChannelCmd;         /*!<权限*/   
    } NVIC_InitTypeDef;
 
    1.
      USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                                           */
      USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                                           */
      USART3_IRQn                 = 39,     /*!< USART3 global Interrupt  
 
    2、3.
     /** @defgroup MISC_System_Low_Power 
          * @{
          */

        #define NVIC_LP_SEVONPEND            ((uint8_t)0x10)
        #define NVIC_LP_SLEEPDEEP            ((uint8_t)0x04)
        #define NVIC_LP_SLEEPONEXIT          ((uint8_t)0x02)
    
    4.
    ENABLE or DISABLE 
    
   e.串口的中断 USART_ITConfig    
     void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
     参数1:USART_TypeDef* USARTx     串口号 
            USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8
     参数2:uint16_t USART_IT         属性
             USART_IT_RXNE     
     参数3:FunctionalState NewState   权限
            ENABLE  DISABLE
    
   f.串口使能 USART_Cmd
    void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
     参数1:USART_TypeDef* USARTx     串口号
           USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8     
     参数2:FunctionalState NewState  权限
           ENABLE or DISABLE
           
   g.编写中断服务函数
     USART1_IRQHandler                 ; USART1                                          
     USART2_IRQHandler                 ; USART2                                          
     USART3_IRQHandler                 ; USART3    
        1.保存接收的数据   USART_ReceiveData
           uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
           参数1:USART_TypeDef* USARTx     串口号
              USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8
              
        2.发送数据   USART_SendData
           void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
           参数1:USART_TypeDef* USARTx     串口号
              USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8
           参数2:uint16_t Data      数据       

        3.清楚中断标志位 USART_ClearITPendingBit
           void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)
           参数1:USART_TypeDef* USARTx     串口号
              USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8
           参数2:uint16_t USART_IT         属性
              USART_IT_RXNE    

#include "usart.h"
 
char Data;
 
/*******串口中断服务函数*****/
void USART1_IRQHandler(void)
{
	//1.保存接收的数据   USART_ReceiveData
   USART_ReceiveData(USART1);
			  
  //2.发送数据   USART_SendData
   USART_SendData(USART1,Data);
 
  //3.清楚中断标志位 USART_ClearITPendingBit
    USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
 
 
/********串口1初始化********/
void USART1_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	//1.开启USART时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//2.开启GPIO时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	
	//复用功能
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	//配置GPIO
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9 | GPIO_Pin_10;//9,10号引脚
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;//复用模式
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;//输出速度
	GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;//开漏保护
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;//上拉电阻
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//配置串口
	USART_InitStruct.USART_BaudRate  					=115200;//波特率
	USART_InitStruct.USART_WordLength 				=USART_WordLength_8b;//8位
	USART_InitStruct.USART_StopBits   				=USART_StopBits_1;//最后一位
	USART_InitStruct.USART_Parity     				=USART_Parity_No;//无校验
	USART_InitStruct.USART_Mode               =USART_Mode_Rx | USART_Mode_Tx;//收发功能
	USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无流控
	USART_Init(USART1,&USART_InitStruct);
	
	//中断优先级选择
	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;//中断事件,在stm32f4xx.h查找
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 0x02;//抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x02;//响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能
	NVIC_Init(&NVIC_InitStruct);
	
	//串口使能
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
}
 
  

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 单片机之间可以使用串口通信进行数据的传输和通信。对于stm32开发板中的两个单片机,一般可以通过它们上面的串口引脚来建立串口通信。首先,需要在代码中配置每个单片机的串口参数,例如波特率、数据位、停止位等。然后,一个单片机作为发送方,通过串口将数据发送给另一个单片机作为接收方。 在发送方的代码中,使用串口发送函数将要发送的数据写入发送缓冲区,然后等待发送完成。而接收方的代码中,需要使用串口接收函数来获取接收缓冲区中的数据,并进行处理。另外,为了保证通信的可靠性,可以在发送方和接收方之间添加一定的数据帧格式,例如起始字节和结束字节,以便接收方能够正确地识别并解析接收到的数据。 此外,在实际的单片机串口通信中,还需要考虑通信的帧同步、数据校验、数据流控制等问题。为了实现高效的通信,可以选择合适的通信协议,如使用帧中止字符或使用硬件流控制功能。 总之,通过配置正确的串口参数和使用相应的发送和接收函数,可以实现stm32两个单片机之间串口通信,从而实现数据的传输和通信。在实际应用中,需要根据具体的需求和系统设计来选择合适的通信方式和协议,以确保通信的可靠性和稳定性。 ### 回答2: 要实现两个STM32单片机之间串口通信,可以按照以下步骤进行操作: 1. 首先,确定通信参数。包括串口波特率、数据位、停止位和校验位等。确保两个单片机的通信参数一致。 2. 在发送方单片机上,配置串口。使用STM32提供的库函数,初始化串口的相关寄存器和中断。设置好发送缓冲区和接收缓冲区。 3. 在接收方单片机上,同样配置串口。同样使用STM32提供的库函数,初始化串口的相关寄存器和中断。设置好发送缓冲区和接收缓冲区。 4. 在发送方单片机上,将要发送的数据写入发送缓冲区,并启动发送操作。此时,串口将自动将缓冲区中的数据发送出去。 5. 在接收方单片机上,通过中断来接收数据。当接收到数据时,中断将被触发,可以在中断服务函数中处理接收到的数据。 6. 在接收方单片机上,将接收到的数据读取出来,并进行相关操作。可以存储、显示或者进行其他处理。 7. 如果需要发送方和接收方之间进行双向通信,可以在发送方单片机和接收方单片机上重复上述步骤。 需要注意的是,串口通信需要保证发送方和接收方的数据格式一致,以及正确处理数据帧的起始、结束和校验。在项目中,可以使用协议来约定数据的格式和处理方式,以保证通信的可靠性和正确性。 总结:通过配置串口参数、初始化缓冲区、中断处理函数等步骤,可以在STM32单片机之间实现串口通信。这种通信方式可以用于数据的传输、控制信号的发送等应用场景。 ### 回答3: STM32是一种常见的单片机系列,经常用于嵌入式系统开发。串口通信是一种常用的通信方式,可以实现单片机与其他外部设备的数据交互。 在STM32中,可以通过配置两个UART(通用异步收发传输器)来实现两个单片机之间串口通信。首先,需要在单片机的引脚配置中,将两个UART的引脚连接到对应的串口通信线路上。 接下来,在STM32的代码中,需要使用相应的库函数来配置和控制UART模块。首先,需要初始化两个UART通信模块,分别设置波特率、数据位、停止位和校验位等参数。然后,可以使用相应的发送和接收函数来实现数据的发送和接收操作。 在发送方单片机中,可以使用发送函数将数据发送到接收方单片机。接收方单片机则可以通过接收函数来接收到来自发送方的数据。通过在代码中指定不同的UART通信模块和引脚配置,可以同时实现多个串口通信通道。 需要注意的是,在进行串口通信时,要确保两个单片机的串口配置是一致的,包括波特率、数据位、停止位和校验位等参数。同时,在数据传输过程中,还需要进行数据的解析和处理,以确保数据的正确性和可靠性。 总之,通过配置和控制两个UART通信模块,可以在STM32实现两个单片机之间串口通信。通过合理地配置参数和使用相应的库函数,可以实现数据的可靠传输和快速交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电子小芯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值