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

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. 有监督排序—LDA分析、作图及添加置信-ggord
  2. Android Stadio配置了gralde的本地路径,但是windos 命令行还是会下载gradle
  3. 算法笔记-判断链表保存的字符串是否是回文
  4. 《程序设计与数据结构》第6周学习总结
  5. 苹果电脑删除软件_软件自动开启很烦人?如何彻底关掉开机自动开启的应用程序...
  6. Hadoop点滴-HDFS命令行接口
  7. 由浅到深理解ROS URDF教程
  8. python中的生产者与消费者模式
  9. 双向tvs和单向tvs_TVS的完整形式是什么?
  10. Android手机通讯录解析
  11. L2-028 秀恩爱分得快-PAT团体程序设计天梯赛GPLT
  12. 省市区三级联动菜单(附数据库)
  13. org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback not org.apache.hadoop.security.Grou
  14. 有符号数的二进制表示方式
  15. 【微信小程序】发布流程及发布审核时如何提供测试账号?
  16. 幼儿园小班下学期班级工作计划
  17. 如何解决Win10删除文件慢的办法
  18. 嵌入式技术学习总结二
  19. 闪电网络一周热点回顾-AToken研究院
  20. BI PUBLISHER RTF模板制作PIVOT表和重分组

热门文章

  1. 网上做什么赚钱现在,这4个赚钱小项目分享给你!
  2. vue项目中集成腾讯TIM即时通讯(附源码)
  3. (39)uniGUI for Delphi 扫描二维码
  4. 真正免费的PDF转Excel在线转换
  5. 如何利用博客评论做外链而不被删除
  6. Matlab 绘制函数切线(annotation函数法)
  7. 计算机主板上的部件有哪些,主板上各部件有哪些
  8. android 百度名片
  9. 杰里之用于做对讲机【篇】
  10. 高精度乘法(高精×低精)