我们前面已经学过了滴答定时器,那么定时器的原理与它一样,只不过滴答定时器是在内核中的定时器,而定时器是片上外设。

定时器分为:基本定时器通用定时器

而基本定时器所拥有的功能,通用定时器都有。所以,通用定时器内集成了基本定时器。

定时器作用:产生一个精准的定时

stm32f03中基本定时器为TIM6和TIM7:

​​​​​​​​​​​​​​

16位预分频器:将输入进来的72Mhz进行预分频,但是它是16位的,所以它的分配系数范围为1~65535。

16位自动重装载累加器:用来装载我们设置的计数值。当16位计数单元计数完后,它就将设置的计数值传给计数单元,让计数单元重新开始计数。

16位计数单元:它的内部就是定时器计数的过程,即从计数值开始计数。其内部的数值是变化的。

定时器的计数值设置:

我们用定时器来定时1s,那么这个计数值我们应该设置为多少?

先来设置16位预分频的分频系数,我们设置为7200。

所以  =  10000HZ,经过预分频后72Mhz变成了10000hz

所以,T =    =  ,即:在10000hz频率下,计数10000次,需要花费1s的时间。换而言之就是,在10000hz频率下,想要延时1s就需要计数10000次。所以,此时计数值我们设置为10000。

所以,计算值设置为多少,需要先知道预分频的系数,才能计算出来。

库函数:

 计数模式:

向上计数:从0计数到计数值

向下计数:从计数值计数到0

中央对模式1:从0计数到计数值 又 从计数值计数到0

中央对模式2:从计数值计数到0 又 从0计数到计数值

中央对模式3:与中央对模式2一样。

定时器中断源:

TIM_IT_Update  更新中断:即计数值计数完了,溢出了,此时产生中断。也就是计数溢出中断。注意:只有这个中断源是基本定时器的,其他的都是通用定时器的。

标志位: 

TIM更新标志位:计数器计数溢出后,该标志位置SET,但是是否此时产生中断它是不会去管的。注意:只有这个标志位是基本定时器的,其他的都是通用定时器的。

清除标志位。

计数器计数溢出后,产生中断时,该标志位置SET。

清除标志位。

编程步骤:

基本定时器产生1s延时,编程步骤:
        1》打开时钟-----TIM6 
        2》初始化定时器6
            ----自动重装载累加器的值
            ----预分频器的值
        3》配置中断源-----计数器溢出时,产生定时器中断
        4》配置中断优先级----NVIC初始化
            ----中断通道号----stm32f10x.h
            ----主优先级 
            ----次优先级 
            ----使能 
        5》编写中断服务函数
            void TIM6_IRQHandler(void)
            {
                if(SET==TIM_GetITStatus(TIM6,TIM_IT_Update)){
                    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
                    ledflag=~ledflag;
                }
            }
            
        6》使能定时器6

编写程序:

//定时器每定时1秒钟,就进入定时器中断

void TIM6_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
    NVIC_InitTypeDef  NVIC_InitStruct;
    //  1》打开时钟-----TIM6 
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM6, ENABLE);

// 2》初始化定时器6
    TIM_TimeBaseInitStruct.TIM_Period     =10000;
    TIM_TimeBaseInitStruct.TIM_Prescaler  =7200-1;
    TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct);

// 3》配置中断源-----计数器溢出中断
    TIM_ITConfig(TIM6, TIM_IT_Update,ENABLE);

// 4》配置中断优先级----NVIC初始化
    NVIC_InitStruct.NVIC_IRQChannel   =TIM6_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority        =2;
    NVIC_InitStruct.NVIC_IRQChannelCmd                =ENABLE;
    NVIC_Init(&NVIC_InitStruct);

// 6》使能定时器6
    TIM_Cmd(TIM6,ENABLE);
}

中断服务函数:

void TIM6_IRQHandler(void)
{
    if(SET==TIM_GetITStatus(TIM6,TIM_IT_Update)){
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
        ledflag=~ledflag;
    }
}

uint8_t ledflag=0;

int main(void)
{
    LED_Config();
    RCC_ConfigTo72M();//将系统时钟配置成72MHZ 
    Systick_Config(72);
    TIM6_Config();
    // 4,如果是程序的第一个中断,需要设置优先级分钟
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

while(1){

if(0==ledflag){
            LED_CTRL(LEDR,LED_OPEN);
        }else{
            LED_CTRL(LEDR,LED_CLOSE);
        }

}
}

在配置的过程中,出现的问题:

问题1:在配置TIM_TimeBaseInitTypeDef结构体时,我们发现该结构体里面多了一个成员。如下图红色框:

仔细一看注释才发现,该成员是用于TIM1和TIM8通用定时器的。所以,我们在配置的时候,又疑问,需要学会先查看注释。

该成员的作用:

还记得前面滴答定时器中1864的问题吗?这个就是解决类似1864问题的系数。当它为2的时候,计数器需要计数溢出两遍,才会产生中断。当它为3的时候,计数器需要计数溢出三遍,才会产生中断,以此类推。

问题2:为什么预分频器的分频系数设置需要减1?

这个是基本定时器中预分频器的寄存器,我们可以看到红框中有一个+1,也就是说我们给该寄存器设置一个16位的值放在PSC[15:1]中,但是硬件会自动再加1。其目的就是防止有人将PSC[15:1]中的值设置为0。因为,由前面可知:分配系数范围为1~65535(即1~0xffff)而不是0~65535。所以,一旦有人设置为0,那么PSC[15:1]中的值实际上是1。

所以我们设置PSC[15:1]中的值为7200,实际上PSC[15:1]中的值为7200+1 = 7201,但是我们想要的是7200,所以需要-1。所以,我们设置为7200-1 = 7199;此时PSC[15:1]中的值会自动加1,其值为7199+1 = 7200。

问题3:如果我们想再不改变预分频系数和计数值的情况下:每过5秒才改变小灯状态,而不是每过1s就改变小灯状态,那么怎么办?

我们可以修改中断服务函数:当i等于5时,再进入if中去改变小灯状态

中断服务函数:

void TIM6_IRQHandler(void)
{

static int i = 0;
     if(i == 5){

if(SET==TIM_GetITStatus(TIM6,TIM_IT_Update)){
                TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
                ledflag=~ledflag;

i = 0;
        }

}

i++;

}

stm32f103——基本定时器与定时器中断相关推荐

  1. 32 引脚_函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波

    void Time0_serve(void ) interrupt 1 using 1 { TH0=(8192-C)/32;     //可证明这是13位计数器TH0高8位的赋初值方法 TL0=(81 ...

  2. 从单片机到嵌入式开发——(6) 定时器与串口中断

    在上文中我们讲到了基本的中断定义和外部中断的使用方法.本篇将继续介绍另外两种常见的中断,也即定时器中断和串口中断. 标准的51单片机有5个中断源:两个外部中断.两个定时器/计数器中断.具体如下: 优先 ...

  3. MSP430f5529定时器,定时器中断

    MSP430f5529定时器,定时器中断[以TIMERA为例] 前言 功能概述 定时器启动方式 寄存器介绍 16位定时/计数器TAxR(TimerA Register) 定时器控制寄存器TAxCTL( ...

  4. 51单片机入门——定时器与外部中断

    目 录 1. 定时器 1.1. 定时器的初步认识 1.2. 定时器的寄存器 1.3. 定时器的应用 2. 外部中断 2.1. 中断的背景 2.2. 定时器中断的应用 2.3. 中断的优先级 1. 定时 ...

  5. 【STM32F103】嘀嗒定时器(Systick)_延时函数

    STM32嘀嗒定时器--延时函数 一 系统Systick定时器 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值.只要不把它 ...

  6. STM32定时器-基本定时器

    STM32定时器-基本定时器 实验芯片:STM32F103 更新日期:2021年8月17日 声明:部分图文来自互联网公开资料,转载注明出处 一.基本定时器简介 TIM6和TIM7是一个16位向上递增的 ...

  7. spring 定时器设置停止_单片机MSP430入门-理论⑦--定时器模块-定时器A②

    单片机MSP430入门-理论⑦--定时器模块-定时器A② 上期大概给大家汇总介绍了,定时器模块中比较重要并且常用的定时器A,大概说了下定时器A的两种常用模式,比较模式和捕获模式 本期将继续介绍定时器A ...

  8. 定时器0 定时器2波特率发生器 AD转换

    /***定时器0 定时器2波特率发生器 AD转换***/ /***程序测试 2021 3 19*******************/               #include     " ...

  9. GD32定时器——单个定时器下多个通道PWM捕获

    GD32定时器--单个定时器下多个通道PWM捕获 文章目录 GD32定时器--单个定时器下多个通道PWM捕获 背景 方案实现 代码 问题 背景 目前在GD32上开发,由于IO资源不足,需要在一个定时器 ...

  10. STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,定时计数模式下总结

    STM32定时器配置(TIM1.TIM2.TIM3.TIM4.TIM5.TIM8)高级定时器+普通定时器,定时计数模式下总结 文章结构: --> 一.定时器基本介绍 --> 二.普通定时器 ...

最新文章

  1. C语言程序设计省二考试,浙江省高校计算机等级考试大纲(二级——C语言程序设计大纲)(...
  2. 计算机音乐乐谱再也没有,再也没有简谱-Ryan.B/杨佬叁演唱-孙世彦制谱
  3. 正则表达式中关于字符集的问题
  4. 半导体物理与器件pdf施敏_SiC半导体材料的基本性质和应用
  5. 开机动画适配方案_小米CC开机动画首曝光:7月2日在北京水立方发布
  6. 谷歌AI生成视频两连发:720p高清+长镜头,网友:对短视频行业冲击太大
  7. 关于EditPlus3 取消备份后再重新打开 备份设置还原到默认状态的问题
  8. altium PCB文件瘦身
  9. linux命令一个减号,linux shell环境减号-的用途
  10. 一款基于Vue的自适应Web在线音乐播放器
  11. jump-game-ii
  12. 从 “ 我爱你 ” 到 “ 我爱钱 ”
  13. 伯努利朴素贝叶斯【机器学习算法一朴素贝叶斯2】
  14. html 设置元素向左浮动
  15. 视角设置(第一人称、第三人称)
  16. RPA自动化办公07——Uibot流程加入python插件
  17. 【AM】JDI-T: Jointly Trained Duration Informed Transformer for Text-To-Speech without Explicit Align
  18. 【读书笔记】用Python获取A股行情数据的4种方法
  19. 读书笔记--项亮《推荐系统实践》第三章
  20. IOS8中屏幕旋转问题解决

热门文章

  1. Nginx正反向代理的具体步骤讲解
  2. activiti-会签任务
  3. Linux系统mysql 查看当前使用的配置文件my.cnf的方法
  4. 北大三日游游记(北大信科暑期课堂)
  5. Global Tracking Transformers
  6. 易语言让我逆天改命--李长茂(紫川秀)————【Badboy】
  7. Derek Sivers:砍掉一切没有惊讶感的内容(译)
  8. 服务器网卡相关知识点
  9. Git vs GitHub –什么是版本控制及其工作方式?
  10. 电商平台违规“二清”,将面临哪些处罚?