============================
2022-8-23
============================
一.温故知新
1.目的
之前写过检测按键是否被按下的程序->使用的是轮询的方式检测->CPU很忙
是把轮询检测的程序修改成了中断的方式->需要使用中断控制器
2.介绍芯片中常见的中断控制器
VIC 向量中断控制器 单片机芯片中常用
NVIC 可嵌套的向量中断控制器 单片机芯片中常用
GIC 通用的中断控制器 高端芯片中常用
3.在STM32F103RBT6芯片中使用的是NVIC中断控制器
NVIC中断控制器会处理两个事情
1)为每一个连接到NVIC上的中断源分配一个中断号
2)处理优先级(组优先级 和 子优先级)
异常向量表中存储的是异常处理函数的函数名(异常处理函数的入口地址)
异常向量表中异常处理函数的顺序和中断号是一一对应
4.GPIO需要借助EXTI来触发中断
EXTI叫做外部中断
每一组GPIO的0号管脚都可以触发EXTI0
每一组GPIO的1号管脚都可以触发EXTI1
...
每一组GPIO的15号管脚都可以触发EXTI15
需要通过AFIO外设为外部中断选择触发的GPIO管脚
二.看门狗
STM32F103RBT6芯片使用的核心是ARM-CORTEX-M3的核心
在工控领域中经常会使用到看门狗外设,所以今天主要讲看门狗外设
1.从最新选型手册中了解看门狗信息
打开<STM32RBT6\DataSheet\STM32>目录下<ST_MCU最新选型手册.pdf>
P21
看门狗属于定时器的资源,在STM32芯片中属于其他定时器资源
在STM32芯片中有两个看门狗,分别是独立看门狗 和 窗口看门狗
2.产生的问题
1)查找看门狗的时钟频率? 40KHz
2)查找看门狗的计数值范围? [0 - 4095]
3)看门狗提供的其他功能是什么? 重启系统
3.看门狗的使用环境
在工业的工作环境中,嵌入式设备经常会面临一些恶劣的工作环境:超高温、
超低温、非常湿润、非常干燥、强烈的电磁干扰,这些环境都会影响嵌入式设备
的正常工作,有可能会造成设备死机 或者 设备中运行的程序直接跑飞
所以可以使用看门狗帮助程序员监测嵌入式设备是否死机或者程序跑飞
一旦设备死机了或者程序跑飞了,看门狗可以帮助程序员重启系统
4.看门狗的简介
既然看门狗属于定时器的资源,那么决定定时长短是由时钟频率和计数值范围
来决定的,
和普通定时器不同,普通定时器定时到了之后,去处理程序员指定要做的事情
看门狗定时到了之后,直接重启系统(效果和按下reset按键一样)
如果设备死机了,看门狗可以帮助程序员重启系统
如果设备没有死机,看门狗不需要重启系统
(只要让看门狗的计数器永远计不到0,看门狗就不会重启系统了)
5.喂狗(feed dog)
需要每隔一段时间,往看门狗的计数器中重新写入计数值,让看门狗永远计不到0
6.介绍STM32芯片内部的看门狗
在STM32芯片中有两种看门狗
独立看门狗 : (IWDG)
窗口看门狗 : (WWDG)
注意 : 一般来说高端的芯片中只有一个看门狗,更像是独立看门狗
7.独立看门狗和窗口看门狗的区别
相同点
1)IWDG和WWDG都是由STM32芯片提供的外设资源
2)IWDG和WWDG功能一样,都会因为设备死机或者程序跑飞,
重启系统
3)IWDG和WWDG都可以自行调节喂狗时间
不同点
1)时钟源不同
IWDG使用的是独立RC(LSI<40KHz>)提供的时钟
不需要使用总线使能时钟
WWDG使用是APB1总线提供的时钟
需要通过APB1总线使能WWDG的时钟
2)产生中断不同
IWDG是没有中断的,只要IWDG计到0,直接重启系统
WWDG是有中断,只要计数器超时,可以触发中断
3)计数的方式不同
IWDG使用的是12bit的计数器
WWDG使用的是7bit的计数器
4)喂狗的时间范围不同
IWDG只要计数器计到0之前,任意时间喂狗都可以
WWDG会有一个上阙值和下阙值
三.独立看门狗
打开<STM32RBT6\DataSheet\STM32>目录下
<STM32F10x中文参考手册.pdf>
P276
IWDG使用的是LSI(40KHz)的时钟源
IWDG是一个递减的计数器(向下计数)
IWDG的计数器计数到0时会产生系统复位
IWDG_KR(键寄存器)<写入特定的值会有特定的操作>
0xAAAA 喂狗的操作
0x5555 开启IWDG_PR和OWDG_RLR寄存器的写访问
0xCCCC 开启看门狗
IWDG_PR(预分频寄存器)<给IWDG的时钟频率进行分频的>
注意 : 在操作IWDG_PR寄存器之前需要先给IWDG_KR寄存器写入0x5555
开启IWDG_PR寄存器的写访问(关闭写保护)
000 4分频 100 64分频
001 8分频 101 128分频
010 16分频 110 256分频
011 32分频 111 256分频
IWDG_RLR(重装载值寄存器)<是用来存储计数值的>
注意 : 在操作IWDG_RLR寄存器之前需要先给IWDG_KR寄存器写入0x5555
开启IWDG_RLR寄存器的写访问(关闭写保护)
该寄存器只有低12bit有效
可以存储的计数值是[12个0 - 12个1]<0 - 4095>
四.传感器
1.传感器的简介
在物联网嵌入式的项目框架中,需要使用嵌入式设备采集感知周围的数据
那么需要使用传感器进行采集和感知,在市面上的传感器的种类有很多
检测气体 : 温度、湿度、空气中的微颗粒物(PM2.5、PM1.0)
稀有气体的含量(一氧化碳、二氧化碳、氧气、甲烷、乙醇、甲醛)
检测液体 : 温度、浑浊度、PH值、液位
检测固体 : 土壤湿度、微量元素的含量
检测人体 : 体温、血压、血糖、心率
...
本身市面上的传感器的种类有很多很多种
2.传感器接口的简介
GPIO接口、串口接口(USART/UART、IIC、SPI...)、并口接口
数字型的传感器 : 可以直接采集到数字量,可以直接交给CPU去处理
模拟型的传感器 : 采集到的是模拟量,需要经过AD转换,
转换成了数字量再交给CPU去处理
五.DHT11传感器
DHT11传感器是一个温湿度的传感器(是专门用来检测温度和湿度的)
外观上来看是4引脚的封装形式
打开<STM32RBT6\DataSheet\传感器>目录下
<DHT11说明书.pdf>和<DHT22.pdf>
1.DHT11是一个数字型的传感器
2.DHT11是用来采集温湿度的数据
3.DHT11是4引脚的封装形式
4.测量范围 湿度:20%-90% 温度:0℃-50℃
5.误差范围 湿度:±5% 温度:±2℃
6.分辨力为1 DHT11只能检测到整数数据
7.1pin连接电源 2pin连接MCU 3pinNC(悬空<没有连接>) 4pin连接地
上拉电阻
下拉电阻
8.DHT11是串行接口 : 指的是数据以串行的方式进行传输
串行的方式 : 指的是按顺序一位一位的传输数据
9.单线双向指的是半双工工作模式(发送的同时不能接收,接收的同时不能发送)
串行传输
A.一次完整的数据传输为40bit,高位先出.
例子 : DHT11的数据管脚连接到了STM32的PC10管脚
需要通过PC10管脚发送数据或者接收数据
1)通过PC10管脚发送数据(高位先出)
data = 10110100;
data & PCOut(10)
第1次循环 10110100 10000000 1
第2次循环 01101000 10000000 0
第3次循环 11010000 10000000 1
第4次循环 10100000 10000000 1
第5次循环 01000000 10000000 0
第6次循环 10000000 10000000 1
第7次循环 00000000 10000000 0
第8次循环 00000000 10000000 0
void func(u8 data)//通过PC10管脚把形参data存储的数据发送
{
u8 i = 0;//循环变量
for(i =0 ; i < 8; i++)
{
if(data & 0x80)
PCOut(10) = 1;
else
PCOut(10) = 0;
data <<= 1;
}
}
2)通过PC10管脚发送数据(低位先出)
data & PCOut(10)
第1次循环 10110100 00000001 0
第2次循环 01011010 00000001 0
第3次循环 00101101 00000001 1
第4次循环 00010110 00000001 0
第5次循环 00001011 00000001 1
第6次循环 00000101 00000001 1
第7次循环 00000010 00000001 0
第8次循环 00000001 00000001 1
void func(u8 data)
{
u8 i = 0;//循环变量
for(i = 0; i < 8; i++)
{
if(data & 0x01)
PCOut(10) = 1;
else
PCOut(10) = 0;
data >>= 1;
}
}
3)通过PC10管脚读取数据(高位先出)
DHT11要发送10110100
PCIn(10) data <<=1 data
第1次循环 1 00000000 00000001
第2次循环 0 00000010 00000010
第3次循环 1 00000100 00000101
第4次循环 1 00001010 00001011
第5次循环 0 00010110 00010110
第6次循环 1 00101100 00101101
第7次循环 0 01011010 01011010
第8次循环 0 10110100 10110100
u8 func(void)
{
u8 data = 0;//保存读取到的数据
u8 i = 0;//循环变量
for(i = 0; i < 8; i++)
{
data <<= 1;
if(PCIn(10) == 1)
data |= 1;
}
return data;
}
4))通过PC10管脚读取数据(低位先出)
DHT11要发送10110100
PCIn(10) data >>=1 data
第1次循环 0 00000000 00000000
第2次循环 0 00000000 00000000
第3次循环 1 00000000 10000000
第4次循环 0 01000000 01000000
第5次循环 1 00100000 10100000
第6次循环 1 01010000 11010000
第7次循环 0 01101000 01101000
第8次循环 1 00110100 10110100
u8 func(void)
{
u8 data = 0;//保存读取到的数据
u8 i = 0;//循环变量
for(i = 0; i < 8; i++)
{
data >>= 1;
if(PCIn(10) == 1)
data |= 0x80;
}
return data;
}
===========================
作业
1.把今天讲过的内容完完整整的复习一遍
2.可以使用操作寄存器的方法驱动一下独立看门狗
3.根据手册操作一下窗口看门狗
4.在纸上写一遍串行接口发送数据和接收数据(高位先出和低位先出)
===========================