综述

STM32的新手,一般都会对一个问题很纠结。我也是,就是所谓的”时钟问题“。我们在尽心STM32编程时,会痛苦地发现这样一个事实:不管你要干嘛,你首先要做的一件事就是使能时钟。而且可能每一次的时钟还是不同的。 
           你就会问:为什么要使能时钟?为什么每次使能的时钟还不一样呢?为什么51单片机中没有这些鬼?在学51单片机的时候,基本上接触不到I/O方向和外设时钟的概念,I/O想输入就直接读,想输出就直接赋值,串口、AD转化、外部中断等等也都是想用就用,不需要单独配置时钟。这样在初学时的确方便了很多,不需要有乱七八糟的设置就能让芯片跑起来,但是随之带来的就是所谓的功耗问题。但是作为初学者,谁还管这个啊?能让程序跑起来就已经让我们兴奋得几个晚上睡不着觉了。说这话不太合适,但事实上很多芯片生产厂商也不考虑这个问题。 
            可是随着电子产品集成度越来越高,功耗和发热越来越严重,芯片厂商非常无奈也在开始想办法避免这个问题,而最直接的思路当然就是用多少功能就使能多少功能,对每个外设的时钟都设置了开关,让用户可以精确地控制,关闭不需要的设备,达到节省供电的目的。如果不用的就完全关闭,尽可能降低芯片功耗,所以就出现了这么多的时钟和IO配置。说白了,时钟的功能就好像是一个小开关,你要用什么寄存器就先对应的打开开关,即:使能对应的时钟。 
实际上,在这里面还涉及到一个时钟门控技术,而这又涉及到同步电路,我们都知道(默认你们都知道)在同步电路中总是有一个时钟控制。这里我就不赘述了,如果你和我一样是一个强迫症患者,请你回去翻翻一本叫《数字电子技术基础》的书,你一定可以找到答案的,相信我吧。 
           到这里你就差不多能够理解为什么STM32编程需要不断地使能时钟了,因为默认情况下这些时钟都是disable的。你要使用它,当然需要enable了。因为:寄存器是由D触发器组成的,只有送来了时钟,触发器才能被改写值,这样寄存器才能工作。只不过,在51单片机一个时钟系统把一切都包了,在STM32中,我们很明确地做好了分工,让大家各司其职,其实这样还有一个好处就是,不是每个外设都需要系统时钟那么高的频率,就好像是:哪个公司会让CEO去做底层代码工作一样。

STM32有好多时钟主要应用的有以下几种:

一、 STM32 通用定时器简述

①STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 
②、STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能包括: 
1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。 
2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~ 
65535 之间的任意数值。 
3)4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: 
A.输入捕获 
B.输出比较 
C.PWM 生成(边缘或中间对齐模式) 
D.单脉冲模式输出 
4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外 
一个定时器)的同步电路。 
5)如下事件发生时产生中断/DMA: 
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 
C.输入捕获 
D.输出比较 
E.支持针对定位的增量(正交)编码器和霍尔传感器电路 
F.触发输入作为外部时钟或者按周期的电流管理 
由于 STM32 通用定时器比较复杂,这里我们不再多介绍,请大家直接参考《STM32 参考 
手册》第 253 页,通用定时器一章。

二、 systick定时器简述

systick 定时器是包含在 Cortex-M3 内核里面,它是捆绑在 NVIC 中。它 
是 24 位倒计数的定时器,当定时器计数到 0 的时候,将从 RELOAD 寄存器中自动重 装定时器初值,如果开启中断的话,同时它还是产生异常中断信号。 我们知道,定时器还必须要有一个时钟来驱动,而 systick 定时器的时钟来源 是来自系统时钟,不过它的时钟可以选择成直接取自系统时钟,还可以将系统时 钟8 分频之后再赋给 systick 定时器。一般用来设计精准延时函数。

三、通用定时器初始化

    初始化函数
/****************************************

* 函 数 名 : time_init 
* 函数功能 : 定时器 3 端口初始化函数 
* 输 入 : 无 
* 输 出 : 无 
**************************************/

void time_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //声明一个结
构体变量,用来初始化 GPIO
NVIC_InitTypeDef NVIC_InitStructure;
/* 开启定时器 3 时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除 TIMx 的中断待处理位:TIM 中断源
TIM_TimeBaseInitStructure.TIM_Period = 2000;//设置自动重装载寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 35999;//设置用来作为 TIMx时钟频率预分频值,100Khz 计数频率
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;//TIM 向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_Cmd(TIM3,ENABLE); //使能或者失能 TIMx 外设
/* 设置中断参数,并打开中断 */
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE ); //使能或者失能指定的TIM 中断
/* 设置 NVIC 参数 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //打开 TIM3_IRQn 的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为 1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
2) 定时器中断 函数
void TIM3_IRQHandler() //定时器 3 中断函数
{static u8 i=0;TIM_ClearITPendingBit(TIM3,TIM_IT_Update);GPIO_Write(GPIOC,(u16)~(0x01<<i++));if(i==8)i=0;
}0

四、systick定时器初始化

core_cm3.h 的 1694 行的位置定义了 Systick_Config()的初始化函数

《二》STM32时钟使能及应用总结相关推荐

  1. STM32片上外设时钟使能、失能和复位的区别

    置顶/星标公众号,不错过每一条消息! 今天分享的关于时钟知识,可能很多人没有在意过.这也是之前有朋友问过的问题,这里就简单给大家普及一下吧. 1 RCC时钟说明 在STM32参考手册中,都有Reset ...

  2. STM32填坑:时钟使能必须在外设初始化之前

    最近在STM32上写了一份串口通信的程序,但下载复位后串口却不能工作,初始化的代码如下: //发送/接收的GPIO.串口和中断的初始化结构体 GPIO_InitTypeDef GPIO_InitStr ...

  3. 初涉STM32之浅谈时钟使能问题

    作为一个STM32的菜鸟级人物,我刚开始接触STM32时,其实和当年开始学习51单片机的心理是一样的.茫然,谁说不是呢?但是,正常的学习途径无非就是看书,然后敲代码,最后烧程序,有问题就check,然 ...

  4. STM32时钟配置方法详解

    一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率 ...

  5. STM32时钟源时钟系统配置

    一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率 ...

  6. STM32 时钟系统

    STM32时钟系统的基本概念 概念及意义 (1)概念:时钟系统是由振荡器(信号源).定时唤醒器.分频器等组成的电路.常用的信号源有晶体振荡器和RC振荡器. (2)意义:时钟对数字电路而言非常重要,没有 ...

  7. STM32——时钟系统

    STM32--时钟系统 宗旨:技术的学习是有限的,分享的精神是无限的. 一.时钟树 普通的MCU,一般只要配置好GPIO 的寄存器,就可以使用了.STM32为了实现低功耗,设计了非常复杂的时钟系统,必 ...

  8. 2021.4.14 第四次 STM32时钟系统

    STM32时钟系统 一. STM32时钟系统介绍 二. 时钟系统框图 三. 时钟配置相关函数 1.1 时钟系统介绍: 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令.STM32本身 ...

  9. STM32 时钟与外设总线

    声明:本篇为转载,侵删 一.概括 首先,说点不靠谱的,APB和AHB总线,我个人感觉这个类似于个人PC系统里的北桥和南桥总线. 南桥总线上挂接的都是鼠标.键盘这些慢速的设备,北桥上挂接显卡等高速设备. ...

最新文章

  1. 基于复杂方案OWSAP CsrfGuard的CSRF安全解决方案(适配nginx + DWR)
  2. OS_CORE.C(1)
  3. 使用Let`s encrypt 免费的https 证书
  4. @ConfigurationProperties注解的使用与@Value的使用
  5. 如何使用 TRACERT 解决 Windows 中的 TCP/IP 问题
  6. MybatisPlus实现逻辑删除
  7. Ubuntu镜像下载地址
  8. 前端学习(3215):类的编写
  9. 二分法(leetcode分类解题,C++代码详细注释)
  10. 用友U8固定资产总账重算语句
  11. c语言回溯算法数独,数独回溯算法
  12. 使用Struts之ActionForm
  13. IP is locked 的解决办法 Vivado
  14. 寄存器、缓存、内存、硬盘、存储器
  15. Manjaro-architect 安装指南
  16. python画代码雨
  17. java毕业设计开题报告怎么写 如何写好一篇论文开题报告
  18. 在阿里,新人如何快速上手项目管理?
  19. unity----lua调用c#之lua调用c#中的数组,list,字典
  20. 计算机不联网怎么计时,电脑为什么在断网后仍能准确显示时间?

热门文章

  1. python两两组合_求数组中两两相加等于20的组合(Python实现)
  2. 基于arduino的灯光控制(easy版)
  3. python3下的webpy运行详解——webpy,session,cookie
  4. 少儿编程scratch -- 基础篇
  5. 《Metasploit魔鬼训练营》环境搭建与前两章经历体会
  6. 4th 【最小生成树并查集】征兵
  7. AAAI 2023 | 基于联合学习与用户传播行为的虚假新闻早期检测
  8. 【Hive任务优化】—— Map、Reduce数量调整
  9. 阿里数据仓库-数据模型建设方法总结(全)
  10. 新华三智慧计算联盟,集结!