=============================
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的管脚,和组内成员测试
===========================================