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);
    }
 
}

  

代码如下:

 

posted @   面筋玄师  阅读(159)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示