STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置,文章提供原理,代码,测试工程下载。

目录

时钟树与时钟系统:

滴答计时器:

定时器计时中断:

测试结果:

测试工程下载:


 

时钟树与时钟系统:

该系统介绍在 STM32F10x-中文参考手册 P56页开始

微控制器的时钟系统包括以下几个主要的时钟源:

1. HSE(High-Speed External): 外部高速晶振,可接入外部晶振作为系统时钟源。
2. HSI(High-Speed Internal):   内部高速振荡器,提供内部时钟源。
3. PLL(Phase Locked Loop):   锁相环,可以通过将外部时钟源或内部时钟源倍频得到更高的系统时钟频率。

时钟系统的配置和选择可以通过对系统寄存器 RCC(Reset and Clock Control)的相应位进行配置。根据配置的不同,时钟系统可分为以下几个模式:

1. HSI模式:使用HSI作为系统时钟源。
2. HSE模式:使用HSE作为系统时钟源。
3. PLL模式:通过PLL倍频方式产生高频时钟。

1、单片机内部的RC振荡器是8Mhz
2、通过单片机引脚(OSC_IN OSC_OUT)接外部的晶振,这里就对外部的晶振有要求了,要求外部晶振输入频率范围是4Mhz~32Mhz
3、是通过单片机引脚接外部的低速32.768Khz晶振,这个是单独的给内部的实时时钟模块(RTC)使用
4、是内部的低速RC振荡器40K,可以给RTC用,也可以给IWDG看门狗模块用
5、是时钟信号从MCO这个引脚上输出,这个输出可以作为测试,看看内部的时钟配置是否正确,也可以用作和其他硬件进行时钟同步用

如上5种不同类型的时钟,供给不同的需求,内置的RC振荡器受到温度影响会大一些;
这几个外部时钟晶振接口,根据需求使用;也可选择不用,空着,或者接其他电路也可以;
时钟信号进来,还要操作一些相关寄存器 分频/倍频后,才成为"系统时钟SYSCLK"、HSI时钟、HSE时钟等等之类的,应用于单片机各个模块(比如定时器、ADC、USART、APB perpherials、I2C… )

滴答计时器:

#include "SysTick.h"static u8  fac_us=0;							//us延时倍乘数			   
static u16 fac_ms=0;							//ms延时倍乘数//初始化延迟函数
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void SysTick_Init(u8 SYSCLK)
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8;					fac_ms=(u16)fac_us*1000;				   
}								    //延时nus
//nus为要延时的us数.		    								   
void delay_us(u32 nus)
{		u32 temp;	    	 SysTick->LOAD=nus*fac_us; 					//时间加载	  		 SysTick->VAL=0x00;        					//清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;	//开始倒数	  do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));		//等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	//关闭计数器SysTick->VAL =0X00;      					 //清空计数器	 
}//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864 
void delay_ms(u16 nms)
{	 		  	  u32 temp;		   SysTick->LOAD=(u32)nms*fac_ms;				//时间加载(SysTick->LOAD为24bit)SysTick->VAL =0x00;							//清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;	//开始倒数  do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));		//等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	//关闭计数器SysTick->VAL =0X00;       					//清空计数器	  	    
} 

定时器计时中断:

查表可知,TIM2/3/4是适合作通用定时器的:

 此处我以初始化定时器4为通用定时器举例:

计数器溢出频率:   

CK CNT_OV= CK CNT   /    (ARR+1)

                     =  CK PSC  /    (PSC +1)  /  (ARR +1) 

这里的计数器溢出频率单位是赫兹,计数器溢出频率的倒数就是定时器触发的时间周期,一般我们计算用的是下面一个等于号的式子,这里的符号表示如下:

CK_PSC 一般为72Mhz(72 00 000)

ARR 自动重装 对应变量TIM_Period 范围0~65535

PSC 分频  对应变量 TIM_Prescaler 范围0~65535

1. 定时器时钟分频(TIMx_PSC)

是用来将系统时钟(通常为主频)分频为定时器的时钟频率。例如,如果系统时钟为72MHz,定时器时钟分频设置为72-1,则定时器时钟频率为1MHz。定时器时钟分频越大,定时器的时钟频率越低。

2. 预分频(TIMx_ARR)

是用来设置定时器溢出时间(自动重装载寄存器值)的参数。当定时器计数器达到预分频值时,定时器将溢出,并产生中断或其他相关事件。预分频的值决定了定时器溢出时间的长度。例如,如果预分频值为1000,定时器时钟频率为1MHz,则定时器溢出时间为1ms。

 

以下为初始化定时器  2  作定时中断,周期为1ms :

每次进入定时中断都会通过串口1 打印一次进入中断的总次数T:

#include "TIMER_init.h"//初始化定时器2用作计时中断定时器:
void Timer2_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_InternalClockConfig(TIM2);//选择哪个中断就写哪个TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //修改分频,对实际情况影响不大,可以不修改,这里是不分频(可选1~72)TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上对齐模式,同时还有向下对齐,中央对齐模式TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;							  //计数器周期。该参数决定了计数器计数溢出前的最大值。TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;							//分频器预分频系数。该参数决定了计数器时钟频率的变化程度。TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //高级计数器需要,不需要用到的直接给0就好TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);TIM_ClearFlag(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_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;       //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;              //响应优先级NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2, ENABLE);}

定时中断服务函数:

#include "TIMER_init.h"uint16_t T;void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){printf("T=%d",T);T++;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中断寄存器标志位,用于退出中断}
}

测试结果:

 

测试工程下载:
https://download.csdn.net/download/qq_64257614/88202750?spm=1001.2014.3001.5503

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/31689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习、深度学习项目开发业务数据场景梳理汇总记录五

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

Vue [Day6]

路由进阶 路由模块的封装抽离 src/router/index.js import VueRouter from vue-router // 用绝对路径的方式来写目录 相当于src import Find from /views/Find import Friend from ../views/Friend import My from ../views/Myimport Vue from vue Vue.use(VueRouter)con…

2023年加湿器市场数据分析(天猫数据分析怎么做)

随着人们生活水平提高、空调广泛使用&#xff0c;导致皮肤紧绷、口舌干燥、咳嗽感冒等空调病的滋生。可以看出&#xff0c;空气湿度与人体健康以及日常生活有着密切的联系。而加湿器作为室内空气湿度控制的重要工具&#xff0c;在近年来受到了越来越多的重视。根据鲸参谋电商数…

Godot 4 源码分析 - 文件读入编码处理

今天需要读入xml文件进行处理&#xff0c;结果读入一个带中文的文件时&#xff0c;出错了。当然程序还能运行&#xff0c;但编译器一直报错&#xff0c;而且XML解析也不正确 单步调试发现读入的内容出现乱码&#xff0c;具体逻辑&#xff1a; String FileAccess::get_as_text…

物联网与5G引领智慧城市时代的到来

智慧城市需要依赖于多种技术&#xff0c;这些技术的应用将城市转变为高效、智能、可持续发展的现代化城市。智慧城市是基于信息技术、物联网和大数据等先进技术的融合&#xff0c;旨在提升城市的运行效率、资源利用效率和居民生活质量。以下是智慧城市需要依赖的主要技术&#…

Kafka3.4 SASL/kerberos/ACL 证以及 SSL 加密连接

Kafka3.4 SASL/kerberos ACL 证以及 SSL 加密连接 序 前面我们使用 kafka3.3.1 on zookeeper 的模式进行多网段监听的 kafka 集群&#xff0c;顺便搭建起 kafkaui 后发现一些问题&#xff0c;我们 kafka 集群没有连接认证&#xff0c;万一谁知道了我们的 kafka 连接地址&…

PHP智能人才招聘网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP智能人才招聘网站 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88199392 视频演示 PH…

Linu网络服务NFS

linux网络服务NFS 一.NFS简介二.NFS原理三.NFS优势四.配置文件五.NFS共享存储服务的操作步骤 一.NFS简介 NFS&#xff08;网络文件服务&#xff09; NFS是一种基于tcp/ip传输的网络文件系统协议&#xff0c;最初由sun公司开放通过使用NFS协议&#xff0c;客户机可以像访问本地…

【react】react中BrowserRouter和HashRouter的区别:

文章目录 1.底层原理不一样:2.path衣现形式不一样3.刷新后对路山state参数的影响4.备注: HashRouter可以用于解决一些路径错误相关的问题 1.底层原理不一样: BrowserRouter使用的是H5的history API&#xff0c;不兼容IE9及以下版不。 HashRouter使用的是URL的哈希值。 2.path衣…

(6)将Mission Planner连接到Autopilot

文章目录 前言 6.1 设置连接 6.2 故障处理 6.3 复合连接的故障处理 6.4 相关话题 前言 本文解释了如何将 Mission Planner 连接到自动驾驶仪上&#xff0c;以便接收遥测数据并控制飞行器。 &#xff01;Note 对于已有 ArduPilot 固件的安装&#xff0c;或没有现有 Ardu…

监控Kubernetes Node组件的关键指标

所有的 Kubernetes 组件&#xff0c;都提供了 /metrics 接口用来暴露监控数据&#xff0c;Kube-Proxy 也不例外。通过 ss 或者 netstat 命令可以看到 Kube-Proxy 监听的端口&#xff0c;一个是 10249&#xff0c;用来暴露监控指标&#xff0c;一个是 10256 &#xff0c;作为…

el-dialog嵌套,修改内层el-dialog样式(自定义样式)

el-dialog嵌套使用时,内层的el-dialog要添加append-to-body属性 给内层的el-dialog添加custom-class属性,添加自定义类名 <el-dialog:visible.sync"dialogVisible"append-to-bodycustom-class"tree-cesium-container"><span>这是一段信息<…

【数学建模】--因子分析模型

因子分析有斯皮尔曼在1904年首次提出&#xff0c;其在某种程度上可以被看成时主成分分析的推广和扩展。 因子分析法通过研究变量间的相关稀疏矩阵&#xff0c;把这些变量间错综复杂的关系归结成少数几个综合因子&#xff0c;由于归结出的因子个数少于原始变量的个数&#xff0c…

python与深度学习(十六):CNN和宝可梦模型二

目录 1. 说明2. 宝可梦模型的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 数据处理和归一化2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章宝可梦模型训练的模型…

第一百二十三天学习记录:C++提高:STL-vector容器(下)(黑马教学视频)

vector插入和删除 功能描述&#xff1a; 对vector容器进行插入、删除操作 函数原型&#xff1a; push_back(ele); //尾部插入元素ele pop_back(); //删除最后一个元素 insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele insert(const_iterator pos, int cou…

2023 RISC-V中国峰会 安全相关议题汇总

目录 1、The practical use cases of the RISC-V IOPMP 2、构建安全可信、稳定可靠的RISC-V安全体系 3、Enhancing RISC-V Debug Security with hardware-based isolation 4、Closing a side door: Designing high-performance RISC-V core resilient to branch prediction…

2023年第2季社区Task挑战赛升级新玩法,等你来战!

第1季都有哪些有趣的作品&#xff1f; 在大家的共建下&#xff0c;FISCO BCOS开源生态不断丰富完善&#xff0c;涌现了众多实用技术教程和代码&#xff1a;基于数字身份凭证的业务逻辑设计&#xff0c;贡献了发放数字身份凭证的参考实现&#xff1b;提供企业碳排放、慈善公益等…

Mac unsupported architecture

&#xff08;瓜是长大在营养肥料里的最甜&#xff0c;天才是长在恶性土壤中的最好。——培根&#xff09; unsupported architecture 在mac的m系列芯片中容易出现此类问题&#xff0c;因为m系列是arm64的芯片架构&#xff0c;而有些nodejs版本或npm包的芯片架构是x86的&#x…

【脚踢数据结构】

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…

vi 编辑器入门到高级

vi 编辑器的初级用法vi 编辑器的工作模式1. 命令模式2. 文本输入模式3. 状态行vi 工作模式切换存储缓冲区 vi 编辑器命令1. 启动 vi2. 文本输入3. 退出 vi4. 命令模式下的 光标移动5. 命令模式下的 文本修改6. 从 命令模式 进入 文本输入模式7. 搜索字符串8. vi 在线帮助文档 v…