STM32定时器的研究

发布者:夜色迷离最新更新时间:2016-10-12 来源: eefocus关键字:stm32  定时器 手机看文章 扫描二维码
随时随地手机看文章
一直想写个什么计数方面的文章,但是自己的水平有限,一直写不出来,但是这个还是凑合着写吧!!!以前也看过STM32的定时器的,但是感觉还是在一个很模糊的状态,这次就当是自己学习写技术文章的个写作。

 

一、对于STM32中断优先级的概念的理解

STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。

1. 何为占先式优先级(pre-emption priority)

    高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。

2. 何为副优先级(subpriority)

    在占先式优先级相同的情况下,高副优先级的中断优先被响应;

    在占先式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应—非抢断式响应(不能嵌套)。

3. 判断中断是否会被响应的依据

    首先是占先式优先级,其次是副优先级;

    占先式优先级决定是否会有中断嵌套;

4. 优先级冲突的处理

    具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

    当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

5. stm32中对中断优先级的定义

    STM32中指定中断优先级的寄存器位有4位,这4个寄存器位的分组方式如下:

第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级

 

STM32为了适应,不同优先级的组合,设置了GROUP的概念,组是一个大的框架,在组下分别分配了占优先级与副优先级。每一个中断都有一个专门的寄存器(Interrupt Priority Registers)来描述该中断的占先式优先级及副优先级。在这个寄存器中STM32使用4个二进制描述位描述优先级(Cortex M3定义了8位,但STM32只使用了4位)。

 

 

二、stm32定时器的简介

STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器,和1个系统滴答定时器。

其中TIM1和TIM8为高级定时器

TIM2.TIM3.TIM4.TIM5  为普通定时器

TIM6.TIM7是基本定时器

 

定时器

计数器分辨率

计数器类型

预分频系数

产生DMA请求

捕获比较通道

互补输出

TIM1

TIM8

16位

向上,向下,向上/向下

1~65536之间的任意数

可以

4

TIM2

TIM3

TIM4

TIM5

 

16位

向上,向下,向上/向下

1~65536之间的任意数

可以

4

TIM6

TIM7

16位

向上

1~65536之间的任意数

可以

4

 

 

普通定时器时钟的选择

计数器时钟可由下列时钟源提供:

● 内部时钟(CK_INT)

● 外部时钟模式1:外部输入脚(TIx)

● 外部时钟模式2:外部触发输入(ETR)

● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时

三、编程步骤

1、配置系统时钟

2、配置相应中断NVIC的优先级

3、配置GPIO

4、配置具体的TIME

5、编写相应的中断服务程序

定时器驱动程序的文件是misc.c

现在对编程的步骤进行分析,主要是针对第二步和第四步进行分析

第二部配置中断NVIC的优先级的具体配置的参数为

(1)       选择中断分组

(2)       配置相应的定时器中断通道

(3)       抢占式中断优先级的设置

(4)       响应式中断优先级的设置

(5)       使能中断

(6)       中断初始化

Timer配置如下设置:

(1) 设置Time模块的时钟源

(2) 利用TIM_DeInit()函数将Timer设置为默认缺省值

(3)  TIM_Period自动重装载寄存器周期的值(计数值)

(4)  TIM_Prescaler设置时钟的分频系数

(5)  TIM_ClockDivision设置时钟分割   ??

(6)  TIM_CounterMode设置计数模式

(7) 初始化上面所有的数值函数

(8) 清除溢出中断标志

(9) 打开中断溢出功能

(10)使能TIME中断

 

定时器中断时间的计算

计算公式如下:

Tout = (TIM_Period*(TIM_Prescaler+1))/TCLK;

其中:

Tout: time的溢出时间

Tclk:TIM的输入时钟频率(单位为:Khz),当选择来自内部的时钟(CK_INT),假设系统时钟为72Mhz,虽然TIMx是属于低速总线的的,这条总线的最高只能36Mhz的速度,但芯片内部还有一个*2的倍频器,用于把这个低速36M倍频成72M,速度依旧是72Mhz,如果将TIM_Prescaler赋值7200-1则预分频后的效果是0.0001S一个周期。

TIM_Period:预装载值

TIM_Prescaler:分频系数

 

习惯了用51或AVR的朋友们总是把中断函数和普通函数视为不同,总以为C语言的中断函数应指示特定的属性以便让编译器生成特殊的指令(如返回中断),但在CORTEX-M3中中断例程和普通C例程没有什么驱别了,按理说编译器应当提代一个指示字,例如__interrupt之类的,以便让中断程序定位到对流的中断向量,可是ARM编译器没有提供这样的指示字,因此我们只能通过在汇编的启动代码内直接写C程序中的中断函数:如我们写了下面这样一个UART1的中断函数:在51,AVR中这个是编译器通过函数属性自动处理的,在ARM7中中断函数地址写入对应的中断寄存器即可。而在CM3中我们不得不这样手动修改。

中断服务函数写在stm32f10x_it.c文件中,并且中断服务子程序的函数名,必须按照startup_stm32d10x_hd.s文件中的中断向量表中,对应的向量名进行。如果担心写错函数名,可以直接打开startup_stm32d10x_hd.s文件。对于具体的中断函数的。

关键字:stm32  定时器 引用地址:STM32定时器的研究

上一篇:STM32 FSMC学习笔记+补充(LCD的FSMC配置)
下一篇:STM32串口的学习(2)

推荐阅读最新更新时间:2024-03-16 15:14

STM32系统时钟树分析
下面是一个STM32芯片的时钟树图 1、LSI是低速内部时钟,RC振荡器,频率为32kHz左右。供独立看门狗和自动唤醒单元使用。 2、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。这个主要是RTC的时钟源。 3、HSE是高速外部时钟,课接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。我们开发板接的是8M的晶振。HSE也可以直接作为系统时钟或者PLL输入。 4、HSI是高速内部时钟,RC振荡器,频率为16MHz。可以直接作为系统时钟或者用作PLL输入。 5、PLL为锁相环倍频输出。STM32F4有两个PLL: (1)主PLL由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。 第一个输出P
[单片机]
<font color='red'>STM32</font>系统时钟树分析
STM32学习手记②-USART中断
/************************************ * 文件名: main.c * 内容简述: 本例程演示如何操作USART的接收程序(中断模式)。 * 用串口调试软件向开发板发送一字节,开发板会将该字节反发回PC */ #include stm32f10x_lib.h /*************************************************** * 函数名称 :void RCC_Configuration() * 功能描述 : 复位和时钟控制 配置 * 参数 : 无 * 返回值 : 无 * 全局变量 : 无 * 全局静态变量: 无 * 局部静态变量: 无 ***
[单片机]
stm32的IO模式具体意义
Ⅰ、写在前面 在开发STM32的时候,都需要对IO的模式进行配置(GPIO_InitStructure. GPIO_Mode = xxx)。但是,你们都知道各种模式的具体意义吗? 有的人问:IO口输出可以上拉吗? 开漏输出是干什么用的? 其实这些问题并不难,只要你了解到每一种模式的真正意思,相信这些问题都不会难道你。本文的内容比较基础,也比较实用,希望对你有所帮助。 关于本文的详细内容请看下面章节 Ⅱ、模式说明 STM32芯片的IO有8中模式: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上
[单片机]
<font color='red'>stm32</font>的IO模式具体意义
STM32的i2c容易出的问题 和l3g4200d例程
调试了一晚上,终于一点点把stm32可怕的i2c消灭了,这里分享一下遇到的问题。 最严重的一次卡住居然是在这句话上 /* Send START condition */ I2C_GenerateSTART(I2C1, ENABLE); /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); 执行到第二句就怎么也过不去了,后来才很气愤的发现这是stm32的硬件bug,把fsmc关掉才能使用i2c1的非重影射引脚,关掉以后一切正常。害得我干瞪了两个小时屏幕。 第二次被卡住是在 I2C_Send7bitAdd
[单片机]
STM8学习笔记——定时器定时功能和中断相关
定时器都差不多,无非就是计数,溢出了标志置位,如果中断允许的话产生一个中断。说到中断,STM8S105的中断向量表如下 时基单元: 在选用内部时钟的情况下,CK_PSC是由fmaster提供的,经过定时器预分频器分频产生CK_CNT时钟,然后作为一次计数的时基,举个例子,16M的内部RC,经过16分频,则CK_CNT为1M,那么定时1ms只需计数1000次。 计数模式: 共有三种:向上,向下,中央对齐 以向上计数为例:计数器从0计数到用户定义的比较值(TIMx_ARR寄存器的值),然后重新从0开始计数并产生一个计数器溢出事件,同时,如果TIM1_CR1寄存器的UDIS位是0,将会产生一个更新事件(U
[单片机]
STM32的IIC应用详解1
概要 IIC(IIC,inter-Integrated circuit),两线式串行总线,用于MCU和外设间的通信。 IIC只需两根线:数据线SDA和时钟线SCL。以半双工方式实现MCU和外设之间数据传输,速度可达400kbps。 多主机I2C总线结构 注意SDA和SCL两根总线需要上拉,使总线处于空闲状态。 IIC协议 空闲状态 协议规定,SDA和SCL同时为高电平时,总线处于空闲状态。上拉电阻保证电平处于高电平。 起始信号和停止信号 起始信号:SCL为高电平时,SDA电平发生高到低的跳变 停止信号:SCL为高电平时,SDA电平发生低到高的跳变 应答信号 发送器每发送完一个字节(8个脉冲),在第9个脉
[单片机]
<font color='red'>STM32</font>的IIC应用详解1
stm32汇编实例
例子一 1 ;RCC寄存器地址映像 2 RCC_BASE EQU 0x40021000 3 RCC_CR EQU (RCC_BASE + 0x00) 4 RCC_CFGR EQU (RCC_BASE + 0x04) 5 RCC_CIR EQU (RCC_BASE + 0x08) 6 RCC_APB2RSTR EQU (RCC_BASE + 0x0C) 7 RCC_APB1RSTR EQU (RCC_BASE + 0x10) 8 RCC_AHBENR EQ
[单片机]
<font color='red'>stm32</font>汇编实例
STM32为什么需要位带操作呢?
为什么需要位带操作? 因为编程需要操作某个bit位来达到我们想要的功能,比如点灯需要操作GPIOA- ODR 的某个bit假设是第2bit,写1就可以让GPIO输出一个高电平。 GPIOA- ODR |= 1 2; 这样写其实有三个隐含的操作: //1.读取ODR寄存器的值到内存//2.改写第2bit的值//3.再把改写后的值写进ODR寄存器 这样的缺点:效率低 位带操作就是为了解决这个问题,前提是硬件支持这么做。 位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见。51 单片机中通过关键字 sbit 来实现位定义,STM32没有这样的关键字,而是通过访问位带别名区来实现,例如 sbit LED P1^2LE
[单片机]
<font color='red'>STM32</font>为什么需要位带操作呢?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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