STM32单片机串口功能实现

2019-04-15 19:20发布

  STM32学习笔记心得四: =============串口通信================
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); }  总结:STM32串口功能实现需要根据需要配置所用串口,其中涉及到多出组的初始化以及gpio引脚的配置,各位码友有什么需要可以随之联系,希望大家多多关注互相交流学习。