这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第1期-DIY功率检测与控制系统】03过程帖:基础任务1使用单片

共1条 1/1 1 跳转至

【Let'sdo第1期-DIY功率检测与控制系统】03过程帖:基础任务1使用单片机定时器实现1s翻转LED验证开发板时钟晶振是否正确

高工
2025-05-20 21:06:56     打赏

一:STM32F411定时器相关知识:

该器件包含一个高级控制定时器、七个通用定时器和两个看门狗定时器。

所有定时器计数器都可以冻结在调试模式下。

表4比较了高级控制定时器和通用定时器的特性。

1.png

高级控制定时器(TIM1)

高级控制定时器(TIM1)可以被视为三个相位的PWM发生器,它们被复用在四个独立的通道上。它具有互补的PWM输出,具有可编程的插入死区时间。它也可以被认为是一个完整的一般用途定时器。它的四个独立通道可用于:

输入捕获

输出比较

PWM 生成(边缘或中心对齐模式)

单脉冲模式输出

如果配置为标准16位定时器,则具有与通用TIMx定时器相同的功能。如果配置为16位PWM发生器,则具有完整的调制能力(0-100%)

高级控制定时器可以通过定时器链接功能与TIMx定时器一起工作,以实现同步或事件链

TIM1 支持独立 DMA 请求生成。

二:通用定时器知识分享:

通用定时器(TIMx)

STM32F411xC/xE中嵌入了七个可同步的通用定时器(参见表4以了解差异)

TIM2、TIM3、TIM4、TIM5

STM32F411xC/xE设备包含4个功能齐全的一般用途定时器:TIM2、TIM5、TIM3和TIM4。TIM2和TIM5定时器基于32位自动重载上/下计数器和16位预分频器。TIM3和TIM4定时器基于16位自动重载上/下计 计数器和16位预分 频器。它们都具有4个独立的通道,用于输入捕获/输出比较、PWM或单脉冲模式输出。这使得最多可以有15个输入捕获/输出比较/PWM。

TIM2、TIM3、TIM4、TIM5通用定时器可以协同工作,或者与其他通用定时器和高级控制定时器TIM1通过定时器链接功能进行同步或事件链。

这些通用定时器中的任何一个都可以用于生成PWM输出。TIM2、TIM3、TIM4、TIM5都具有独立的DMA请求生成功能。它们能够处理正交(增量)编码器信号以及来自1到4个霍尔效应传感器的数字输出。

TIM9、TIM10和TIM11

这些定时器基于16位自动重载计数器和16位预分频器。TIM10和TIM11具有一个独立的通道,而TIM9具有两个独立的通道,用于输入捕获/输出比较、PWM或单脉冲模式输出。它们可以与TIM2、TIM3、TIM4、TIM5功能齐全的一般用途定时器同步。它们也可以用作简单的时间基准。

对于看门口定时、窗口看门口和系统滴答定时器,这里不在介绍:

三:STM32 cube MX的配置

3.1  首先我们看下原理图,开发板晶振的配置过程:

可以看到板载调试的PA8引脚输出的一定的频率接到了STM32F411开发板的PF0引脚,所以我们可以使用外部的高速时钟源,作为HSE的晶振频率,使用示波器测量一下,晶振的工作频率,可以保证系统的稳定运行。当然也可以使用内的高速时钟:16Mhz

3.2 修改系统的时钟的配置部分:

5.png

由于手头上暂时没有示波器,测量不了外部得晶振频率,防止程序跑飞,这里我使用内部得HSI:16MHZ,作为系统的时钟源;

3.3  定时器10的配置,这里为了节省资源,使用的基本定时器10实现LED灯的翻转;

Tout(中断触发时间)=(ARR+1)(PSC+1)/定时器的时钟频率

6.png

这里配置好,定时器10的分频系数、重装值和使能自动重装功能;

3.4 配置项目工程的中断分组和中断的优先级

7.png

配置完成后,参考之前帖子直接生成代码就好;

四:软件编写:

4.1 开启定时器10计数功能:

void MX_TIM10_Init(void)
{

  /* USER CODE BEGIN TIM10_Init 0 */

  /* USER CODE END TIM10_Init 0 */

  /* USER CODE BEGIN TIM10_Init 1 */

  /* USER CODE END TIM10_Init 1 */
  htim10.Instance = TIM10;
  htim10.Init.Prescaler = 99;
  htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim10.Init.Period = 999;
  htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim10) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM10_Init 2 */
		HAL_TIM_Base_Start_IT(&htim10); 
  /* USER CODE END TIM10_Init 2 */

}

4.2 编写定时器10的中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */

  /* USER CODE BEGIN Callback 1 */
  if (htim->Instance == TIM10) {
			Time10point++;
				if(Time10point >=1000)
				{
					Time10point = 0 ;
					HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);  
				}
			}
}

试验现象:定时器以1S的时间间隔闪烁

WeChat_20250520210119 00_00_00-00_00_30.gif

测试代码如下所示:

02_LED_time.zip




关键词: 定时器10     LED灯闪烁    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]