嵌入式专题研究2:系统时钟和定时器和看门狗
时钟系统:
构成:
1.振荡器——脉搏
RC振荡器
晶体振荡器
四种:HSE,HSI,LSE,LSI
2.唤醒定时器
3.PLL倍频器
4.各种分频器
可以通过stm32cubemx进行时钟配置,但是在SystemClock_Config()函数前,在启动文件中有默认的时钟配置。
while (1) { HAL_GPIO_WritePin(GPIOC,LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin,GPIO_PIN_RESET); mydelay(1000); HAL_GPIO_WritePin(GPIOC,LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin,GPIO_PIN_SET); mydelay(1000);
定时器:能够实现定时和计数
HAL_Delay()的实现:
使用hal库时,发现__weak修饰符:该修饰符的函数被称为弱函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。
缺陷:在中断服务函数中使用HAL_Delay会引起混乱,因为HAL_Delay是通过中断方式实现的,而Systick的中断一般操作系统优先级最低,所以在中断中运行HAL_Delay会导致死锁的现象。
定时器:
APB1和APB2上挂了很多不同的定时器,需要注意。
计时时间为1/(TIM * CLK/(PSC+1))*(ARR+1)
所以定时器需要配置PSC预分频器和自动重载寄存器ARR。
输入捕获和输出比较:输入捕获可以检测外部引脚电平的变化,输出比较用来控制一个输出波形。
实验:利用基础定时器实现定时1m中断,并在中断处理函数中打印输出字符。
stm32f103zet6的APB1和APB2都是72mhz。
使能定时器中断。
高级定时器:
定时器通道:
查看了手册,跟我用的pz6806l的led对应的是TIM3的ch1-ch2,复用的管脚为PC6-PC7。
输入捕获:外部管脚,可用于测量频率或者电平持续时间。
实验:捕获按键按下后低电平持续的时间
看门狗:
独立看门狗IWDG:监控系统是否出现故障,将系统复位。
关键字寄存器IWDG_KR:喂狗,修改重装载寄存器,启动IWDG
采用LSI时钟,在低电压情况下也能工作。
实验:按下按钮就喂狗,不按下则复位
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET){ HAL_IWDG_Refresh(&hiwdg); }
窗口看门狗WWDG:检测软件故障。
可以配置时间窗,检测应用程序非预期中的运行流程。
复位条件:1.自减计数器小于0x40
2. 喂狗时间大于上窗口的值
因此必须在时间窗口中喂狗,其余时间喂狗均会复位。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!