一、定时器的概念以及作用

1.定时器的概念以及作用

在芯片中使用晶振作为计时单位,通过对晶振的计数来实现计时,当时间达到定时器设定的时长后,会跳入对应的函数执行对应的操作。
定时器的主要作用是产生一个时基,通俗的讲就是从某一时刻开始,经过一段指定的时间,触发一个中断或超时回调事件,可以在中断或者超时回调函数中处理数据。

2.定时器的工作原理

1)自动计数模式:在时钟条件下,系统自动计数到最大值溢出,代表一次定时完成

(2)调制计数模式:用户自定义定时时间,系统计时到自定义时间,代表一次定时完成

向上计数:向上计数到设定值后重新计数,周期循环,如图:

连续计数:向上计数到最大值后重新计数,周期循环,如图:

上/下计数:向上计数到设定值后,又从设定值向下计数,如图:

3.定时器的分类:

SysTick定时器:系统时钟滴答定时器(定时作用)。

可用作操作系统任务调度时间片
RTC:实时时钟

WatchDog:看门狗时钟,用于异常复位

外设定时器:

基本定时器:定时作用,用作其他定时器功能的时基

通用定时器:输入捕获、输出比较、PWM(输出比较模式中的一种特例)

高级定时器:通用定时器、带死区控制的PWM、三路移相波形(三相电机控制)

二、使用定时器实验串口通信实验

1.题目要求

设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”

2.工程设置

(1)设置定时器


(2)开启定时器的中断


(3)设置SYS为串口通信:



(4)时钟设置

(5)生成工程文件并且打开

3.代码编写

(1)点开main.c文件并且将其所有代码如替换为如下代码

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2022 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.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);
static void MX_NVIC_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* 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();MX_USART1_UART_Init();/* Initialize interrupts */MX_NVIC_Init();/* USER CODE BEGIN 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};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses 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_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/*** @brief NVIC Configuration.* @retval None*/
static void MX_NVIC_Init(void)
{/* TIM2_IRQn interrupt configuration */HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(TIM2_IRQn);
}/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint32_t time_cnt =0;static uint32_t time_cnt1 =0;  //定义变量计算串口的时间char data[]="hello windows!\n";if(htim->Instance == TIM2){//串口通信if(++time_cnt1==80&&++time_cnt1 <96){   HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);time_cnt1=0;}//LED灯每隔两秒闪烁流水灯   if(++time_cnt >= 160&&++time_cnt <320){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//PA5亮灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯}if(++time_cnt >= 320&&++time_cnt <480){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯}if(++time_cnt >= 480&&++time_cnt <640){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//PC14亮灯
//          if(++time_cnt >= 560&&++time_cnt <568)
//          {
//                          HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
//      }}if(++time_cnt >= 640){time_cnt =0;HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);}}
//      if(htim->Instance == TIM2)
//      {
//          if(++time_cnt1==800&&++time_cnt <960)
//          {
//          HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
//              time_cnt1=0;
//          }
//      }
}
/* 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 */__disable_irq();while (1){}/* 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,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

4.最终结果演示:

三、使用定时器实现每隔2秒跳一次的流水灯

1.题目要求

设置一个2秒的定时器,让LED等周期性地闪烁。

2.工程设置

将PA5、PB9、PC14输出设置为高电平

时钟设置

设置SYS串口通信

生成工程文件并且打开

重复上一个实验的步骤将main.c文件的代码进行替换

3.运行结果如下:

嵌入式学习——使用定时器同时实现串口通信和LED流水灯相关推荐

  1. 嵌入式作业STM32定时器实现串口通信及LED灯闪烁

    目录 前言 一.什么是定时器 1.定时器与计数器 2. 定时器有什么用 3. 定时器的原理 4.时钟产生器和时基单元 二.用STM32CubeMx创建项目 1. 创建项目 2.配置RCC和SYS 3. ...

  2. 【嵌入式04】用寄存器HAL库完成LED流水灯程序

    目录 一.原理学习 1.寄存器映射原理 2.GPIO端口的初始化设置步骤 二.LED流水灯 1.程序设计思路 2.寄存器方式编程实现 3.HAL库编程实现 4.软件仿真 三.总结 四.参考链接 一.原 ...

  3. 51单片机基础——串口通信字符串控制流水灯

    #include <reg52.h> #include<intrins.h> //位移头文件_crol_ #define uchar unsigned char unsigne ...

  4. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  5. AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  6. 嵌入式学习笔记——STM32的USART通信概述

    文章目录 前言 常用通信协议分类及其特征介绍 通信协议 通信协议分类 1.同步异步通信 2.全双工/半双工/单工 3.现场总线/板级总线 4. 串行/并行通信 5. 有线通信.无线通信 STM32通信 ...

  7. 嵌入式学习——使用定时器输出PWM波形,实现 LED呼吸灯的效果

    嵌入式学习--使用定时器输出PWM波形,实现 LED呼吸灯的效果 目录 嵌入式学习--使用定时器输出PWM波形,实现 LED呼吸灯的效果 1. 任务要求 2 PWM波介绍, 2.1 什么是PWM(Pu ...

  8. 【嵌入式系统基础实验一】-----led流水灯及串口通信的HAL库方式和寄存器编程方式实现,输出波形检测

    文章目录 1.实验知识点简要解析 1.1串口通信协议 1.2 RS232.485电平与TTL电平的区别 1.3 USB/TTL转232"模块 2.LED流水灯的寄存器地址 和HAL库这两种方 ...

  9. 英飞凌TC264学习(四)串口通信UART

    英飞凌TC264学习(四)串口通信UART 串口部分的函数在LQ_UART.c中 TC264有四路UART中断,需要中断可以来配置中断,与外部中断一样,中断服务函数,中断号,优先级,不需要中断的话就不 ...

最新文章

  1. runLoop和runtime的分析
  2. 青少年编程竞赛交流群周报(第040周)
  3. 为什么事情执行不下去?
  4. java的runtime类,java中Runtime类的简单应用
  5. 【C++深度剖析教程2】C++经典问题解析之二 this指针与成员函数
  6. STM32----重温ADC测量电压值
  7. python大数据_python大数据
  8. php阳历转阴历(农历),阴历转阳历的方法
  9. iOS静态库.a文件制作和导入使用
  10. 自由移动的气泡_MBBR工艺—移动床生物膜反应器
  11. 软件测试用例(全面)
  12. 矩阵公式(转置公式+求导公式)
  13. Win7 XP双系统安装
  14. 讲讲电感器的结构、分类及特性!
  15. 下列python语句的输出结果是_下列Python语句的输出结果是 __________ 。 print(数量%4d,单价%3.3f %(100,285.6)) (3.0分)_学小易找答案...
  16. JAVA 获取mac地址
  17. Flutter 使用 ESC/POS蓝牙或以太网库控制热敏打印机
  18. 《O2P卸甲笔记》附录:Oracle XE快速安装
  19. Android检测模拟器
  20. 速算24点java_24点速算游戏 Java 代码

热门文章

  1. 流程DEMO-出差申请单
  2. Happy Women‘s Day I 巾帼设计力,引领新时代!
  3. php mysql 导航制作_超级漂亮网址导航源码,自助链源码(PHP+MYSQL完整版)
  4. POI Excel 上下标、下划线、粗体、斜体标签处理(sup、sub、u、strong、em的HTML标签转化到excel格式)②
  5. EP主机分销源码+详细搭建教程
  6. 在Vue+Element ui 项目中如何使用iconfont(阿里图标库)中的图标
  7. 杰理发射器用于做对讲机【篇】
  8. PMS150C应广单片机开发案例
  9. 招聘要求之一:是个好人
  10. 11、JavaWeb-download文件下载