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中定义函数

/* USER CODE BEGIN 1 */
void delay_us(uint16_t us)
{
	/*中断会打断微秒延时函数但是计数器计数不会停止,防止计数器增加到最大值后重新开始计数*/

  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函数测试:

  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下拉

 

代码如下:

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 @ 2023-06-27 15:26  面筋玄师  阅读(198)  评论(0)    收藏  举报