STM32定时器有什么功能?STM32的用法详解

发布者:JoyfulExplorer最新更新时间:2024-01-09 来源: elecfans关键字:STM32  定时器  计数模式 手机看文章 扫描二维码
随时随地手机看文章

2.2 计数器模式

TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。

在向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

2.3 编程步骤

1. 配置系统时钟;

2. 配置NVIC;

3. 配置GPIO;

4. 配置TIMER;

其中,前3项在前面的笔记中已经给出,在此就不再赘述了。第4项配置TIMER有如下配置:

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

(2)TIM_InternalClockConfig()选择TIMx来设置内部时钟源;

(3)TIM_Perscaler来设置预分频系数;

(4)TIM_ClockDivision来设置时钟分割;

(5)TIM_CounterMode来设置计数器模式;

(6)TIM_Period来设置自动装入的值

(7) TIM_ARRPerloadConfig()来设置是否使用预装载缓冲器

(8)TIM_ITConfig()来开启TIMx的中断

其中(3)-(6)步骤中的参数由TIM_TimerBaseInitTypeDef结构体给出。步骤(3)中的预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:

CK_INT/(TIM_Perscaler+1)。CK_INT是内部时钟源的频率,是根据2.1中所描述的APB1的倍频器送出的时钟,TIM_Perscaler是用户设定的预分频系数,其值范围是从0 – 65535。

步骤(4)中的时钟分割定义的是在定时器时钟频率(CK_INT)与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例。TIM_ClockDivision的参数如下表:

数字滤波器(ETR,TIx)是为了将ETR进来的分频后的信号滤波,保证通过信号频率不超过某个限定。

步骤(7)中需要禁止使用预装载缓冲器。当预装载缓冲器被禁止时,写入自动装入的值(TIMx_ARR)的数值会直接传送到对应的影子寄存器;如果使能预加载寄存器,则写入ARR的数值会在更新事件时,才会从预加载寄存器传送到对应的影子寄存器。

ARM中,有的逻辑寄存器在物理上对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。

3. 程序源代码

本例实现的是通过TIM2的定时功能,使得LED灯按照1s的时间间隔来闪烁

#include "stm32f10x_lib.h"

void RCC_cfg();

void TIMER_cfg();

void NVIC_cfg();

void GPIO_cfg();

int main()

{

RCC_cfg();

NVIC_cfg();

GPIO_cfg();

TIMER_cfg();

//开启定时器2

TIM_Cmd(TIM2,ENABLE);

while(1);

}

void RCC_cfg()

{

//定义错误状态变量

ErrorStatus HSEStartUpStatus;

//将RCC寄存器重新设置为默认值

RCC_DeInit();

//打开外部高速时钟晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速时钟晶振工作www.dgzj.com

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

//设置AHB时钟(HCLK)为系统时钟

RCC_HCLKConfig(RCC_SYSCLK_Div1);

//设置高速AHB时钟(APB2)为HCLK时钟

RCC_PCLK2Config(RCC_HCLK_Div1);

//设置低速AHB时钟(APB1)为HCLK的2分频

RCC_PCLK1Config(RCC_HCLK_Div2);

//设置FLASH代码延时

FLASH_SetLatency(FLASH_Latency_2);

//使能预取指缓存

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

//使能PLL

RCC_PLLCmd(ENABLE);

//等待PLL准备就绪

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//设置PLL为系统时钟源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//判断PLL是否是系统时钟

while(RCC_GetSYSCLKSource() != 0x08);

}

//允许TIM2的时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

//允许GPIO的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

}

void TIMER_cfg()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//重新将Timer设置为缺省值

TIM_DeInit(TIM2);

//采用内部时钟给TIM2提供时钟源

TIM_InternalClockConfig(TIM2);

//预分频系数为36000-1,这样计数器时钟为72MHz/36000 = 2kHz

TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;

//设置时钟分割

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

//设置计数器模式为向上计数模式

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

//设置计数溢出大小,每计2000个数就产生一个更新事件

TIM_TimeBaseStructure.TIM_Period = 2000 - 1;

//将配置应用到TIM2中

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

//清除溢出中断标志

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

//禁止ARR预装载缓冲器

TIM_ARRPreloadConfig(TIM2, DISABLE);

//开启TIM2的中断

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

}

void NVIC_cfg()

{

NVIC_InitTypeDef NVIC_InitStructure;

//选择中断分组1

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

//选择TIM2的中断通道

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

//抢占式中断优先级设置为0

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

//响应式中断优先级设置为0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

//使能中断

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

void GPIO_cfg()

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //选择引脚5

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50MHz

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //带上拉电阻输出

GPIO_Init(GPIOB,&GPIO_InitStructure);

}

在stm32f10x_it.c中,我们找到函数TIM2_IRQHandler(),并向其中添加代码

void TIM2_IRQHandler(void)

{

u8 ReadValue;

//检测是否发生溢出更新事件

if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

{

//清除TIM2的中断待处理位

TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);

//将PB.5管脚输出数值写入ReadValue

ReadValue = GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);

if(ReadValue == 0)

{

GPIO_SetBits(GPIOB,GPIO_Pin_5);

}

else

{

GPIO_ResetBits(GPIOB,GPIO_Pin_5);

}

}

}


关键字:STM32  定时器  计数模式 引用地址:STM32定时器有什么功能?STM32的用法详解

上一篇:Robomaster-stm32-PWM学习笔记(stm32控制pwm输出)
下一篇:如何创建硬件在环工程

推荐阅读最新更新时间:2024-11-13 21:39

Stm32浮点运算死机解决方案
需要在SOC中的软核部分(PS)构建一些浮点运算,结果发现仿真6次就死机 咋仿真咋死! 修改代码如下 好了!
[单片机]
<font color='red'>Stm32</font>浮点运算死机解决方案
STM32 串口详解
01、USART的特点 USART是通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter),通常称作UART,是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx和Tx)就可以完成通信过程,因此也称为异步串行通信。 全双工异步通信。 小数波特率发生器系统,提供精确的波特率。 可配置的16倍过采样或8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能。 可编程的数据字长度(8位或者9位); 可配置的停止位(支
[单片机]
<font color='red'>STM32</font> 串口详解
STM32 IO中断(F407)
Title:STM32单片机系列(三) Date: 2020-2-22 Author: Page Categories: -单片机 Tags: -STM32F407 中断 STM32 F4 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 F4 的强大之处。 STM32 F407 的中断控制器支持 22 个外部 中断事件请求。每个中断设有状态位,每个中断事件都有独立的触发和屏蔽设置。 STM32 F407的 22 个外部中断为: EXTI线 0~15 :对应外部 IO 口的输入中断。 EXTI线 16 :连接到 PVD 输出。 EXTI线 17 :连接到 RTC 闹钟事件。 EXTI线 18 :连接到 USB
[单片机]
<font color='red'>STM32</font> IO中断(F407)
STM32串口通信库的详细代码分享
从箱底捞出来的f103,支持的c语言太基础,虽然性能很高,然而开发时间长难以快速的使用,一开始把 c++那些该有的都搬进来,结果当然是觉得有的函数都没有了。小小的写了一个库用来通过串口来DEBUG 一共有这几个函数,串口为PA9和PA10,在C8T6最小系统上面通过测试 Serial_Begin() 初始化USART,设定波特率 Serial_WriteLine() 传输数据并换行 Serial_Write() 传输数据,没有换行符 例: char str = { THIS IS STM32C8T6 }; void main() { Serial_Begin(115200); while(1) { Serial_WriteL
[单片机]
STM32 环境光传感器ADC采样
一、STM32 环境光传感器模块 TEMT60000光传感器把光信号转变成为电信号,PA作为模拟输入,接收光传感器的电压, 将PA4设置成ADC 二、Stm32CubeMx配置ADC 打开PA4并使能ADC1通道9 配置完ADC之后,GPIO模式自动为模数转换模式 使能外部高速时钟 配置时钟 不要让ADC时钟超过14MHz,否则可能不准 ADC参数设置 配置USART1为异步模式 PA10和PA9被使能作为串口的收发端 生成代码 三、Keil编写程序 在uart.c中做printf、scanf的重定向以便于串口通信 #include stdio.h #ifdef __GNU
[单片机]
<font color='red'>STM32</font> 环境光传感器ADC采样
stm32实现printf重定向到LCD显示屏
嘿嘿,学习stm32已经有一段时间了。以前纠结过一个问题,(USART)串口的可变参数问题,查找C语言的书终于还是解决了,自己编写了一个USART_printf()函数,功能模仿C语言的printf,实现可变参数处理。有点小成就感。 我也因此发表了一下C语言可变参数的博文, 同学们有兴趣可以参考一下: http://blog.sina.com.cn/s/blog_6e22f4ce01010uud.html 最近几天在玩LCD显示屏,基本驱动写好了,并写了一个函数支持中文英文混合打印,但是函数功能还是不够强大啊!串口的时候可以使用printf重定向,这么说开printf也可以重定向到LCD? 基于这个问题,本人昨天
[单片机]
msp430定时器A中断实例
//例程描述:利用定时器定时功能,实现P1.0方波输出。 #include msp430x14x.h { WDTCTL = WDTPW + WDTHOLD; //停止看门狗WDT,不使用内部看门狗定时器。 P1DIR |= 0x01; //设置P1.0口方向为输出。 CCTL0 = CCIE; //设置捕获/比较控制寄存器中CCIE位为1,CCR0捕获/比较功能中断为允许。 CCR0 = 50000; //捕获/比较控制寄存器CCR0初值为5000。 TACTL = TASSEL_2 + MC_2; //设置定时器A控制寄存器TACT
[单片机]
STM32之五外部中断(下)
通过对外部中断理论的些许理解,这次我们利用两个按键key1和key2来控制led1和led2的亮灭,按key1进入key1的中断,控制对应的led亮灭,按key2进入key2的中断,控制相应的led的亮灭 同样,涉及到中断,我们要建立两个文件,exti.c及exti.h,首先来看看exti.c 用到中断,自然我们要用到stm32f10x_it.c函数,将中断响应函数放在里面,打开这个文件你会发现里面只是给出了部分中断函数,找来找去也没有我们需要的中断函数体,这时需要我们自己添加函数体,看下我添加的函数体: 但是这个函数名可不是随便起的,具体每个中断函数体的函数名怎么书写,我们可以打开startup_stm32f10x_hd.
[单片机]
<font color='red'>STM32</font>之五外部中断(下)
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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