博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32CubeMX(02)HAL库之定时器
阅读量:3962 次
发布时间:2019-05-24

本文共 6736 字,大约阅读时间需要 22 分钟。

文章目录

在这里插入图片描述


前言

前一篇完成了开发板的入门级程序,点亮一个LED灯。今天我们就利用LED+定时器设计一个交通灯,算是实验加小练习了。

大家可以回去看看LED的点亮程序。
这个很重要,因为有一些基础配置在这一章,我们这一章着重讲一下定时器。

一、定时器是什么?

定时器是对周期固定的脉冲信号进行计数。这里我就用很通俗的话来说一下。这里以F407为例,407的主频是168M。这里的168M是什么概念呢,就是最大可以以168M的频率记一次数。再通俗一点,就是最最短可1/168M(秒)记一次数。也就是说最短可以0.00000000595s,记一次,那我要记1s,要数多少次,要数168000000次,太多了,所以我们要分频,和规定计数值(就是要数多少次的意思),这样我们就好算了。比如说168M除以168,就是168分频,分频就是÷的意思。那就变成1MHz数一次数,记一秒我只需要数1000000次就行了,当然还有很多很多其他组合,所以我们的定时时间才可以任意设定,

所以定时器主要关心分频系数计数值,是没有问题的,这两个是决定定时时间的。
在这里插入图片描述

1、使用定时器关注的问题

在这里插入图片描述

在这里插入图片描述

2、 STM32定时器家族

在这里插入图片描述

3、定时器的主要功能

定时器真的是很常用的一个模块,无论是输出PWM,还是输入捕获,还是ADC采样,都用到了定时器,

简直不要太强。
在这里插入图片描述
在这里插入图片描述

二、定时器的总线结构

STM32F4定时器有(14个),基本定时器(2个):TIME6,TIME7,通用定时器(10个):TIME2~5,TIME9 到14,高级定时器(2个):TIME1 , TIME8,为什么要分这么多个,因为应用场景不一样,所以需要用到哪些功能我们可以开哪个。

在这里插入图片描述
在这里插入图片描述

1、三种定时器功能比较

在这里插入图片描述

2、计数器时钟频率计算

这里要注意一下,我们定时器时钟是挂在APB1或者APB2总线上的,通过看上面定时器的总线结构,我们可以看到,通用定时器(10个):TIME2~5,TIME9 到14是挂在APBA2总线上的,也就是说这些定时器最高频率可以达到168MHz,其余的定时器,最大只能达到84M

在这里插入图片描述

三、HAL库函数的设计方法

1、计数器时钟频率计算举例

定时器的还有一些相关的寄存器咱就不说了,我们主要关心怎么用,

在这里插入图片描述

2、定时器基本配置结构体

在这里插入图片描述

3、定时器相关库函数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、定时翻转LED灯状态(定时中断方式)

在这里插入图片描述

1、设计步骤

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、工程配置

1、系统设置

设置SYS debug为串行总线,设置高速外部时钟HSE选择外部时钟源

在这里插入图片描述

在这里插入图片描述

2、GPIO口设置

这里我以PF8为例,LED0,输出

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3、定时器2设置

选择内部时钟,设置好分频系数,1s的定时,开区自动重装载,意思是记完了又重新开始记,循环往复,开启定时器中断。

在这里插入图片描述
在这里插入图片描述

4、时钟设置

在这里插入图片描述

5、项目文件设置

这里为何这样配置前面一章也有介绍,这里不在重复。

在这里插入图片描述
在这里插入图片描述

6、创建工程文件

点击GENERATE CONDE 创建工程

在这里插入图片描述

3、例程

在while(1)上方用户代码区初始化使能定时器2

在这里插入图片描述
在main.c上方用户代码区初始化添加回调函数,在这个回调函数里面就是我们要做的事情。我们要1S翻转一次,所以我们那就添加翻转的函数。通俗点就是说我每隔一秒必须要回到这个函数,把这个函数里面要做的事情做完我才去做其他事情。
在这里插入图片描述
在这里插入图片描述
点击我们的魔术棒,进入到debug的setting,一定要勾选Reset and Run,否则是没有现象的。
在这里插入图片描述
编译没问题,我们就点击下载到开发板看实验现象。

在这里插入图片描述

在这里插入图片描述

这是main.c文件,大家可以直接复制,主要是底层的时钟,GPIO,定时器配置好了,事情就简单了。

/* USER CODE BEGIN Header *//**  ******************************************************************************  * @file           : main.c  * @brief          : Main program body  ******************************************************************************  * @attention  *  * 

© Copyright (c) 2021 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** *//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include "main.h"#include "tim.h"#include "gpio.h"/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/void SystemClock_Config(void);/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 *///定时器2中断服务函数 @main.cvoid HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if (htim->Instance == TIM2) {
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_8); }}/* USER CODE END 0 *//** * @brief The application entry point. * @retval int */int main(void){
/* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 *///使能定时器2 HAL_TIM_Base_Start_IT(&htim2); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) {
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */}/** * @brief System Clock Configuration * @retval None */void SystemClock_Config(void){
RCC_OscInitTypeDef RCC_OscInitStruct = {
0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {
0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler(); } /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
Error_Handler(); }}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//** * @brief This function is executed in case of error occurrence. * @retval None */void Error_Handler(void){
/* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ /* USER CODE END Error_Handler_Debug */}#ifdef USE_FULL_ASSERT/** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */void assert_failed(uint8_t *file, uint32_t line){
/* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */}#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

4、实现结果

定时器的定时还是很精确的,我们就是利用定时器的精确定时。这里是1S定时。

在这里插入图片描述

总结

定时器可以说是STM32的精髓,大家一定要好好把握,第一次学定时器的时候,我甚至连定时器中断是什么,那是因为当时的知识储备不足,到后来,第二次,第三次学的时候才后知后觉,所以我们是需要一个认知的过程的。代码之路任重道远~,还需多多练习。

在这里插入图片描述

转载地址:http://kbezi.baihongyu.com/

你可能感兴趣的文章
Python logging模块详解
查看>>
加载selenium2Library失败---robotframework环境搭建(RIDE无法启动?)
查看>>
Robot Framework 的安装配置和简单的实例介绍
查看>>
APP功能测试的7大注意点
查看>>
Python之unittest
查看>>
Fiddler之——Fiddler简介
查看>>
Fiddler之——Fiddler抓包分析
查看>>
Android开发之——activity跳转
查看>>
Android开发之——Menu 操作
查看>>
Android开发之——布局实例
查看>>
Android开发之——SQLite使用方法
查看>>
Python之SMTP发送邮件
查看>>
手动测试无法被取代的理由
查看>>
浅析移动测试:应用上线不“裸奔”的正确方式
查看>>
Robot Framework之元素定位
查看>>
性能测试方案之性能测试术语解释
查看>>
性能测试方案之性能测试方法
查看>>
测试方法之单元测试
查看>>
QTP之——Failed to run script. Description: 没有注册类别
查看>>
Perl+Eclipse配置
查看>>