STM32F103ve定时器时间算法
- 格式:doc
- 大小:40.00 KB
- 文档页数:8
STM32F103系列单片机中的定时器工作原理解析
STM32F103系列的单片机一共有11个定时器,其中:
2个高级定时器
4个普通定时器
2个基本定时器
2个看门狗定时器
1个系统嘀嗒定时器
出去看门狗定时器和系统滴答定时器的八个定时器列表;
8个定时器分成3个组;
TIM1和TIM8是高级定时器
TIM2-TIM5是通用定时器
TIM6和TIM7是基本的定时器
这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式
计数器三种计数模式
向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时
向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时
中央对齐模式:从0开始向上计数,计到arr产生溢出事件,然后向下计数,计数到1以后,又产生溢出,然后再从0开始向上计数。
(此种技术方法也可叫向上/向下计数)
基本定时器(TIM6,TIM7)的主要功能:
只有最基本的定时功能,。
基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动
通用定时器(TIM2~TIM5)的主要功能:
除了基本的定时器的功能外,还具有测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。
单片机课程设计题目:实现简易电子琴院(系):专业:班级:学生:学号:指导教师:2016年6月26日简易电子琴的设计与实现摘要:本次设计是利用单片机设计简易电子琴。
其主要功能为:按下不同按键,发出不同1 、2 、3、4 、5 、6 、7 七个音符并且用LED 或LCD显示当前按键。
选用stm32f103VE,它有8个定时器,部分定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入。
利用芯片内部相关定时器来输出PWM,从而来驱动蜂鸣器。
通过读取外部按键输入的值来相应改变定时器相关寄存器的值,从而来改变PWM的输出频率来达到发出不同音调。
关键词: STM32f103VE;蜂鸣器;定时器The Design of the Keyboard Abstract:This design is the professional direction of biomedical engineering design. Using Single Chip Microcomputer to achieve a simple Keyboard. Its main function is: While a user press the different keys, it will make different sounds from the buzzer and display different numbers which corresponded to the sounds. Using stm32f103- -C8T6 as control chip. It has16-bit timers. Some of them with up to 4 IC/OC/PWM or pulse counter. Making use of the Timers to generate driving signal .By reading the state of the external key to change the frequency of output . Different frequency of the PWM will control buzzer makes different sounds.Key words: STM32f103; signal; Timer一、设计目的:通过本次综合设计,旨在运用已经学过的知识,根据题目的要求进行软硬件系统的设计和调试,对在《单片机的原理及应用》课程中涉及的芯片结构、控制原理、硬件和编程等方面有一定的感性认识和实践操作能力。
stm32f103工作原理(最新版)目录一、STM32F103 简介二、STM32F103 的电路原理三、STM32F103 的定时器工作原理四、STM32F103 的串口中断及其配置五、STM32F103 的应用案例六、总结正文一、STM32F103 简介STM32F103 是一种基于 ARM Cortex-M3 内核的微控制器,由STMicroelectronics 公司推出。
它具有高性能、低功耗、多功能、易扩展等特点,广泛应用于各种嵌入式系统中,如智能家居、自动控制、智能穿戴等。
二、STM32F103 的电路原理STM32F103 微控制器的内部电路主要包括 CPU 核心、存储器、定时器、串口、GPIO 等模块。
其中,CPU 核心是整个微控制器的核心,负责程序的执行;存储器用于存储程序和数据;定时器用于计时和控制;串口用于与外部设备进行通信;GPIO 用于与外部设备进行接口。
三、STM32F103 的定时器工作原理STM32F103 系列微控制器共有 11 个定时器,分为高级定时器、普通定时器和基本定时器三类。
这些定时器可以实现多种功能,如计时、测量、控制等。
定时器的工作原理主要基于计数器和时钟脉冲,通过计数器计数时钟脉冲来实现定时功能。
四、STM32F103 的串口中断及其配置STM32F103 的串口模块可以配置为中断模式,当接收到一定数量的字符时,会产生中断信号。
串口中断的配置主要包括使能串口时钟、配置GPIO(TX、RX)以及初始化 NVIC 等步骤。
通过串口中断,可以实现异步通信和实时响应等功能。
五、STM32F103 的应用案例STM32F103 微控制器广泛应用于各种嵌入式系统中,如智能家居、自动控制、智能穿戴等。
例如,在智能家居系统中,可以使用 STM32F103 控制灯光、家电等设备;在自动控制系统中,可以使用 STM32F103 实现传感器数据采集和控制策略执行;在智能穿戴设备中,可以使用 STM32F103 实现运动数据监测和健康管理等功能。
STM32之TIM通⽤定时器本⽂介绍如何使⽤STM32标准外设库配置并使⽤定时器,定时器就是设置⼀个计时器,待计时时间到之后产⽣⼀个中断,程序接收到中断之后可以执⾏特定的程序,跟现实中的闹钟功能类似。
与延时功能不同,定时器计时过程中程序可以执⾏其他程序。
最简单直观的应⽤为定时翻转指定IO引脚。
本例程使⽤通⽤定时器TIM3,每100ms翻转GPIOB的Pin5输出,如果该引脚外接有LED灯,可以看到LED灯周期性的闪烁。
STM32F103VE系列共有8个定时器,分为基本定时器、通⽤定时器和⾼级定时器,其中通⽤定时器包括TIM2/3/4/5共4个,如果⼀个定时器不够⽤,可以启动其他⼏个定时器。
本⽂适合对单⽚机及C语⾔有⼀定基础的开发⼈员阅读,MCU使⽤STM32F103VE系列。
TIM通⽤定时器分为两部分,初始化和控制。
1. 初始化分两步:通⽤中断、TIM。
1.1. 通⽤中断:优先级分组、中断源、优先级、使能优先级分组:设定合适的优先级分组中断源:选择指定的TIM中断源:TIM3_IRQn优先级:设定合适的优先级使能:调⽤库函数即可1.2. TIM:时钟、预分频器、定时器周期、分频因⼦、计数模式、初始化定时器、开启定时器中断、使能计数器。
结构体:typedef struct{uint16_t TIM_Prescaler;uint16_t TIM_CounterMode;uint16_t TIM_Period;uint16_t TIM_ClockDivision;uint8_t TIM_RepetitionCounter;} TIM_TimeBaseInitTypeDef;时钟:需要使能定时器时钟//开启定时器时钟,即内部时钟CK_INT=72MRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);预分频器:默认定时器时钟频率为72M,那么预分频器设置为71,那么⼀次计数为1us//时钟预分频数为71,则计数器计数⼀次时间为1usTIM_TimeBaseStructure.TIM_Prescaler = 71;定时器周期:设置为999,那么产⽣⼀次定时器中断的时间为1ms//⾃动重装载寄存器为999,则产⽣⼀次中断时间为1msTIM_TimeBaseStructure.TIM_Period = 1000 - 1;计数模式:⼀般选择向上计数模式// 计数器计数模式,选择向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;时钟分频因⼦:⼀般选择1分频// 时钟分频因⼦,选择1分频TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;重复计数器的值:仅对⾼级定时器有效,⽆需设置初始化定时器:调⽤库函数即可//初始化定时器TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);开启定时器中断//开启计数器中断TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);使能计数器//使能计数器TIM_Cmd(TIM3, ENABLE);2. 处理2.1. 中断服务函数定时器TIM3的中断服务函数名称为TIM3_IRQHandler ()。
stm32f103的HSI设置HSI基本知识 HSI是8MRC震荡电路,精度1%。
PLL的设置必须在其被激活前完成,输出必须被设置温48M或者72M LSE:通过在备份域控制寄存器(RCC_BDCR)⾥的LSEON位启动和关闭。
如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率⼀致。
否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍 HSI + PLL 最⾼为64M(HSI / 2 * 16)。
寄存器的作⽤ 时钟控制寄存器RCC_CR:HSI/HSE/PLL使能和就绪,HSI时钟校准。
时钟配置寄存器(RCC_CFGR):时钟切换和切换状态标志,各种分频器 时钟中断寄存器 (RCC_CIR):各种时钟中断和时钟中断标志。
APB2 外设复位寄存器 (RCC_APB2RSTR);APB1 外设复位寄存器 (RCC_APB1RSTR):各个外设接⼝的复位 AHB外设时钟使能寄存器 (RCC_AHBENR);APB2 外设时钟使能寄存器(RCC_APB2ENR);APB1 外设时钟使能寄存器(RCC_APB1ENR):各个外设的使能。
HSI的配置,我这⾥⽤的是原库,直接将 system_stm32f10x.c 中的 void SystemInit (void) 函数改成下边的就可以了void SystemInit (void){ RCC_DeInit();//将外设 RCC寄存器重设为缺省值RCC_HSICmd(ENABLE);//使能HSIwhile(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能或者失能预取指缓存(参数⾥是使能) -----加上这两句才能到64MFLASH_SetLatency(FLASH_Latency_2); //设置代码延时值(参数⾥的是指2延时周期)RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟 HCLK = SYSCLK/1RCC_PCLK1Config(RCC_HCLK_Div4); //设置低速速AHB时钟 -----这⾥频率是48/4 = 12M 定时器2~7频率是24MRCC_PCLK2Config(RCC_HCLK_Div1); //设置⾼速AHB时钟 -----这⾥频率是48/1 = 48M//设置 PLL 时钟源及倍频系数RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE RCC_PLLCmd(ENABLE);//如果PLL被⽤于系统时钟,那么它不能被失能//等待指定的 RCC 标志位设置成功等待PLL初始化成功while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//设置系统时钟(SYSCLK)设置PLL为系统时钟源RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟//等待PLL成功⽤作于系统时钟的时钟源// 0x00:HSI 作为系统时钟// 0x04:HSE作为系统时钟// 0x08:PLL作为系统时钟while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL} 配置之后,不确定是否配置成功,可以只⽤库函数中的时钟频率结构体,来查看系统各个时钟频率,在主函数中使⽤int main( void ){ RCC_ClocksTypeDef RCC_Clocks; //时钟频率结构体RCC_GetClocksFreq(&RCC_Clocks); //获取各个时钟频率printf("SYSCLK_Frequency is %d \r\n",RCC_Clocks.SYSCLK_Frequency); //SYSCLK_Frequency is 48000000printf("HCLK_Frequency is %d \r\n",RCC_Clocks.HCLK_Frequency); //HCLK_Frequency is 48000000printf("PCLK1_Frequency is %d \r\n",RCC_Clocks.PCLK1_Frequency); //PCLK1_Frequency is 12000000printf("PCLK2_Frequency is %d \r\n",RCC_Clocks.PCLK2_Frequency); //PCLK2_Frequency is 48000000printf("ADCCLK_Frequency is %d \r\n",RCC_Clocks.ADCCLK_Frequency); //ADCCLK_Frequency is 24000000 }。
STM32F103ZET6通⽤定时器1、通⽤定时器简介 通⽤定时器是由⼀个可编程预分频器驱动的16位⾃动装载计数器构成。
通⽤定时器可以应⽤于多种场合,如测量输⼊信号的脉冲长度(输⼊捕获)或者产⽣输出波形(输出⽐较和PWM)。
使⽤通⽤定时器的预分频器和RCC时钟控制器的预分频器,脉冲长度和输出波形周期可以在⼏个微秒到⼏个毫秒间调整。
STM32内有多个通⽤定时器,每个通⽤定时器都是完全独⽴的,没有互相共享任何资源。
通⽤定时器的主要功能包括: 16位向上、向下、向上/向下⾃动装载计数器。
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值。
4个独⽴通道可以实现4路:输⼊捕获、输出⽐较、PWM输出、单脉冲模式输出。
使⽤外部信号控制定时器和定时器互连的同步电路。
⽀持针对定位的增量(正交)编码器和霍尔传感器电路。
通⽤定时器框图如下:2、通⽤定时器的时基单元 通⽤定时器的时基单元主要由⼀个16位计数器和与其相关的⾃动装载寄存器。
这个计数器可以向上计数、向下计数或者向上向下双向计数。
通⽤定时器的计数器的时钟由预分频器分频得到,⾄于预分频器之前的时钟在时钟选择的时候回说到。
通⽤定时器的计数器、⾃动装载寄存器和预分频器寄存器可以由软件读写,在计数器运⾏时仍可以读写。
如下图红⾊框部分就是通⽤定时器的时基部分: 时基单元包含: CNT计数器(TIMx_CNT)。
PSC预分频器(TIMx_PSC)。
⾃动重装载寄存器(TIMx_ARR)。
CNT 计数器和⾃动重装载寄存器: TIMx_ARR寄存器是预先装载的,写或读TIMX_ARR寄存器将访问预装载寄存器。
通⽤定时器根据TIMx_CR1寄存器中的ARPE 位,来决定写⼊TIMx_ARR寄存器的值是⽴即⽣效还是要等到更新事件(溢出)后才⽣效。
在计数器运⾏的过程中,ARPE位的作⽤如下: 当ARPE = 0时,写⼊TIMx_ARR寄存器的值⽴即⽣效,即TIMx_CNT计数器的计数范围⽴马更新。
地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 STM32F103RC 系统时钟配置1、打开D:\program\KEL_MDT_ARM\STM32_Template\USER 目录,找到STM32-DEMO 文件,双击打开,KEIL-uVision4就开始运行了,得到下图:2、双击“STARTCODE ”下面的“start_stm32f10x_hd.s ”打开STM32F103RC 的启动文件,找“SystemInit ”,得到下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司3、点击当前的行,右击鼠标,将光标移动到“Go To Definition Of SystemInit”,见下图:4、点击“Go To Definition Of SystemInit ”,会跳转到system_stm32f10x.c 文件,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司5、在“system_stm32f10x.c ”文件中,在“void SystemInit (void)”函数体内找到“SetSysClock();”,见下图:6、点击“SetSysClock()”,右击鼠标,将光标移动到“Go To Definition Of SystemClock”,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 7、点击“Go To Definition Of SystemClock”,会跳转到system_stm32f10x.c 文件,见下图:8、点击“defined SYSCLK_FREQ_72MHz ”,右击鼠标,将光标移到到“Go To Definition Of SYSCLK_FREQ_72MHz ”,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司9、点击“Go To Definition Of SYSCLK_FREQ_72MHz ”,会跳转到下图:10、在上图中,我们可以设置所需要的系统时钟,这里设置系统时钟是SYSCLK_FREQ_72MHz ,见下面粘贴的部分#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */#define SYSCLK_FREQ_24MHz 24000000#else/* #define SYSCLK_FREQ_HSE HSE_VALUE *//* #define SYSCLK_FREQ_24MHz 24000000 *//* #define SYSCLK_FREQ_36MHz 36000000 *//* #define SYSCLK_FREQ_48MHz 48000000 *//* #define SYSCLK_FREQ_56MHz 56000000 */#define SYSCLK_FREQ_72MHz 72000000 //这是我们要设置的系统时钟#endif。
STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲一.说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:蜂鸣器演奏乐曲),移植到STM32F103上。
二.流明LM3SLib_Timer.pdf例程9及例程10的拷贝:例程9.Timer PWM应用:蜂鸣器发声如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。
蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。
图1.1 蜂鸣器驱动电路程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。
其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。
程序清单1.9 Timer PWM应用:蜂鸣器发声文件:main.c#include "systemInit.h"#include "buzzer.h"// 主函数(程序入口)int main(void){jtagWait(); // 防止JTAG失效,重要!clockInit(); // 时钟初始化:晶振,6MHzbuzzerInit(); // 蜂鸣器初始化buzzerSound(1500); // 蜂鸣器发出1500Hz声音SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400msbuzzerSound(2000); // 蜂鸣器发出2000Hz声音SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800msbuzzerQuiet( ); // 蜂鸣器静音for (;;){}}文件:buzzer.h#ifndef __BUZZER_H__#define __BUZZER_H__// 蜂鸣器初始化extern void buzzerInit(void);// 蜂鸣器发出指定频率的声音extern void buzzerSound(unsigned short usFreq);// 蜂鸣器停止发声extern void buzzerQuiet(void);#endif // __BUZZER_H__文件:buzzer.c#include "buzzer.h"#include <hw_types.h>#include <hw_memmap.h>#include <sysctl.h>#include <gpio.h>#include <timer.h>#define PART_LM3S1138#include <pin_map.h>#define SysCtlPeriEnable SysCtlPeripheralEnable#define GPIOPinTypeOut GPIOPinTypeGPIOOutput// 声明全局的系统时钟变量extern unsigned long TheSysClock;// 蜂鸣器初始化void buzzerInit(void){SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // 使能TIMER1模块SysCtlPeriEnable(CCP3_PERIPH); // 使能CCP3所在的GPIO端口GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | // 配置TimerB为16位PWM TIMER_CFG_B_PWM);}// 蜂鸣器发出指定频率的声音// usFreq是发声频率,取值(系统时钟/65536)+1 ~20000,单位:Hzvoid buzzerSound(unsigned short usFreq){unsigned long ulVal;if ((usFreq <= TheSysClock / 65536UL) || (usFreq > 20000)){buzzerQuiet( );}else{GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能ulVal = TheSysClock / usFreq;TimerLoadSet(TIMER1_BASE, TIMER_B, ulVal); // 设置TimerB初值TimerMatchSet(TIMER1_BASE, TIMER_B, ulVal / 2); // 设置TimerB匹配值TimerEnable(TIMER1_BASE, TIMER_B); // 使能TimerB计数}}// 蜂鸣器停止发声void buzzerQuiet(void){TimerDisable(TIMER1_BASE, TIMER_B); // 禁止TimerB计数GPIOPinTypeOut(CCP3_PORT, CCP3_PIN); // 配置CCP3管脚为GPIO输出GPIOPinWrite(CCP3_PORT, CCP3_PIN, 0x00); // 使CCP3管脚输出低电平}例程10.Timer PWM应用:蜂鸣器演奏乐曲程序清单1.10是Timer模块16位PWM模式的一个应用,能驱动交流蜂鸣器演奏一首动听的乐曲《化蝶》(乐谱参见图1.2)。
STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。
在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。
首先,我们需要选择定时器的工作模式。
STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。
基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。
根据具体的应用需求,选择合适的工作模式。
其次,我们需要选择定时器的时钟源。
STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。
内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。
然后,我们需要选择定时器的时钟分频系数。
定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。
我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。
时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。
接着,我们需要配置定时器的计数器重载值。
定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。
通过改变计数器重载值,可以实现不同的定时时间。
计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。
最后,我们需要配置定时器的中断。
定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。
在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。
通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。
需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。
S TM32 定时器定时时间的计算2010-11-18 14:12:18| 分类:资料引用| 标签:|字号大中小订阅引用mxpopstar 的STM32 定时器定时时间的计算假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。
RCC_Configuration()的SystemInit()的RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。
因此,每次进入中断服务程序间隔时间为((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1 +9999)=1秒*/定时器的基本设置1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间) 累计0xFFFF个频率后产生个更新或者中断(也是说定时时间到)3、TIM_TimeBaseStructure.TIM_CounterMode =TIM1_CounterMode_Up; //定时器模式向上计数4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值5、TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化定时器26、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断7、TIM_Cmd(TIM2, ENABLE);//打开定时器或者:TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999 72M/(35999+1)/2=1Hz 1秒中断溢出一次TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*( 1+2000)=1秒*/STM32通用定时器的基本定时器功能实现灯闪烁/blog/static/12003725820091023451 51281/?fromdm&isFromSearchEngine=yes/*MAIN.C*//* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"#include "misc.h"/* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void TIM3_Configuration(void);/* Private functions ---------------------------------------------------------*/ /*** @brief Main program* @param None* @retval : None*/int main(void){RCC_Configuration();NVIC_Configuration();GPIO_Configuration();TIM3_Configuration();TIM_ClearFlag(TIM3, TIM_FLAG_Update);/*清除更新标志位*/ TIM_ARRPreloadConfig(TIM3, DISABLE);/*预装载寄存器的内容被立即传送到影子寄存器*/TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);TIM_Cmd(TIM3, ENABLE);while (1) {;}}/*** @brief Configures TIM3* @param None* @retval : None*/void TIM3_Configuration(void){/*每1秒发生一次更新事件(进入中断服务程序)。
RCC_Configuration()的SystemInit()的RCC->CFGR |=(uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。
因此,每次进入中断服务程序间隔时间为((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+99 99)=1秒*/TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 9999;TIM_TimeBaseStructure.TIM_Prescaler = 7199;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/*此函数的语句"TIMx->EGR = TIM_PSCReloadMode_Immediate;"以软件方式产生更新事件(注:当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF 位)。
)。
*/}/*** @brief Configures the different system clocks.* @param None* @retval : None*/void RCC_Configuration(void){SystemInit();/* TIM3 clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);/* GPIOC clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);}/*** @brief Configures NVIC.* @param None* @retval : None*/void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;/* Enable the TIM3 gloabal Interrupt*/NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);}/*** @brief Configure the TIM3 Ouput Channels.* @param None* @retval : None*/void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);/*注:不用为实现通用定时器的基本定时器功能配置Pin*/}/*stm32f10x_it.c*//* Includes ------------------------------------------------------------------*/#include "stm32f10x_it.h"void TIM3_IRQHandler(void){if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { /* Clear TIM3 update interrupt */TIM_ClearITPendingBit(TIM3, TIM_IT_Update);GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 -GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));}}/*注:stm32f10x_stdperiph_lib_v3.0.0 编译器:MDK3.24A*//*软件仿真:首次进入中断Sec为1.00016507,第二次进入中断Sec 为2.00016507,因此2.00016507-1.00016507。