STM32F103ve定时器时间算法
STM32F103系列单片机中的定时器工作原理解析
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)。
STM32F103VE-中文
− 2个16位6通道高级控制定时器,多达6路 PWM输出,带死区控制
− 2个看门狗定时器(独立的和窗口型的) − 系统时间定时器:24位自减型计数 − 2个16位基本定时器用于驱动DAC
■ 多达13个通信接口 − 多达2个I2C接口(支持SMBus/PMBus) − 多达5个USART接口(支持ISO7816,LIN, IrDA接口和调制解调控制)
■ 低功耗 − 睡眠、停机和待机模式 − VBAT为RTC和后备寄存器供电
■ 3个12位模数转换器,1μs转换时间(多达21个 输入通道) − 转换范围:0至3.6V − 三倍采样和保持功能 − 温度传感器
■ 2 通道 12 位 D/A 转换器
■ DMA − 12通道DMA控制器 − 支持的外设:定时器、ADC、DAC、SDIO、 I2S、SPI、I2C和USART
■ 多达112个快速I/O口 − 51/80/112个多功能双向的I/O口 − 所有I/O口可以映像到16个外部中断 − 除了模拟输入口以外的IO口可容忍5V信号 输入
■ 调试模式 − 串行单线调试(SWD)和JTAG接口 − Cortex-M3内嵌跟踪模块(ETM)
■ 多达11个定时器
− 多达4个16位定时器,每个定时器有多达4个 用于输入捕获/输出比较/PWM或脉冲计数的 通道
STM32F103xC、STM32F103xD和STM32F103xE增强型系列拥有内置的ARM核心,因此它与
所有的ARM工具和软件兼容。
图一是该系列产品的功能框图。
内置闪存存储器
高达512K字节的内置闪存存储器,用于存放程序和数据。
CRC(循环冗余校验)计算单元
CRC(循环冗余校验)计算单元使用一个固定的多项式发生器,从一个32位的数据字产生一个CRC码。 在众多的应用中,基于CRC的技术被用于验证数据传输或存储的一致性。在EN/IEC 60335-1标准的范 围内,它提供了一种检测闪存存储器错误的手段,CRC计算单元可以用于实时地计算软件的签名, 并与在链接和生成该软件时产生的签名对比。
stm32f103电子琴课设报告 终极版(1)
单片机课程设计题目:实现简易电子琴院(系):专业:班级:学生:学号:指导教师: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 简介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之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设置
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通用定时器
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系统时钟配置
地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 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应用例程--蜂鸣器演奏乐曲
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定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。
首先,我们需要选择定时器的工作模式。
STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。
基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。
根据具体的应用需求,选择合适的工作模式。
其次,我们需要选择定时器的时钟源。
STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。
内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。
然后,我们需要选择定时器的时钟分频系数。
定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。
我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。
时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。
接着,我们需要配置定时器的计数器重载值。
定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。
通过改变计数器重载值,可以实现不同的定时时间。
计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。
最后,我们需要配置定时器的中断。
定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。
在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。
通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。
需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。
定时器写延时1ms函数
定时器写延时1ms函数在嵌入式系统中,经常需要进行时间控制。
定时器是一种硬件设备,它可以生成一个周期性的中断信号,我们可以利用这个中断信号来实现定时器功能。
在嵌入式系统中,经常需要进行短时间的延时操作。
为了方便使用,我们可以将常用的延时操作封装成函数。
本篇文章将介绍如何利用定时器编写一个延时1ms的函数。
1. 硬件选型在笔者的开发环境中,采用了STM32F103系列微控制器,选用了其内部的TIM2定时器。
TIM2定时器是一个16位的定时器,它可以配置为不同的工作模式,比如定时器模式、输入捕获模式、PWM输出模式等等。
对于我们要编写的延时函数,采用定时器模式就可以实现。
2. 配置定时器工作模式在使用定时器之前,需要进行一些初始化配置。
我们要配置TIM2定时器为定时器模式,采用内部时钟源这种工作模式,周期为1ms。
初始化代码如下所示:```void Delay_Init(void){// 使能定时器时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 定时器配置TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1; // 分频系数=7200,即1us为一个计数单位TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式TIM_TimeBaseInitStruct.TIM_Period = 1000; // 计数周期=1msTIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);// 开始计时TIM_Cmd(TIM2, ENABLE);}```上述代码中,我们首先使能TIM2的时钟,并配置了定时器的工作模式。
stm32f1定时器计算公式
stm32f1定时器计算公式
STM32F1系列微控制器具有多种定时器,包括基本定时器
(TIM6和TIM7)、通用定时器(TIM2至TIM5)和高级定时器
(TIM1)。
这些定时器可用于测量时间间隔、生成脉冲、控制PWM
输出等多种应用。
对于定时器的计算公式,主要涉及到定时器的时钟频率、预分
频系数和计数器的周期值。
以下是一些常见的计算公式:
1. 计数器的周期值计算公式:
计数器的周期值决定了定时器溢出的时间间隔,计算公式为:
计数器周期值 = (定时器时钟频率 / (预分频系数定时器
工作频率)) 1。
2. PWM输出频率计算公式:
如果使用定时器来生成PWM输出,可以根据以下公式计算PWM输出的频率:
PWM输出频率 = 定时器工作频率 / (计数器周期值 + 1)。
3. 定时器中断频率计算公式:
如果需要定时器中断来执行特定的任务,可以根据以下公式计算定时器中断的频率:
中断频率 = 定时器工作频率 / (预分频系数 (计数器周期值 + 1))。
需要注意的是,不同的定时器具有不同的工作模式和特性,因此在使用时需要查阅相关的参考手册和技术资料,以确保计算公式的准确性和适用性。
另外,定时器的配置和使用也需要结合具体的应用场景和需求进行调整和优化。
(stm32f103学习总结)—stm32定时器中断
(stm32f103学习总结)—stm32定时器中断⼀、定时器介绍 STM32F1的定时器⾮常多,由2个基本定时器(TIM6、TIM7)、4个通 ⽤定时器(TIM2-TIM5)和2个⾼级定时器(TIM1、TIM8)组成。
基本定 时器的功能最为简单,类似于51单⽚机内定时器。
通⽤定时器是在基本 定时器的基础上扩展⽽来,增加了输⼊捕获与输出⽐较等功能。
⾼级定 时器⼜是在通⽤定时器基础上扩展⽽来,增加了可编程死区互补输出、 重复计数器、带刹车(断路)功能,这些功能主要针对⼯业电机控制⽅⾯1.1 通⽤定时器简介 STM32F1的通⽤定时器包含⼀个 16 位⾃动重载计数器(CNT),该计 数器由可编程预分频器(PSC)驱动。
STM32F1的通⽤定时器可⽤于多种 ⽤途,包括测量输⼊信号的脉冲宽度(输⼊捕获)或者⽣成输出波形(输出 ⽐较和PWM)等。
使⽤定时器预分频器和 RCC 时钟控制器预分频器,脉 冲长度和波形周期可以在⼏个微秒到⼏个毫秒间调整。
STM32F1 的每个 通⽤定时器都是完全独⽴的,没有互相共享的任何资源。
STM32F1的通⽤定时器TIMx (TIM2-TIM5 )具有如下功能:(1)16 位向上、向下、向上/向下⾃动装载计数器(TIMx_CNT)。
(2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535之间的任意数值。
(3)4个独⽴通道(TIMx_CH1-4),这些通道可以⽤来作为: A.输⼊捕获 B.输出⽐较 C. PWM ⽣成(边缘或中间对齐模式) D.单脉冲模式输出(4)可使⽤外部信号(TIMx_ETR)控制定时器,且可实现多个定时器互连(可以⽤1个定时器控制另外⼀个定时器)的同步电路。
(5)发⽣如下事件时产⽣中断/DMA请求: A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) B.触发事件(计数器启动、停⽌、初始化或者由内部/外部触发计数) C.输⼊捕获 D.输出⽐较(6)⽀持针对定位的增量(正交)编码器和霍尔传感器电路(7)触发输⼊作为外部时钟或者按周期的电流管理1.2 通⽤定时器结构框图我们把通⽤定时器结构框图分成 5 个⼦模块,按照顺序依次进⾏简单介绍。
(stm32f103学习总结)—输入捕获模式
(stm32f103学习总结)—输⼊捕获模式⼀、输⼊捕获介绍 在定时器中断实验章节中我们介绍了通⽤定时器具有多种功能,输⼊捕获就是其中⼀种。
STM32F1 除了基本定时器 TIM6和 TIM7,其他定时器都具有输⼊捕获功能。
输⼊捕获可以对输⼊的信号的上升沿,下降沿或者双边沿进⾏捕获,通常⽤于测量输⼊信号的脉宽、测量 PWM 输⼊信号的频率及占空⽐。
输⼊捕获的⼯作原理⽐较简单,在输⼊捕获模式下,当相应的 ICx 信号检测到跳变沿后,将使⽤捕获/⽐较寄存器(TIMx_CCRx)来锁存计数器的值。
简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发⽣跳变(⽐如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/⽐较寄存(TIMx_CCRx)⾥⾯,完成⼀次捕获。
同时还可以配置捕获时是否触发中断/DMA 等。
下⾯我们以输⼊捕获测量脉宽为例,通过⼀个简图来介绍输⼊捕获的⼯作原理,如图所⽰: 从上图可以看出,t1-t2 时间就是我们需要测量的⾼电平时间,假如定时器⼯作在向上计数模式,测量⽅法是:⾸先设置定时器通道 x 为上升沿捕获,这样在 t1 时刻,就会捕获到当前的 CNT 值,然后⽴即清零 CNT,并设置通道 x 为下降沿捕获,这样到 t2 时刻,⼜会发⽣捕获事件,得到此时的 CNT 值,记为 CCRx2。
根据定时器的计数频率,我们就可以算出 t1-t2 的时间,从⽽得到⾼电平脉宽。
在 t1-t2 时间内可能会出现 N 次定时器溢出,因此我们还需要对定时器溢出进⾏处理,防⽌因⾼电平时间过长发⽣溢出导致测量数据不准。
CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即⾼电平持续时间。
⼆、输⼊捕获配置步骤(1)使能定时器及端⼝时钟,并设置引脚复⽤器映射和引脚模式等 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;(2)初始化定时器参数,包含⾃动重装值,分频系数,计数⽅式等 TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);(3)设置通⽤定时器的输⼊捕获参数,开启输⼊捕获功能 TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);(4)开启捕获和定时器溢出(更新)中断 TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)(5)设置定时器中断优先级,使能定时器中断通道 NVIC初始化库函数是 NVIC_Init()(6)使能定时器 TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);(7)编写定时器中断服务函数 void TIM5_IRQHandle()三、代码举例所要实现的功能是:使⽤TIM5的CH1检测输⼊信号⾼电平脉宽,将检测的⾼电平脉宽时间通过printf函数打印出来,同时让D1指⽰灯不断闪烁表⽰系统正常运⾏。
STM32F103ZE学习笔记(TIM2生成4路不同占空比的PWM)
STM32F103ZE学习笔记(TIM2生成4路不同占空比的PWM)落月风情高工2012-12-23 17:49:43 评分只看楼主 1楼实验内容:利用STM32的一个通用定时器(TIM2)产生4路频率相同(1KHz)占空比不同的PWM。
Ch1占空比75%,Ch2占空比50%,Ch3占空比25%,Ch4占空比10%。
四路输出分别对应PA端口的PA0,PA1,PA2,PA3。
实验目的:掌握通用定时器的基本应用。
(PWM的频率和占空比的计算)STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。
补充一个前期时钟源问题:名为TIMx的定时器有8个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。
其中TIM1&TIM8称为高级控制定时器. APB2可以工作在72MHz下,而APB1最大是36MHz。
定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。
(这个问题纳闷了好久才找到的,主要是没有在意时钟树,唉!)下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。
假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=3 6MHz。
有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
STM32F103时钟部分归纳
学习一款单片机,首先要了解的是它的时钟部分,在网上找到一些stm32F103时钟部分的资料,归纳总结一下。
时钟模块框图如下:仔细看上面这个框图,就可以对F103的时钟有一个清晰的认识了。
三种不同的时钟源可用作系统时钟(SYSCLOCK):HSI振荡器时钟(由芯片内部RC振荡器提供)HSE振荡器时钟(由芯片外部晶体振荡器提供)PLL时钟(通过倍频HIS或HSE振荡器倍频得到)另外还有两个时钟源:LSI内部40kHz低速RC振荡器时钟,用于驱动独立看门狗或选择驱动RTCLSE外部32.768kHz低速外部输入时钟,用于驱动RTC1.当HSI被用于作为PLL时钟的输入时,系统时钟能得到的最大频率是64MHz。
2.用户可通过多个预分频器分别配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。
AHB和APB2域的最大频率是72MHz。
APB1域的最大允许频率是36MHz。
SDIO接口的时钟频率固定为HCLK/2。
3. RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。
通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。
ADC时钟由高速APB2时钟经2、4、6或8分频后获得。
定时器时钟频率由APB1(PCLK1)时钟获得,分配由硬件按以下2种情况自动设置:a. 如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。
b. 否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。
4. FCLK是Cortex-M3的自由运行时钟。
详情见ARM的Cortex-M3技术参考手册。
关于HSE、HIS、PLL、LSE、LSI时钟特性及校准直接参考STM32相关Datasheet。
系统时钟配置过程:配置过程主要对RCC_CR、RCC_CFGR、RCC_CIR这三个寄存器,进行读写访问,配置系统时钟完成后,进行对要使用的相应外设时钟进行使能和配置,不用的外设建议关闭相应的外设时钟(降低功耗)。
STM32定时时间的计算
STM32定时时间的计算在STM32微控制器中,定时器(Timer)通常用于生成基准时间延迟和周期性触发任务。
在计算定时时间时,需要考虑定时器的时钟源、分频因子和自动重装载值等参数。
首先,确定定时器的时钟源。
定时器可以使用内部时钟源(如系统时钟)或外部时钟源(如外部晶振)。
根据实际需求和系统架构,选择合适的时钟源。
分频因子=(定时器时钟频率/所需时钟频率)-1注意,这里所需时钟频率应是定时器触发的频率(即每秒触发的次数)。
然后,确定自动重装载值。
自动重装载值决定了定时器溢出时的触发时间。
溢出时间(即定时时间)由ARR(自动重装载寄存器)和分频因子计算得出。
计算公式为:定时时间=(ARR+1)*(PSC+1)/定时器时钟频率最后,根据计算出的自动重装载值和分频因子设置对应定时器寄存器。
HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) - 初始化定时器基本配置HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) - 启动定时器HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) - 停止定时器HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) - 配置定时器的GPIO和中断等外设需要注意的是,根据不同的STM32系列和型号,定时器的寄存器和函数可能会有所不同,根据具体开发板的参考手册和官方文档进行配置。
综上所述,STM32定时时间的计算主要涉及定时器的时钟源、分频因子和自动重装载值的确定。
根据计算公式和对应的定时器设置函数,可以实现精确的定时时间控制。
在实际应用中,可以根据具体需求灵活调整定时器的参数,以满足系统的要求。
STM32F103RCT6的基本定时器
STM32F103RCT6的基本定时器1、定时器的分类 STM32F103ZET6总共有8个定时器,它们是:TIM1~TIM8。
STM32的定时器分为基本定时器、通⽤定时器和⾼等定时器。
TIM6、TIM7是基本定时器。
基本定时器是只能向上计数的16位定时器,基本定时器只能有定时的功能,没有外部IO⼝,所以没有捕获和⽐较通道。
TIM2、TIM3、TIM4、TIM5是通⽤定时器。
通⽤定时器是可以向上计数,也可以向下计数的16位定时器。
通⽤定时器可以定时、输出⽐较、输⼊捕捉,每个通⽤定时器具有4个外部IO⼝。
TIM1、TIM8是⾼等定时器。
⾼等定时器是是可以向上计数,也可以向下计数的16位定时器。
⾼等定时器可以定时、输出⽐较、输⼊捕捉、还可以输出三相电机互补信号,每个⾼等定时器有8个外部IO⼝。
定时器分类图如下:2、基本定时器 基本定时器没有外部IO⼝,所以它只有定时的功能。
基本定时器只能向上计数,也就是说基本定时器只能递增计数。
基本定时器功能框图如下: 从功能图的1中可以看到,基本定时器的时钟TIMxCLK来⾃内部时钟,该内部时钟为经过APB1预分频器分频后提供的。
基本定时器跟APB1总线时钟的关系如下:如果APB1预分频系数为1,则基本定时器的时钟等于APB1总线时钟。
如果APB1预分频系数不为1,则基本定时器的时钟等于APB1总线时钟经过分频后的2倍。
⽐如APB1总线经过2分频后的时钟为36MHZ,那么基本定时器的时钟就是72MHZ3(36*2)。
功能图中的2是⼀个预分频器,来⾃内部的时钟经过预分器分频后的时钟,⽤来驱动基本定时器的计数器计数。
基本定时器的预分频器是⼀个16位的预分频器,预分频器可以对定时器时钟进⾏1~65536之间的任何⼀个数进⾏分频。
计算⽅式如下: 定时器⼯作时钟 = 来⾃APB1的时钟/(预分频系数+1) 功能图中的3是⼀个16位的计数器,该计数器能能向上计数,最⼤计数值位65535。
STM32定时器定时时间的计算
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)/72 M)*(1+2000)=1秒 */。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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。