stm32f103——基本定时器与定时器中断

发布者:温柔阳光最新更新时间:2022-09-29 来源: csdn关键字:stm32f103  基本定时器  定时器中断 手机看文章 扫描二维码
随时随地手机看文章

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


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


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


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


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


 

 

 

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


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


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


定时器的计数值设置:

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


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


所以frac{72000000}{7200} =  10000HZ,经过预分频后72Mhz变成了10000hz


所以,T =frac{1}{f} =frac{1}{10000},即:在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  基本定时器  定时器中断 引用地址:stm32f103——基本定时器与定时器中断

上一篇:stm32f103——通用定时器输出PWM
下一篇:stm32f103——外部中断和事件——检测按键按下点灯

推荐阅读最新更新时间:2024-11-13 14:50

STM32F103利用模拟I2C驱动ADS1115
ADS1115通过模拟I2C驱动:(部分代码借鉴了网络上的几个,并且根据引脚进行了配置,都没有运行成功,今天调了一天,终于在晚上调了出来) 注意:本部分代码需要只是ADS1115的部分程序(一些用到的数组在此没有写),模拟II2C的各程序并未给出,大家根据需要进行裁剪,代码完全开源,希望能帮到大家,也希望大家乐于分享。 调试时需特别注意I2C的通信问题,特别是应答信号的使用需要特别关注,本人的程序之前出错全是因为从机的应答信号的未使用造成。 如有其它问题,欢迎指正批评,第一次写博客,感谢! 收获:对于I2C通信协议的理解更加深刻,对ADS1115也能进行单通道的使用。I2C的开始、发送/读写、应答、结束等一定要
[单片机]
PIC单片机-利用Timer2定时器的溢出中断实现动态扫描数码管
编写程序,令数码管的显示顺序为:0123,1230,2301,3012。 数码管显示分静态扫描和动态扫描,动态扫描显示一般分两种方式 1、选用一个数码管位,写断码显示,延时一定的时间,关闭显示,选择下一位,依次类推,完成数码管的多位扫描显示,这种方式比较耗CPU资源。 2、利用定时器,每隔一个固定的时间去选通,写断码,这种方式可以降低CPU的占用时间,同时,每个数码管显示时间固定,不存在“抖”的现象。 本程序中使用第二种方式,利用Timer2定时器的溢出中断实现动态扫描,Timer2包含一个周期控制寄存器,可以自动控制溢出周期。周期控制寄存器PR2的存在使得TIMER2的计数值有一个可以自由设定的上限。当TIMER
[单片机]
STM32定时器的分类及中断原理
本文主要介绍常规定时器中的TIM3,实现定时器中断的功能。STM32定时器的分类在其中一篇文章中已经介绍过,本文主要内容主要介绍定时器的基础功能-定时器中断,对于STM32定时器分类简单复习一下。 一、STM32定时器的分类 1.1 按照内核、外核、特定、常规分为4大类: 1)内核定时器:Systick 2)外设定时器:特定应用定时器+常规定时器 3)特定应用定时器:LPTIM,RTC,WTD,HRTIM 4)常规定时器:基本定时器TIM6&TIM7)、通用定时器(TIM2TIM5,TIM9TIM14)、高级定时器(TIM1&TIM8) 1.2 CPU时序 此处我们提一下学习单片机原理的课程时,提到的几个CPU时序。
[单片机]
STM32<font color='red'>定时器</font>的分类及<font color='red'>中断</font>原理
PIC16F877A例程--定时器中断
#include pic.h //调用头文件 //#include pic1687x.h __CONFIG(0x3F32); //芯片配置字 #define uchar unsigned char #define uint unsigned int void initPORTA(void); void initTMR2(void); void interrupt TMR2INT(void); uint TMR2_COUTER; uint couter; void main (void) { TRISA=0X00; PORTA=0XFF; //定
[单片机]
MSP430G2553定时器中断实验
/////////////////////////////////////////////////////////////////// // msp430G2553的定时器中断控制LED每秒钟进行亮熄变化 /////////////////////////////////////////////////////////////////// #include void led_init(); void timer_init(); void delay(int); //---------------------------------- void led_init() { P1DIR|=(1 6); //P1.6为LED }
[单片机]
xs128 定时器溢出中断
#include includes.h uint32 counter = 0; /*********************************************************** ** 名 称:void ECT_Time(void) ** 功 能:定时器 ** 入口参数:无 ** 出口参数:无 ** 使用说明:100ms定时 ************************************************************/ void ECT_Time(void) { //定时器使能 TSCR1_TEN = 1; //定时器溢出中断使能 TSC
[单片机]
单片机的定时器中断寄存器
中断是为使单片机具有对外部或内部随机发生的事件进行处理而设置的。51单片机有5种中断源,即有5种对应的情况发生时会使单片机去处理中断程序(中断函数)。 此篇主要整理定时器中断笔记。采用定时器中断会涉及中断寄存器,定时器/计数器相关寄存器(TCON,TMOD),中断函数等知识点。 其中,中断寄存器,定时器/计数器相关寄存器本身或者相关位用来做初始化,中断函数的内容主要是体现发生中断后所需要的操作(在中断函数内写代码)。 1.中断允许寄存器IE 图1.中断寄存器IE 中断寄存器用来设定各个中断源的打开和关闭,IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H~AFH,该寄存器运行位寻址
[单片机]
单片机的<font color='red'>定时器</font><font color='red'>中断</font>寄存器
STM32F103ZET6 — ADC
介绍 STM32F103ZET6 拥有12位ADC,是一种逐次逼近型模拟数字转换器。 12bits ADC 代表了 ADC 的转换精度。存在输入参考电压的情况下,ADC 将模拟信号经信号线输入,进行模拟信号的采样,再将采样后的数字信号存放于数据寄存器中,以供软件进行读取(CPU或者DMA方式),存储的数据是经过参考电压比较后,按照12bits 进行换算得到。 ADC输入范围:Vref- ≤ Vin ≤ Vref+ ADC 时钟 ADC 的输入时钟 ADCCLK 不能超过 14MHz(Datasheet规定)它是由PCLK2经分频产生。 转换模式 支持单次转换和连续转换,顾名思义,单次转换就仅仅只进行一次转换,然后就
[单片机]
<font color='red'>STM32F103</font>ZET6 — ADC
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved