当前位置:   article > 正文

STM32定时器Timer(PWM呼吸灯)_stm32用通用定时器实现呼吸灯

stm32用通用定时器实现呼吸灯

目录

定时器介绍

定时器工作原理:

定时器分类:

STM32F103C8T6定时器资源:

​编辑 

通用定时器介绍:  

 定时器计数模式:

定时器时钟源:

​编辑 定时器溢出时间计算公式:

定时器中断实验 

PWM介绍

STM32F103C8T6 PWM资源:

 PWM周期与频率:

PWM实验

 4. 业务代码


定时器介绍

软件定时
缺点:不精确、占用 CPU 资源
  1. void Delay500ms() //@11.0592MHz
  2. {
  3. unsigned char i, j, k;
  4. _nop_();
  5. i = 4;
  6. j = 129;
  7. k = 119;
  8. do
  9. {
  10. do
  11. {
  12. while (--k);
  13. } while (--j);
  14. } while (--i);
  15. }

定时器工作原理:

使用精准的时基,通过硬件的方式,实现定时功能。定时器核心就是计数器。

定时器分类:

  • 基本定时器(TIM6~TIM7
  • 通用定时器(TIM2~TIM5
  • 高级定时器(TIM1TIM8

STM32F103C8T6定时器资源:

 

通用定时器介绍:  

1 ) 16 位向上、向下、向上 / 向下自动装载计数器(
TIMx_CNT )。
2 ) 16 位可编程 ( 可以实时修改 ) 预分频器 ( TIMx_PSC ) ,计数器时钟频率的分频系数为 1 65535 之间的
任意数值。
3 4 个独立通道(
TIMx_CH1 ~ 4 ),这些通道可以用来作为:
A .输入捕获
B .输出比较
C PWM 生成 ( 边缘或中间对齐模式 )
D .单脉冲模式输出
4 )可使用外部信号(
TIMx_ETR )控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)
的同步电路。
5 )如下事件发生时产生中断 / DMA
A .更新:计数器向上溢出 / 向下溢出,计数器初始化 ( 通过软件或者内部 / 外部触发 )
B .触发事件 ( 计数器启动、停止、初始化或者由内部 / 外部触发计数 )
C .输入捕获
D .输出比较
E .支持针对定位的增量 ( 正交 ) 编码器和霍尔传感器电路
F .触发输入作为外部时钟或者按周期的电流管理

 定时器计数模式:

 

定时器时钟源:

 定时器溢出时间计算公式:

 

例如,要定时500ms,则:PSC=7199ARR=4999Tclk=72M

定时器中断实验 

需求:使用定时器中断方法,每 500ms 翻转一次 LED1 灯状态。
1. RCC 配置
2. LED1 灯配置
3. 时钟数配置
4. TIM2 配置

5. 工程配置

6. 重写更新中断回调函数

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3. if(htim->Instance == TIM2)
  4. HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
  5. }

 7. 启动定时器

main.c 中,在定时器初始化命令之后加入以下代码:
HAL_TIM_Base_Start_IT(&htim2);

PWM介绍

STM32F103C8T6 PWM资源:

高级定时器( TIM1 ): 7
通用定时器( TIM2~TIM4 ):各 4
PWM 输出模式:
PWM 模式 1 :在向上计数时,一旦 CNT < CCRx 时输出为有效电平,否则为无效电平; 在向
下计数时,一旦 CNT > CCRx 时输出为无效电平,否则为有效电平。
PWM 模式 2 :在向上计数时,一旦 CNT < CCRx 时输出为无效电平,否则为有效电平; 在向
下计数时,一旦 CNT > CCRx 时输出为有效电平,否则为无效电平。

 PWM周期与频率:

PWM占空比:

TIMx_CCRx寄存器决定。 

PWM实验

需求:使用 PWM 点亮 LED1 实现呼吸灯效果。 LED 灯为什么可以越来越亮,越来越暗?
这是由不同的占空比决定的。
如何计算周期 / 频率?
假如频率为 2kHz ,则: PSC=71 ARR=499
LED1 连接到哪个定时器的哪一路?
学会看产品手册:
1. 设置时钟
2. 设置定时器
记得把极性设置为 Low ,因为 LED 灯是低电平才亮。

 3. 配置工程

 4. 业务代码

  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2023 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"
  21. #include "tim.h"
  22. #include "gpio.h"
  23. /* Private includes ----------------------------------------------------------*/
  24. /* USER CODE BEGIN Includes */
  25. /* USER CODE END Includes */
  26. /* Private typedef -----------------------------------------------------------*/
  27. /* USER CODE BEGIN PTD */
  28. /* USER CODE END PTD */
  29. /* Private define ------------------------------------------------------------*/
  30. /* USER CODE BEGIN PD */
  31. /* USER CODE END PD */
  32. /* Private macro -------------------------------------------------------------*/
  33. /* USER CODE BEGIN PM */
  34. /* USER CODE END PM */
  35. /* Private variables ---------------------------------------------------------*/
  36. /* USER CODE BEGIN PV */
  37. /* USER CODE END PV */
  38. /* Private function prototypes -----------------------------------------------*/
  39. void SystemClock_Config(void);
  40. /* USER CODE BEGIN PFP */
  41. /* USER CODE END PFP */
  42. /* Private user code ---------------------------------------------------------*/
  43. /* USER CODE BEGIN 0 */
  44. /* USER CODE END 0 */
  45. /**
  46. * @brief The application entry point.
  47. * @retval int
  48. */
  49. int main(void)
  50. {
  51. uint16_t pwmVal=0;
  52. uint8_t dir=1;
  53. /* USER CODE BEGIN 1 */
  54. /* USER CODE END 1 */
  55. /* MCU Configuration--------------------------------------------------------*/
  56. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  57. HAL_Init();
  58. /* USER CODE BEGIN Init */
  59. /* USER CODE END Init */
  60. /* Configure the system clock */
  61. SystemClock_Config();
  62. /* USER CODE BEGIN SysInit */
  63. /* USER CODE END SysInit */
  64. /* Initialize all configured peripherals */
  65. MX_GPIO_Init();
  66. MX_TIM4_Init();
  67. /* USER CODE BEGIN 2 */
  68. HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
  69. /* USER CODE END 2 */
  70. /* Infinite loop */
  71. /* USER CODE BEGIN WHILE */
  72. while (1)
  73. {
  74. /* USER CODE END WHILE */
  75. HAL_Delay(1);
  76. if (dir)
  77. pwmVal++;
  78. else
  79. pwmVal--;
  80. if (pwmVal > 500)
  81. dir = 0;
  82. if (pwmVal == 0)
  83. dir =1;
  84. //修改比较值,修改占空比
  85. __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwmVal);
  86. /* USER CODE BEGIN 3 */
  87. }
  88. /* USER CODE END 3 */
  89. }
  90. /**
  91. * @brief System Clock Configuration
  92. * @retval None
  93. */
  94. void SystemClock_Config(void)
  95. {
  96. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  97. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  98. /** Initializes the RCC Oscillators according to the specified parameters
  99. * in the RCC_OscInitTypeDef structure.
  100. */
  101. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  102. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  103. RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  104. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  105. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  106. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  107. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  108. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  109. {
  110. Error_Handler();
  111. }
  112. /** Initializes the CPU, AHB and APB buses clocks
  113. */
  114. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  115. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  116. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  117. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  118. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  119. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  120. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  121. {
  122. Error_Handler();
  123. }
  124. }
  125. /* USER CODE BEGIN 4 */
  126. /* USER CODE END 4 */
  127. /**
  128. * @brief This function is executed in case of error occurrence.
  129. * @retval None
  130. */
  131. void Error_Handler(void)
  132. {
  133. /* USER CODE BEGIN Error_Handler_Debug */
  134. /* User can add his own implementation to report the HAL error return state */
  135. __disable_irq();
  136. while (1)
  137. {
  138. }
  139. /* USER CODE END Error_Handler_Debug */
  140. }
  141. #ifdef USE_FULL_ASSERT
  142. /**
  143. * @brief Reports the name of the source file and the source line number
  144. * where the assert_param error has occurred.
  145. * @param file: pointer to the source file name
  146. * @param line: assert_param error line source number
  147. * @retval None
  148. */
  149. void assert_failed(uint8_t *file, uint32_t line)
  150. {
  151. /* USER CODE BEGIN 6 */
  152. /* User can add his own implementation to report the file name and line number,
  153. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  154. /* USER CODE END 6 */
  155. }
  156. #endif /* USE_FULL_ASSERT */

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/302240
推荐阅读
相关标签
  

闽ICP备14008679号