2.Systick 系统定时器
-系统定时器一般用于单片机操作系统产生时间,维持OS的心跳和实现任务分时调度等。
-中断向量表中有个专属的Systick_Handler
-Systick是24位的向下递减的计数器,时钟源每来一个时钟,其值就会减一。一般将Systick的时钟源设置为系统时钟,当计数器值减为0时,系统定时器就会产生一次终端,之后CPU循环往复重新装载计数器实现循环
-可以选择外部或者内部的时钟源,cpu上电首先默认使用MSI时钟源
通过Systick实现毫秒级别延时:
思路:如果想要实现一毫秒的计时,32mHZ情况下,把LOAD寄存器的值设置为32000(32m/32000 = 0.001s)
stm32L433中除了通用的Systick定时器,还有6个定时器,1,2,6,7,15,16; TIM6/TIM7是两个16位自装载基本定时器,只能用于定时;其余的还能作PWM输出
实现延时的大致思路:时钟源——>预分频——>装载寄存器(reload)
微秒级别的延时使用中断方式会频繁打断CPU正常执行程序,因此不使用中断模式
在tim.c中定义函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* USER CODE BEGIN 1 */ void delay_us(uint16_t us) { /*中断会打断微秒延时函数但是计数器计数不会停止,防止计数器增加到最大值后重新开始计数*/ <br><br> uint16_t differ = 60000-us; //tim616位最大到65535,这里定义us级别延时最大到60000 __HAL_TIM_SET_COUNTER(&htim6,differ); //设置counter值 HAL_TIM_Base_Start(&htim6); //开启TIM6 while (differ < 60000) { differ = __HAL_TIM_GET_COUNTER(&htim6); } HAL_TIM_Base_Stop(&htim6); } /* USER CODE END 1 */ |
main函数测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ int i = 0; HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,RESET); do { delay_us(1000); i++; } while (i<1000); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,SET); for (i =0;i<1000;i++) delay_us(1000); } |
以上能够实现每隔1s的熄灭能有1s的亮灯
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
蜂鸣器的介绍:
蜂鸣器(beep/buzzer)是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、报警器、电子玩具、汽车电子设备、等电子产品中作发声器件,使用蜂鸣器来做提示或报警,
主要分为压电式蜂鸣器和电磁式蜂鸣器
(可以理解为开关操作,当频率很高时人眼就感觉不出)
pwm中有两个专业的术语,一个是频率,指的是1s内高低电平出现的次数;还有一个占空比,即信号处于高电平的时间占据整个信号周期的百分比(”方波指的是占空比为50%的PWM波形“)
因为PWM会输出高低电平,防止误发声音设置GPIO下拉
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void beep(uint8_t times,uint16_t interval) { while (times--) { if (HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4) != HAL_OK) { Error_Handler(); } HAL_Delay(interval); if (HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_4) != HAL_OK) { Error_Handler(); } HAL_Delay(interval); } } |
代码如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)