STM32 如何使用定时器心跳检测串口数据

news/2024/11/17 23:38:26/

目录

原理简介

定时时间

具体代码

定时函数取值范围


原理简介

定时器就是一直隔一段时间会进来处理数据,如果处理串口例如9600波特率,那么就需要每过104us进行检测,定时检测的时间只能比104us时间小,不能大。

如果连续检测到gpio的变化就开始执行别的函数。

(为什么我不用串口中断检测,因为我这边是gpio模拟的串口,工作中很多地方都需要扩展串口)

定时时间

1s = 1000ms = 1000000us

1 / 72MHz = 13. 89ns,72Mhz,

72MHz=72000KHz=72000000Hz相当于1秒中可以记72000000次数

波特率9600 即1s能传输9600个二进制位,即1s = 1000000us ,100000 / 9600 = 104us

(103+1)*(71+1)/72Mhz = 104us ,9600

TIM2_Int_Init(103,71); //(103+1)*(71+1)/72Mhz = 104us ,9600

TIM3_Int_Init(9999,71); //(100)*(71+1)/72Mhz = 100us,T

// 1s = 1000000us

具体代码

void TIM2_Int_Init(unsigned short int arr,unsigned short int psc)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 	TIM_TimeBaseStructure.TIM_Period = arr - 1; 
	TIM_TimeBaseStructure.TIM_Prescaler =psc - 1; 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ; 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);  
}
void TIM2_IRQHandler(void)
{if(TIM_GetFlagStatus(TIM2, TIM_IT_Update) != RESET)//TIM_FLAG_Update	{		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);	if(GPIO_ReadInputDataBit(GPIOB,Gpio_Usart_Rx)){
				gpio_uart_cnt++;if(gpio_uart_cnt >20000)    //计数超过2s一直检测到gpio的高电平,即没有低电平输入{TIM_Cmd(TIM2, DISABLE);     //关闭定时器
					gpio_uart_cnt = 0;        //计时器清零System_reboot();			//系统重启,模块重启等等(这块地方随便放其他函数)}}else                {
				gpio_uart_cnt = 0;            //检测到低电平,就清零计数}  }		}/*初始化函数,初始化gpio和定时器,该函数放main里面*/void Gpio_Usart_Init(void)
{GPIO_Configuration();    //gpio函数初始化自定义这块TIM2_Int_Init(104,72);	//(103+1)*(71+1)/72Mhz = 104us ,9600  												
}

定时函数取值范围

uint16_t TIM_Period; /*!< Specifies the period value to be loaded into the active

Auto-Reload Register at the next update event.

This parameter must be a number between 0x0000 and 0xFFFF. */

0xFFF (hex)= 65535(dec) 即取值范围0~65535


http://www.ppmy.cn/news/4923.html

相关文章

华为数字化转型之道 实践篇 第八章 数字化交易:让做生意简单、高效

第八章 数字化交易:让做生意简单、高效 交易流对于大多数To B企业而言都是核心业务流之一。交易流既包括信息流,它即关乎客户的满意度,又直接影响企业经营业绩的好坏。 To C场景的挑战在于简单的事情如何在短时间内做亿万遍。而To B场景与此恰恰相反,交易的数量没那么多,…

我国盆栽蔬菜行业发展势头向好 未来市场需求将保持持续攀升态势

盆栽蔬菜是指在花盆或其他容器内种植的蔬菜&#xff0c;供人观赏和采摘食用。盆栽蔬菜分为观果类蔬菜、彩色蔬菜、绿叶保健蔬菜、根茎类蔬菜等几类。其中观果类蔬菜包括彩色甜椒、矮生番茄、樱桃番茄、硬果番茄、观赏茄子、小型辣椒、袖珍西瓜及各种南瓜、甜瓜、西葫芦、黄秋葵…

计算机操作系统笔记总结:Part2 进程与线程

文章目录1 进程1.1 进程的概念、组成与特征1.2 进程的状态与转换1.3 进程的组织1.4 进程控制1.5 进程通信2 线程与多线程模型2.1 线程的概念2.2 线程的实现方式2.3 多线程模型2.4 线程的状态与转换3 处理机调度3.1 调度的三个层次3.2 进程的挂起态与七状态模型3.3 进程调度3.3.…

蓝桥杯入门即劝退(十七)最长重复子数组(dp问题)

------持续更新蓝桥杯入门系列算法实例-------- 如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01; 你的点赞、关注、评论、是我创作的动力&#xff01; -------希望我的文章对你有所帮助-------- 前言&#xff1a;今天又回顾了一部分之前写过的算法…

数据结构C语言版 —— 队列+循环队列实现

文章目录队列1.概念2. 生活中队列应用3. 队列的实现初始化队列入队列出队列获取队头元素获取队尾元素获取队列中元素个数判断队列是否为空销毁队列2. 循环队列队列 1.概念 和栈相反&#xff0c;队列(queue)是一种先进先出的线性表&#xff0c;它只允许在一端进行插入&#xf…

Qt扫盲-QTableWidget理论总结

QTableWidget理论总结1. 概述2. QTableWidgetItem 概述3. 表头设置4. 常用功能5. 常用信号6. 槽函数7. 外观1. 概述 QTableWidget 是 Qt 提供的一个简单方便、标准的表格显示类。QTableWidget 中的 单元格数据 由 QTableWidgetItem 显示如果 想要一个使用你自己定义modle 的表…

【云原生进阶之容器】第一章Docker核心技术1.7节——Docker镜像技术剖析

1 容器镜像概述 1.1 什么是镜像 镜像就是一个可执行独立运行的软件包。包含应用运行所必须的文件和依赖包;镜像可以理解为类或者模板,只要在容器的环境下开箱即用; Docker容器与镜像的关系: 1.2 bootfs和rootfs 通常而言,Linux的操作系统由两类文件系统组成:bootfs…

[附源码]Python计算机毕业设计Django医院门诊管理信息系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…