zoukankan      html  css  js  c++  java
  • 电赛菜鸟营培训(三)——STM32F103CB之串口通信

    一、串口通信概念

    1、缩写

    USART:Universal Synchronous/Asynchronous Receiver/Transmitter

                     通用同步/异步接收和发送器

    2、用处

    image

    (1)同步通信

           双方必须先建立同步,即双方的时钟要调整到一个频率,收发双发不停地发送和接受连续的同步比特流。

    (2)异步通信

           接收端必须时刻做好接受准备,而发送端则可以选择何时进行发送,但是发送时需要加一个开始标志和一个结束标志,表示一个发送阶段。

           异步通信的优势在于简单。

    3、分类

    image

    4、STM32F103Cx:拥有3个USART

    image

         RX:表示是接受端

         TX:表示时发送端

    二、STM32的USART寄存器配置

    1、每个USART口:共有7个设置寄存器

    ①一个状态寄存器(USART_SR)

    ②一个数据寄存器(USART_DR):它是由两个寄存器组成的,一个给发送用(发送寄存器 TDR),一个给接收用(接收寄存器 RDR)

    ③一个波特率寄存器(USART_BRR)

    ④一个控制寄存器1(USART_CR1)

    ⑤一个控制寄存器2(USART_CR2)

    ⑥一个控制寄存器3(USART_CR3)

    ⑦一个保护时间和预分频寄存器(USART_GTPR)

    image

    2、在固件函数库的 “stm32f10x_map.h”文件中,对应的定义:

    /*---------------- Universal Synchronous Asynchronous Receiver Transmitter --*/
    typedef struct
    {
      vu16 SR;
      u16  RESERVED0;
      vu16 DR;
      u16  RESERVED1;
      vu16 BRR;
      u16  RESERVED2;
      vu16 CR1;
      u16  RESERVED3;
      vu16 CR2;
      u16  RESERVED4;
      vu16 CR3;
      u16  RESERVED5;
      vu16 GTPR;
      u16  RESERVED6;
    } USART_TypeDef; //用结构体USART_TypeDef定义USARTx串口,(即定义 USARTx串口的7个设置寄存器)

    3、寄存器详细功能表

    (1)状态寄存器(USART_SR)

    image

    image

    imageimage

    image

     

    (2)数据寄存器

    image

    image

    (3)比特率寄存器

    image

    (4)控制寄存器

    imageimage

    image

    image

    image

    image

    (5)控制寄存器2

    image

    image

    imageimage

    image

    (6)控制寄存器3

    image

    image

    image

    image

    (7)保护时间和预分频寄存器(USART_GTPR)image

    image

    三、STM32串口通信编程

    1、编程步骤

    (1)编程时,USARTx串口的具体配置是从USARTx寄存器组开始。首先,用结构体USART_TypeDef 定义 USARTx寄存器组。有代码,有封装好了的哈哈哈哈a

    #include "bsp_usart1.h"
    
    void USART1_Config(void)
    {
            GPIO_InitTypeDef GPIO_InitStructure;
            USART_InitTypeDef USART_InitStructure;
            
            /* config USART1 clock */
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
            
            /* USART1 GPIO config */
            /* Configure USART1 Tx (PA.09) as alternate function push-pull */
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_Init(GPIOA, &GPIO_InitStructure);
        
            /* Configure USART1 Rx (PA.10) as input floating */
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
            GPIO_Init(GPIOA, &GPIO_InitStructure);
                
            /* USART1 mode config */
            USART_InitStructure.USART_BaudRate = 115200;
            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_Cmd(USART1, ENABLE);
    }

    (2)初始化函数有了的话,我们可以直接进行下一步功能的编程

    //×Ö·û´®·¢ËÍ
    /*
        ÏÈÁ¬½Ó´®¿Ú£¬´ò¿ª´®¿Ú£¬Ñ¡Ôñ115200²¨ÌØÂÊ£¬
        Ñ¡¶Ô¶Ë¿Ú£¬ÏÂÔسÌÐò£¬µçÄÔ½ÓÊÕµ½×Ö·û´®£¬
        µçÄÔ·¢ËÍ×Ö·û´®£¬³¤¶ÈСÓÚ100£¬µ¥Æ¬»úÈ«²¿
        ½ÓÊպ󷵻ظøµçÄÔ¡£Ò²¿ÉÒÔÐ޸ijÌÐò£¬½ÓÊÕ
        Ò»¸ö·µ»ØÒ»¸ö£¬¿ÉÒÔ·¢ËÍÈÎÒⳤ¶ÈµÄ×Ö·û´®£¬
        ´úÂëÔÚ×¢ÊͲ¿·Ö£¬·¢ËÍÊý×Ö»òÕß×Öĸ£¬ÏÔʾ
        µÄÊÇÊý×Ö¼Ó1£¬»òÕß×Öĸ¼Ó1.
        ´®¿Ú·¢Ë͵ÄÊÇ×Ö·ûµÄASCIIÂ룬Êý×Ö0¡ª9ÊÇ
        0x30-0x39,a-zÊÇ0x61-0x7a,A-ZÊÇ0x41-0x5a
        ¿ÉÒÔÑ¡Ôñ´®¿ÚÏÔʾ·½Ê½ÎªHEXÏÔʾ£¨Ê®Áù½øÖÆÏÔʾ£©
        ²é¿´½á¹û¡£
    */
    #include "stm32f10x.h"
    #include "bsp_usart1.h"
    void USART1_Config(void);
    uint_least8_t ch[100],re[100],i,j;
    #define endchar '.'     //ÊäÈëµÄ×Ö·û´®½áÊø·û
    void delay(void)
    {
        uint16_t i=6000;
        while(i--);
    }
    unsigned char display[]="ÄÏÇ¿µç×ÓÉè¼ÆЭ»á401ʵÑéÊÒ¡£";//µ¥Æ¬»ú·¢Ë͸øPC»úµÄ×Ö·û´®
    /*
    int main(void)
    {
            USART1_Config();                   //´®¿Ú³õʼ»¯              
            for(j=0;display[j]!='';j++)      //·¢ËÍ×Ö·û´®
            {
                USART_SendData(USART1,display[j]);  //·¢ËÍÒ»¸öÊý¾Ý
                while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //µÈ´ý·¢ËͽáÊø
            }
            while(1)
            {    
                while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);  //µÈ´ýPC»úµÄÊý¾Ýµ½À´
                i = USART_ReceiveData(USART1);                              //½ÓÊÕÊý¾Ý
                if(i=='9')i='0'-1;
                if(i=='z')i='a'-1;
                if(i=='Z')i='A'-1;
                USART_SendData(USART1,i+1);    //·¢ËÍÒ»¸öÊý¾Ý
                while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//µÈ´ý·¢ËͽáÊø
            }
    }
    */
    /*
    */
    int main(void)
    {
            USART1_Config();                   //´®¿Ú³õʼ»¯              
            for(j=0;display[j]!='';j++)      //·¢ËÍ×Ö·û´®
            {
                USART_SendData(USART1,display[j]);  //·¢ËÍÒ»¸öÊý¾Ý
                while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //µÈ´ý·¢ËͽáÊø
            }
            while(1)
            {    
                while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);  //µÈ´ýPC»úµÄÊý¾Ýµ½À´
                re[0] = USART_ReceiveData(USART1);                              //½ÓÊÕÊý¾Ý
                i=0;
                while(re[i]!=endchar)   //Êý¾Ý»¹Ã»·¢ËͽáÊø
                {
                    i++;
                    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//µÈ´ýÊý¾Ýµ½À´
                    re[i] = USART_ReceiveData(USART1);                            //½ÓÊÕÊý¾Ý
                }
                for(j=0;j<i+1;j++)ch[j]=re[j];      //¸´ÖÆ×Ö·û´®
                delay();                            //´úÌæʵ¼ÊÓ¦ÓÃÖеĴ¦Àíº¯Êý
                for(j=0;j<i;j++)                   //·¢Ë͸øPC»ú
                {
                    USART_SendData(USART1,ch[j]);    //·¢ËÍÒ»¸öÊý¾Ý
                    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//µÈ´ý·¢ËͽáÊø
                }
            }
    }
    image
  • 相关阅读:
    Async和Await的用法
    Idea有关收藏的博客
    记录看到的写的好的、实用的JavaScript博客
    Linux实用指令一
    flex布局
    移动端开发常用的vue组件
    npm --save 的含义
    切换npm源为淘宝镜像
    java String Map List 转换
    mysql查看被锁住的表
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4419827.html
Copyright © 2011-2022 走看看