4.看门狗、定时器、触摸电容
系统复位方式:
1. NRST引脚上的低电平(外部复位)
2. 窗口看门狗计数终止(WWDG复位)
3. 独立看门狗计数终止(IWDG复位)
4. 软件复位(SW复位)
5. 低功耗管理复位
IWDG简介 :独立看门狗
本质:能产生系统复位信号的计数器
特性:递减的计数器;时钟由独立的RC振荡器提供(可在待机和停止模式下运行);看门狗被激活后,当递减计数器计数到0x000时产生复位
喂狗:在计数器计数到0之前,重装载计数器的值,防止复位:IWDG有什么作用
作用:主要用于检测外界电磁干扰,或硬件异常导致的程序跑飞问题
独立看门狗是异常处理的最后手段,不可依赖,应在设计时尽量避免异常的发生
IWDG溢出时间计算:
IWDG溢出时间计算公式(HAL库):Tout =(psc∗𝑟𝑙𝑟)/f𝐼𝑊𝐷𝐺
Tout:溢出时间
f𝐼𝑊𝐷𝐺:时钟源频率
psc:预分频系数
rlr:重装载值
寄存器设置分频系数的方法:"psc" =4∗2^prer
prer是IWDG_PR 的值
IWDG溢出时间计算公式(寄存器):Tout =((4∗2^prer)∗𝑟𝑙𝑟)/f𝐼𝑊𝐷𝐺
IWDG配置步骤:
1,使能IWDG,设置预分频系数和重装载值等(IWDG_PR/RL/KR):HAL_IWDG_Init()
2,把重装载寄存器的值重载到计数器中,喂狗(IWDG_KR):HAL_IWDG_Refresh()
分频系数(参考手册17.3.3):
重装载值:
"f" 𝐼𝑊𝐷𝐺是看门狗的时钟源频率:1MHz=10000
WWDG简介 :窗口看门狗
本质:能产生系统复位信号和提前唤醒中断的计数器
特性:递减的计数器;窗口期,可以喂狗,非窗口期,喂狗则会复位(W[6:0] ≥窗口期>0x3F)
喂狗:在窗口期内重装载计数器的值,防止复位
作用:用于监测单片机程序运行时效是否精准,主要检测软件异常
WWDG超时时间计算:T𝑜𝑢𝑡 =(4096∗2^WDGTB∗(T[5:0]+1))/Fwwdg

WWDG配置步骤:
1,使能WWDG,设置预分频系数和窗口值等(WWDG_CR/WWDG_CFR):HAL_WWDG_Init()
2,WWDG MSP回调函数:HAL_WWDG_MspInit() 配置NVIC、CLOCK等
设置优先级,使能中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
3,编写中断服务函数:WWDG_IRQHandler() HAL_WWDG_IRQHandler
4,重定义提前唤醒回调函数:HAL_WWDG_EarlyWakeupCallback()
在窗口期内喂狗,重装载计数器(WWDG_CR):HAL_WWDG_Refresh()
软件定时原理:使用纯软件(CPU死等)的方式实现定时(延时)功能
缺点:1,延时不精准;2,CPU死等
定时器定时原理:使用精准的时基,通过硬件的方式,实现定时功能
定时器核心就是计数器
定时器类型:
基本定时器:没有输入输出通道,常用作时基,即定时功能
通用定时器:具有多路独立通道,可用于输入捕获/输出比较,也可用作时基
高级定时器:除具备通用定时器所有功能外,还具备带死区控制的互补信号输出、刹车输入等功能(可用于电机控制、数字电源设计等)
基本定时器:TIM6/TIM7
主要特性:16位递增计数器(计数值:0~65535)
16位预分频器(分频系数:1~65536)
可用于触发DAC
在更新事件(计数器溢出)时,会产生中断/DMA请求
定时器中断实验配置步骤(atim.c):
1,初始化定时器基础参数(CR1、ARR、PSC):HAL_TIM_Base_Init()
2,使能更新中断并启动计数器(DIER、CR1):HAL_TIM_Base_Start_IT()
3,存放NVIC、CLOCK、GPIO初始化代码:HAL_TIM_Base_MspInit() 配置NVIC、CLOCK等
设置优先级,使能中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
4,定时器中断处理公用函数,处理各种中断(SR):TIMx_IRQHandler()等 HAL_TIM_IRQHandler()
5,定时器更新中断回调函数,由用户重定义:HAL_TIM_PeriodElapsedCallback()
通用定时器PWM输出实验配置步骤(gtim.c):
1,初始化定时器基础参数(CR1、ARR、PSC):HAL_TIM_PWM_Init()
配置PWM模式、比较值、输出极性等(CCMRx、CCRx、CCER):HAL_TIM_PWM_ConfigChannel()
使能输出比较并启动计数器(CCER、CR1):HAL_TIM_PWM_Start()
2,存放NVIC、CLOCK、GPIO初始化代码:HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
3,修改比较值控制占空比(CCRx可选):__HAL_TIM_SET_COMPARE()
4,使能通道预装载(CCER可选):__HAL_TIM_ENABLE_OCxPRELOAD()
通用定时器输入捕获实验配置步骤:
1,初始化定时器基础参数(CR1、ARR、PSC):HAL_TIM_IC_Init()
配置通道映射、捕获边沿、分频、滤波等(CCMRx、CCER):HAL_TIM_IC_ConfigChannel()
2,存放NVIC、CLOCK、GPIO初始化代码:HAL_TIM_IC_MspInit() 配置NVIC、CLOCK、GPIO等
设置优先级,使能中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
3,定时器中断处理公用函数,处理各种中断(SR):TIMx_IRQHandler()等 HAL_TIM_IRQHandler()
4,编写更新中断和捕获回调函数:
定时器输入捕获回调函数,由用户重定义:HAL_TIM_IC_CaptureCallback()
定时器更新中断回调函数,由用户重定义:HAL_TIM_PeriodElapsedCallback()
5,使能
使能更新中断等(DIER):__HAL_TIM_ENABLE_IT()
使能输入捕获、捕获中断并启动计数器(CCER、DIER、CR1):HAL_TIM_IC_Start_IT()
通用定时器脉冲计数实验配置步骤:
1,初始化定时器基础参数(CR1、ARR、PSC):HAL_TIM_IC_Init()
2,存放NVIC、CLOCK、GPIO初始化代码:HAL_TIM_IC_MspInit() 配置NVIC、CLOCK、GPIO等
3,配置定时器从模式、触发选择、分频、滤波等(SMCR、CCMRx、CCER):HAL_TIM_SlaveConfigSynchro()
4,使能输入捕获、启动计数器(CCER、CR1):HAL_TIM_IC_Start()
5,获取计数器当前值(CNT):__HAL_TIM_GET_COUNTER()
6,设置计数器的值(CNT):__HAL_TIM_SET_COUNTER()
高级定时器输出指定个数PWM实验配置步骤:
1,初始化定时器基础参数(CR1、ARR、PSC):HAL_TIM_PWM_Init()
2,存放NVIC、CLOCK、GPIO初始化代码:HAL_TIM_PWM_MspInit()
3,配置PWM模式、比较值、输出极性等(CCMRx、CCRx、CCER):HAL_TIM_PWM_ConfigChannel()
4,设置优先级,使能中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,使能更新中断等(CCER):__HAL_TIM_ENABLE_IT()
6,使能输出、主输出、启动计数器(CCER、CR1):HAL_TIM_PWM_Start()
7,定时器中断处理公用函数,处理各种中断(SR):TIMx_IRQHandler()等->HAL_TIM_IRQHandler()
8,定时器更新中断回调函数,由用户重定义:HAL_TIM_PeriodElapsedCallback()
通过软件产生事件(EGR):HAL_TIM_GenerateEvent()
启动计数器(CR1):__HAL_TIM_ENABLE()
高级定时器输出比较模式实验配置步骤:
1,初始化定时器基础参数(CR1、ARR、PSC):HAL_TIM_OC_Init()
2,存放NVIC、CLOCK、GPIO初始化代码:HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等
3,设置输出比较模式、比较值、输出极性等(CCMRx、CCRx、CCER):HAL_TIM_OC_ConfigChannel()
4,使能通道预装载(CCMRx):__HAL_TIM_ENABLE_OCxPRELOAD()
5,使能输出比较、主输出、启动计数器(CR1、CCER、BDTR):HAL_TIM_OC_Start()
6,修改捕获/比较寄存器的值(CCRx):__HAL_TIM_SET_COMPARE()
死区时间计算:
1,确定t𝐷𝑇𝑆的值:𝑓𝐷𝑇𝑆=Ft/(2^𝐶𝐾𝐷[1:0])
2,判断DTG[7:5],选择计算公式
3,代入选择的公式计算
高级定时器互补输出带死区控制实验配置步骤:
1,初始化定时器基础参数(CR1、ARR、PSC):HAL_TIM_PWM_Init()
2,存放NVIC、CLOCK、GPIO初始化代码:HAL_TIM_PWM_MspInit()
3,配置PWM模式、比较值、输出极性等(CCMRx、CCRx、CCER):HAL_TIM_PWM_ConfigChannel()
4,配置刹车功能、死区时间等(BDTR):HAL_TIMEx_ConfigBreakDeadTime()
5,使能输出、主输出、启动计数器(CCER、CR1):HAL_TIM_PWM_Start()
6,使能互补输出、主输出、启动计数器(CCER、CR1):HAL_TIMEx_PWMN_Start()
高级定时器PWM输入模式实验配置步骤:
1,初始化定时器基础参数(CR1、ARR、PSC):HAL_TIM_IC_Init()
2,存放NVIC、CLOCK、GPIO初始化代码:HAL_TIM_IC_MspInit()
3,配置通道映射、捕获边沿、分频、滤波等(CCMRx、CCER):HAL_TIM_IC_ConfigChannel()
4,配置从模式、触发源、触发边沿等(SMCR、CCER):HAL_TIM_SlaveConfigSynchro()
5,设置优先级,使能中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
6,使能输入捕获、捕获中断并启动计数器(CCER、DIER、CR1):HAL_TIM_IC_Start_IT()、 HAL_TIM_IC_Start()
7,定时器中断处理公用函数,处理各种中断(SR):TIMx_IRQHandler()等-> HAL_TIM_IRQHandler()
8,定时器输入捕获回调函数,由用户重定义:HAL_TIM_IC_CaptureCallback()
检测电容触摸按键过程:
1、TPAD引脚设置为推挽输出,输出低电平,实现电容放电到地
2、TPAD引脚设置为浮空输入(IO复位后的状态),电容开始充电
3、同时开启TPAD引脚的输入捕获功能,开始捕获高电平
4、等待充电过程中,上升沿触发(充电到Vth(上升沿的电压值))
5、计算充电时间(定时器捕获/比较寄存器获取)
--
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」