0%

stm32_note_11day

=============================
2022-8-29
=============================

一.温故知新

    串口
    1.以串行的方式(数据按照顺序<高位先出|低位先出>一位一位的进行传输)
    传输数据
    2.串口的工作模式(单工模式 半双工模式 全双工模式 )
    3.不同电平标准的串口(TTL、RS232、RS485)
    4.在STM32F103RBT6芯片中,串口外设
    (IIC、SPI、USART/UART、USB、CAN)
    5.研究USART/UART
    USART:通用的同步异步收发器
    UART:通用的异步收发器
    在STM32F103RBT6芯片中有3个USART/UART
    在开发板上的位置
        USART1	纽扣电池的上面
        USART2	无线模块的接口
        USART3	扩展IO上
    6.驱动USART1
    void usart_1_init(void)
    {
        1)通过APB2总线使能GPIOA组和USART1的时钟
        2)初始化GPIOA组的管脚
            1>把PA9管脚配置为推挽的复用模式
            2>把PA10管脚配置为浮空的输入模式
        3)初始化USART1
            1>选择115200的波特率
            2>关闭硬件流控
            3>选择发送和接收模式
            4>选择没有奇偶校验
            5>选择8个数据位
            6>选择1个停止位
        4)初始化NVIC
            1>配置组优先级和子优先级的所占比例
            2>初始化NVIC
                选择USART1的中断号
                使能该中断
                选择组优先级的级别
                选择子优先级的级别
        5)选择由USART1的接收触发中断
        6)使能USART1的功能
    }
    void usart_1_send_byte(u8 data)
    {
        1)把形参数据通过官方固件进行发送
        2)以死等的方式等待USART1的数据发送成功
        3)清除USART1等待发送成功的标志状态
    }
    u8 usart_1_recv_byte(void)
    {
        1)判断USART1是否接收到了数据
        2)接收数据
        3)清除USART1接收到数据的标志状态
        4)把接收到的数据返回
    }

3.封装函数
    extern void usart_1_send_data(char *buf);//可以发送多个字节数据
4.通过USART1显示DHT11采集的数据(自己找张纸写一下itoa函数的实现)
    "HUM:XX TEMP:XX"
5.通过USART1把结构体类型的数据发送出去
    struct data
    {
        float Hum;//湿度
        float Temp;//温度
        int pm_value;//PM2.5
        char buf[16];//存储额外的数据
    };
    struct data d = {23.45, 34.56, 9527, "Hello World"};

二.串口附加的内容

    int a = 100;
    printf("a = %d\n", a);
    printf("%d-%c-%s-%f\n", 9527, 'A', "Hello", 3.14);
    int printf(const void *format, ...)//不定参的函数
    {
        int i = 0;

        for(i = 0; format[i] != '\0'; i++)
        {
            if(format[i] == '%')
            {
                i++;
                switch(format[i])
                {
                    case 'd' : 
                    case 'c' :
                    case 's' :
                    case 'f' :
                }
            }
            else
            {
                fgetc();
            }
        }
    }


    1.标准库中没有实现itoa函数,但是有sprintf函数
    printf一族的函数
    printf->把双引号的内容打印输出到标准输出中
    sprintf->把双引号的内容打印输出到字符数组中
    fprintf->把双引号的内容打印输出到文件中
    如果在默认环境中直接使用printf或者scanf函数,单片机的程序会直接跑飞
    因为printf和scanf函数它的操作对象是标准输入和标准输出,
    是有操作系统的环境下,但是单片机是裸板,没有操作系统
    2.如果想要在STM32环境中使用printf和scanf函数,需要做一些特殊处理
    需要把printf函数和scanf函数重定向到串口的发送和串口的接收
    推荐两种方法
        1)使用微库(Micro Lib)
        可以使用微库来替代C语言的标准库,
        微库主要是给容量比较小的芯片进行使用的,
        但是如果芯片本身容量够用不建议使用微库,
        因为微库实现的函数相较于C语言标准库来说不完整,
        而且在使用一些大型功能的函数的时候,
        微库的效率要比C语言标准库低
            1>开启微库
            第三行菜单栏->Options for target->target菜单中->
            在右边栏中->选中USE Micro LIB
            2>把printf和scanf函数的实现重定向到
            USART1的发送和接收,
            把fgetc和fputc函数的功能重定向到
            USART1的发送和接收
            int fgetc(FILE *f);
            int fputc(int c, FILE *f);
        2)禁用半主机模式
        半主机模式是由ARM核心提供的一种机制
        主要是因为ARM核心在研发的时候,ARM公司并不确定将来会和
        哪家半导体厂商合作,也不确定将来半导体厂商会在芯片上连接
        什么样的输入设备和输出设备
        所以,ARM公司在研发核心的时候会启用一种半主机模式
        ARM平台会通过仿真器/调制器可以把ARM核心中的输入输出
        重定向到X86平台
        现在我们需要把输入输出重定向到USART1的发送和接收上
        所以需要禁用半主机模式
    

三.引出后续内容

    1.完成了发送字符和发送字符串的函数
        将来操作无线模块可以发送AT指令
        AT指令是由'A'和'T'组成的字符串
        SSID是路由器的名称,password是路由器的密码
        AT+CWJAP="SSID","password"
        "AT+CWJAP="Easthome","123456"\r\n"
    usart_2_send_data("AT+CWJAP="Easthome","123456"\r\n");

    usart_2_send_data("AT+CWJAP=");
    usart_2_send_byte('"');
    usart_2_send_data("Easthome");
    usart_2_send_byte('"');
    usart_2_send_byte(',');
    usart_2_send_byte('"');
    usart_2_send_data("123456");
    usart_2_send_byte('"');
    usart_2_send_data("\r\n");
===========================================
作业
    1.复习
    2.模拟工业物联网控制台指令收发器
    在串口调试助手中发送"L0_ON",开发板接收到之后点亮LED0
    在串口调试助手中发送"L1_ON",开发板接收到之后点亮LED1
    在串口调试助手中发送"L2_ON",开发板接收到之后点亮LED2
    在串口调试助手中发送"BE_ON",开发板接收到之后打开蜂鸣器
    在串口调试助手中发送"L0_OFF",开发板接收到之后关闭LED0
    在串口调试助手中发送"L1_OFF",开发板接收到之后关闭LED1
    在串口调试助手中发送"L2_OFF",开发板接收到之后关闭LED2
    在串口调试助手中发送"BE_OFF",开发板接收到之后关闭蜂鸣器
    3.模拟ESP8266内部的AT指令操作
    接收一个字符串->驱动WiFi(内部支持AT指令)
        在串口调试助手中发送"+IPD,10:0123456789"
    +IPD,XX:YYYYYYYYYY
    X部分是接收到的数据的字节数
    Y部分是真正的数据
    4.根据开发板原理图找到USART3的管脚,和组内成员测试
===========================================