总结tim_itconfig函数配置流程,逐条解释代码意思
3CCP

0.1uF
C
1
R
1
0 1
0
G
N
D
0.1uF
C
2
1
2
5
6
4
NE555P
U
1
G
TRIG
C
T
RST
R
N
V
H
2
D
O
R
L
T 5
0
k
DISC
O
V
U
C
T
C
1、硬件电路设计
3
7
8
1
1
1
1
1
4 9 8
3
2
1
0
7
6
5
4
3
2
1
STM32F103RBT6
U2A
VCC5.0
VCC3.3
PA11
PA10
PA9
PA8
PA7
①被测信号是方波。 ②频率范围:1Hz~10MHz 。 ③测量误差≤10-3 。 ④能显示被测信号频率。 ⑤通过功能按键设置,“启”、“停”操作。
13
第五章 STM32片上资源应用 3. STM32F10X外设定时器的 输入捕获结构及应用
1
目录
一.输入捕获的作用 二. 输入捕获的原理 三.STM32F10x输入捕获功能的结构 四.STM32F10x输入捕获的主要库函数 五.STM32F10x输入捕获功能应用 六.小结 七.作业
重点: 1、输入捕获的原理 2、STM32F10x输入捕获功能应用
2
一.输入捕获的作用
嵌入式系统中的捕获,是捕获电脉冲的个数。实质是计数器。 输入捕获是用于脉冲宽度或周期测量。 常应用于电机转速测量、传感器数据获取、频率测量等场合。
ARM暑期讲座三——TIMER应用(一)

步骤五 编写中断服务程序
void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); switch(start){ /*LED1 点亮*/ case 0: GPIO_ResetBits(GPIOF,GPIO_Pin_6); GPIO_SetBits(GPIOF,GPIO_Pin_7); GPIO_SetBits(GPIOF,GPIO_Pin_8); GPIO_SetBits(GPIOF,GPIO_Pin_9); GPIO_SetBits(GPIOF,GPIO_Pin_10); break;…… } if(++start>=5) { start = 0; } } }
2、PWM模式
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由 TIMx_CCRx寄存器确定占空比的信号。 在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1) 或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。 必须通过设置TIMx_CCMRx寄存器的OCxPE位使能相应的预装载寄存器, 最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式 中)使能自动重装载的预装载寄存器。 仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器, 因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位 来初始化所有的寄存器。 OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可 以设置为高电平有效或低电平有效。OCx的输出使能通过(TIMx_CCER和 TIMx_BDTR寄存器中)CCxE、CCxNE、MOE、OSSI和OSSR位的组合 控制。详见TIMx_CCER寄存器的描述。 在PWM模式(模式1或模式2)下,TIMx_CNT和TIMx_CCRx始终在进行比 较,(依据计数器的计数方向)以确定是否符合TIMx_CCRx≤TIMx_CNT或 者TIMx_CNT≤TIMx_CCRx。 根据TIMx_CR1寄存器中CMS位的状态,定时器能够产生边沿对齐的 PWM信号或中央对齐的PWM信号。
STM32通用定时器

STM32通用定时器一、定时器的基础知识三种STM32定时器区别通用定时器功能特点描述:STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括:位于低速的APB1总线上(APB1)16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。
16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。
4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:①输入捕获②输出比较③ PWM 生成(边缘或中间对齐模式)④单脉冲模式输出可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器):①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)③输入捕获④输出比较⑤支持针对定位的增量(正交)编码器和霍尔传感器电路⑥触发输入作为外部时钟或者按周期的电流管理STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。
使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。
STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
定时器框图:倍频得到),外部时钟引脚,可以通过查看数据手册。
也可以是TIMx_CHn,此时主要是实现捕获功能;框图中间的时基单元框图下面左右两部分分别是捕获输入模式和比较输出模式的框图,两者用的是同一引脚,不能同时使用。
二、定时器相关的寄存器和寄存器操作库函数时钟选择, 计数器时钟可以由下列时钟源提供:时钟选择①内部时钟(CK_INT)②外部时钟模式1:外部输入脚(TIx)③外部时钟模式2:外部触发输入(ETR)④内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
Linux系统调用--gettimeofdaysettimeofday函数详解

Linux系统调用--gettimeofdaysettimeofday函数详解Linux系统调用--gettimeofday/settimeofday函数详解【gettimeofday/settimeofday系统调用】功能描述:gettimeofday获取当前时间和时区信息。
settimeofday设置当前时间和时区信息。
只有超级用户可以调用settimeofday,如果存在为NULL的参数,表示不改变某一项信息。
用法:#include <sys/time.h>#include <time.h>int gettimeofday(struct tim *tv, struct timezone *tz);int settimeofday(const struct tim *tv , const struct timezone *tz);参数:tv:对于gettimeofday,指向存放返回的时间信息的缓冲区;对于settimeofday,指向需要设置的时间信息缓冲区。
原型如下struct tim {time_t tv_sec;suseconds_t tv_usec;};tz:时区信息,一般不会被使用。
原型如下struct timezone {int tz_minuteswest;int tz_dsttime;};如果tv或tz某一项为NULL,表示对相关的信息不感兴趣。
操作tim结构体的宏有:#define timerisset(tvp)\((tvp)->tv_sec || (tvp)->tv_usec)#define timercmp(tvp, uvp, cmp)\((tvp)->tv_sec cmp (uvp)->tv_sec ||\(tvp)->tv_sec == (uvp)->tv_sec &&\(tvp)->tv_usec cmp (uvp)->tv_usec)#define timerclear(tvp)\((tvp)->tv_sec = (tvp)->tv_usec = 0)返回说明:成功执行时,返回0。
电机控制进阶2——PID位置控制

电机控制进阶2——PID位置控制描述上篇文章讲解了电机的速度环控制,可以控制电机快速准确地到达指定速度。
本篇来介绍电机的位置环控制,实现电机快速准确地转动到指定位置。
1 位置控制与速度控制的区别回顾上篇,电机速度PID控制的结构图如下,目标值是设定的速度,通过编码器获取电机的转速作为反馈,实现电机转速的控制。
再来看电机位置PID控制,其结构图如下,目标值是设定的位置,通过编码器获取电机累计转动的脉冲数作为反馈,实现电机位置的控制。
所以:对比两张图,速度控制与位置控制的主要区别,就是控制量的不同。
2 核心程序了解了速度控制与位置控制的区别后,下面就可以修改程序。
2.1 编码器相关2.1.1 电机与编码器参数编码器部分,需要根据自己电机的实际参数进行设定,比如我用到的电机:编码器一圈的物理脉冲数为11定时器编码器模式通过设置倍频来实现4倍频电机的减速齿轮的减速比为1:34所以,电机转一圈总的脉冲数,即定时器能读到的脉冲数为11*4*34= 1496。
#define ENCODER_RESOLUTION 11 /*编码器一圈的物理脉冲数*/ #define ENCODER_MULTIPLE 4 /*编码器倍频,通过定时器的编码器模式设置*/ #define MOTOR_REDUCTION_RATIO 34 /*电机的减速比*/ /*电机转一圈总的脉冲数(定时器能读到的脉冲数) = 编码器物理脉冲数*编码器倍频*电机减速比*/ /* 11*4*34= 1496*/ #define TOTAL_RESOLUTION ( ENCODER_RESOLUTION*ENCODER_MULTIPLE*MOTOR_REDUC TION_RATIO )想要了解更多关于编码器的使用,可参照之前的文章: ( /d/1639052.html )2.1.2 定时器编码器模式配置用于编码器捕获的定时器的一些宏定义。
#define ENCODER_TIM_PSC 0/*计数器分频*/#define ENCODER_TIM_PERIOD 65535/*计数器最大值*/#define CNT_INIT 0/*计数器初值*/配置主要关注重装载值,倍频,溢出中断设置。
stm32编码器测速

stm32编码器测速摘要:编码器是⼀种将⾓位移或者⾓速度转换成⼀串电数字脉冲的旋转式传感器。
编码器⼜分为光电编码器和霍尔编码器。
霍尔编码器是有霍尔码盘和霍尔元件组成。
霍尔码盘是在⼀定直径的圆板上等分的布置有不同的磁极。
霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若⼲脉冲信号,为判断转向,⼀般输出两组存在⼀定相位差的⽅波信号。
采集数据⽅式:第⼀种软件技术直接采⽤外部中断进⾏采集,根据AB相位差的不同可以判断正负。
第⼆种硬件技术直接使⽤定时器的编码器模式。
这⾥采⽤第⼆种。
也是⼤家常说的四倍频,提⾼测量精度的⽅法。
其实就是把AB相的上升沿和下降沿都采集⽽已,所以1变4。
⾃⼰使⽤外部中断⽅式实现就⽐较占⽤资源了,所以不建议使⽤。
速度计算⽅法:真实的物理转速:电机转动⼀圈的脉冲数:num1 单位:个单位时间:t 单位:秒单位时间内捕获的脉冲变化数:num2 单位:个(反应电机正反转)电机轮⼦半径:r 单位:m圆周率:pi 单位:⽆速度:speed 单位: mm/s因为半径⽤的是m为单位,速度为mm所以需要乘以1000。
代码:(使⽤TIM2和TIM4两个定时器来测两个轮⼦的速度)将编码器AB相使⽤的引脚设置成定时器的编码器模式,我们根据TIMx->CNT寄存器数据的变化,计算出单位时间内,脉冲的变化值。
然后在定时器中断服务函数中进⾏速度计算。
#include "encoder.h"/**************************************************************************函数功能:把TIM2初始化为编码器接⼝模式⼊⼝参数:⽆返回值:⽆**************************************************************************/void Encoder_Init_TIM2(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端⼝时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //端⼝配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输⼊GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOATIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; //预分频器TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器⾃动重装值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使⽤编码器模式3TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM2, &TIM_ICInitStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除TIM的更新标志位TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM2,0);//===============================================TIM2->CNT = 0x7fff;//===============================================TIM_Cmd(TIM2, ENABLE);}/**************************************************************************函数功能:把TIM4初始化为编码器接⼝模式⼊⼝参数:⽆返回值:⽆**************************************************************************/void Encoder_Init_TIM4(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端⼝时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //端⼝配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输⼊GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOBTIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器⾃动重装值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //选择时钟分频:不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使⽤编码器模式3 TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 10;TIM_ICInit(TIM4, &TIM_ICInitStructure);TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除TIM的更新标志位TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Reset counterTIM_SetCounter(TIM4,0);//===============================================TIM4->CNT = 0x7fff;//===============================================TIM_Cmd(TIM4, ENABLE);}/**************************************************************************函数功能:读取编码器脉冲差值,读取单位时间内的脉冲变化值⼊⼝参数:TIM_TypeDef * TIMx返回值:⽆**************************************************************************/s16 getTIMx_DetaCnt(TIM_TypeDef * TIMx){s16 cnt;cnt = TIMx->CNT-0x7fff;TIMx->CNT = 0x7fff;return cnt;}/**************************************************************************函数功能:计算左右轮速⼊⼝参数:int *leftSpeed,int *rightSpeed返回值:⽆//计算左右车轮线速度,正向速度为正值,反向速度为负值,速度为乘以1000之后的速度 mm/s//⼀定时间内的编码器变化值*转化率(转化为直线上的距离m)*200s(5ms计算⼀次)得到 m/s *1000转化为int数据⼀圈的脉冲数:左:1560右:1560轮⼦半径:0.03m轮⼦周长:2*pi*r⼀个脉冲的距离:左:0.000120830m右:0.000120830m速度分辨率:左: 0.0240m/s右: 0.0240m/s200 5ms的倒数1000 扩⼤分辨率**************************************************************************/void Get_Motor_Speed(int *leftSpeed,int *rightSpeed){//5ms测速 5ms即这⾥说的单位时间*leftSpeed = getTIMx_DetaCnt(TIM4)*1000*200*0.000120830;*rightSpeed = getTIMx_DetaCnt(TIM2)*1000*200*0.000120830;}main.c#include "sys.h"//====================⾃⼰加⼊的头⽂件===============================#include "delay.h"#include "led.h"#include "encoder.h"#include "usart3.h"#include "timer.h"#include <stdio.h>//===================================================================int leftSpeedNow =0;int rightSpeedNow =0;int main(void){GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁⽤JTAG 启⽤ SWDMY_NVIC_PriorityGroupConfig(2); //=====设置中断分组delay_init(); //=====延时函数初始化LED_Init(); //=====LED初始化程序灯usart3_init(9600); //=====串⼝3初始化蓝⽛发送调试信息Encoder_Init_TIM2(); //=====初始化编码器1接⼝Encoder_Init_TIM4(); //=====初始化编码器2接⼝TIM3_Int_Init(50-1,7200-1); //=====定时器初始化 5ms⼀次中断while(1){printf("L=%d,R=%d\r\n",leftSpeedNow,rightSpeedNow);delay_ms(15);}}//5ms 定时器中断服务函数void TIM3_IRQHandler(void) //TIM3中断{if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发⽣与否:TIM 中断源 {TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源Get_Motor_Speed(&leftSpeedNow,&rightSpeedNow);Led_Flash(100);}}。
STM32V3.5固件库函数调用说明(中文版)

STM32V3.5固件库函数调⽤说明(中⽂版)⽬录⽬录 (1)1.变量定义 (4)2.GPIO相关函数 (5)2.1.函数GPIO_Init (5)2.2.函数GPIO_SetBits (6)2.3.函数GPIO_ReadInputDataBit (7)2.4.函数GPIO_ReadOutputDataBit (7)2.5.函数GPIO_PinRemapConfig (8)2.6.函数GPIO_Write (9)2.7.函数GPIO_ReadInputData (10)3.RCC相关函数 (10)3.1.函数RCC_APB2PeriphClockCmd (10)3.2.函数RCC_APB1PeriphClockCmd (11)3.3.函数RCC_AHBPeriphClockCmd (12)3.4.函数RCC_ADCCLKConfig (12)4.SysTick函数——SysTick_Config (12)5.NVIC相关函数 (14)5.1.函数NVIC_Init (14)5.2.函数NVIC_PriorityGroupConfig (17)5.3.函数NVIC_SetPriority (17)6.EXTI相关函数 (17)6.1.函数GPIO_EXTILineConfig (17)6.2.函数EXIT_Init (18)6.3.函数EXTI_GetITStatus (19)6.4.函数EXTI_ClearITPendingBit (19)/doc/998fa6c5900ef12d2af90242a8956bec0975a518.html ART相关函数 (20) 7.2.函数USART_Cmd (21)7.3.函数USART_SendData (21)7.4.函数USART_ReceiveData (22)7.5.函数USART_GetFlagStatus (22)8.6.函数USART_ITConfig (23)8.7.函数USART_GetITStatus (23)8.8.函数USART_ClearFlag (24)8.9.函数USART_ClearITPendingBit (24)8.TIM相关函数 (24)8.1.函数TIM_TimeBaseInit (24)8.2.函数TIM_DeInit (26)8.3.函数TIM_ITConfig (26)8.4.函数TIM_Cmd (27)8.5.函数TIM_GetITStatus (28)8.6.函数TIM_ClearITPendingBit (28)8.7.函数TIM_ARRPreloadConfig (29)8.8.函数TIM_OCxInit (29)8.9.函数TIM_OCxPreloadConfig (30)9.I2C相关函数 (31)9.1.函数I2C_Init (31)9.2.函数I2C_CheckEvent (32)9.3.函数I2C_GetFlagStatus (33)9.4.函数I2C_GenerateSTART (34)9.5.函数I2C_ SendData (35)9.6.函数I2C_ ReceiveData (35)9.7.函数I2C_ Send7bitAddress (35)9.8.函数I2C_ GenerateSTOP (36)10.DMA相关函数 (36)10.1.函数DMA_DeInit (36)10.2.函数DMA_Init (37)10.3.函数DMA_Cmd (38)11.ADC相关函数 (39)11.1.函数ADC_Init (39)11.2.函数ADC_RegularChannelConfig (40) 11.3.函数ADC_DMACmd (41)11.4.函数ADC_ResetCalibration (42)11.5.函数ADC_GetResetCalibrationStatus (42) 11.6.函数ADC_StartCalibration (42)11.7.函数ADC_GetCalibrationStatus (42) 11.8.函数ADC_SoftwareStartConvCmd (43) 11.9.函数ADC_TampSensorVrefintCmd (43) 1.变量定义CMSIS IO类型限定词固件库与CMSIS数据类型对⽐注:__IO表⽰告诉编译器这个变量存在RAM中。
通用定时器的定时与比较输出(PWM)

通⽤定时器的定时与⽐较输出(PWM)定时器的基本组成STM32的定时器1、基本定时器基本定时器:TIM6 和 TIM7基本定时器基本上只有定时功能。
基本定时器TIM6和TIM7各包含⼀个16位⾃动装载计数器,由各⾃的可编程预分频器驱动。
预分频器分频之后的 “计数频率” ,给计数器提供时钟,计数器从0开始计数,计数到重装值时,从0再次开始计数。
通⽤定时器通⽤定时器:TIM2、3、4、5在定时的功能上,输⼊捕获、输出⽐较输⼊捕获:可以⽤来检测IO上电平变化之间的时间间隔。
输出⽐较:可以⽤来控制IO输出电平⾼低的时间。
PWM、⽤来进⾏编码器的检测⾼级控制定时器⾼级控制定时器:TIM1、TIM8定时功能、输⼊捕获、输出⽐较、死区时间的控制、互补PWM输出⼀般我们会⽤于的电机控制:电桥电路电机STM32F103R8 ⾼级控制定时器:1个; 通⽤定时器:3个STM32通⽤定时器---定时通⽤定时器简介时钟源:外部时钟:输⼊通道上来的电平内部触发输⼊:将另⼀个定时器的作为当前定时器时钟输⼊分频值:可以多少分频:1-65536 216计数器的计数范围216重装载值的范围216向上计数:从0,1,2,3,4 ......装载值 (触发中断)向下计数:装载值.......4,3,2,1,0 (触发中断)时钟源的选择内部时钟如果禁⽌了从模式控制器(TIMx_SMCR寄存器的SMS=000),则CEN、 DIR是事实上的控制位,并且只能被软件修改。
只要CEN位被写成’1’,预分频器的时钟就由内部时钟CK_INT提供。
所以说,只要不开启从模式,使能CEN位,时钟源就是内部时钟源;也就是72MHz。
stm32f103C8的通⽤定时器时钟AHB的时钟选择是72MHz,APB1的分频是2分频,APB1的时钟是36MHz。
APB1的分频是2分频,所以TIMx_CLK的时钟源频率是 36*2 = 72MHz。
分频系数的设置预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
总结tim_itconfig函数配置流程,逐条解释代码意思标题: 总结tim_itconfig函数配置流程,逐条解释代码意思
正文:
在嵌入式系统中,定时器是常用的硬件模块,它可以用来产生精确的定时中断。
由于定时器的配置过程较为复杂,通常会提供一个配置函数来简化配置流程。
tim_itconfig函数就是这样一个配置定时器中断的函数。
下面将逐条解释代码的意思。
1. TIM_TypeDef *TIMx: 定义了一个指针TIMx,用于指向定时器的基地址。
TIM_TypeDef是一个结构体类型,它定义了定时器寄存器的地址偏移量。
2. uint16_t TIM_IT: 定义了一个16位的无符号整型变量TIM_IT,用于表示定时器中断的类型。
其中每个比特位对应一个中断类型,可以通过位掩码的方式来设置多个中断类型。
3. FunctionalState NewState: 定义了一个枚举类型变量NewState,用于表示定时器中断的使能状态。
该枚举类型有两个取值:ENABLE
和DISABLE,分别表示使能和禁止。
4. assert_param(IS_TIM_ALL_PERIPH(TIMx)): 这是一个宏定义,在编译时会进行参数的合法性检查。
如果TIMx不是一个合法的定时器基地址,编译器会报错。
5. assert_param(IS_TIM_IT(TIM_IT)): 这是一个宏定义,在编译时会进行参数的合法性检查。
如果TIM_IT不是一个合法的定时器中断类型,编译器会报错。
6. assert_param(IS_FUNCTIONAL_STATE(NewState)): 这是一个宏定义,在编译时会进行参数的合法性检查。
如果NewState不是一个合法的枚举值,编译器会报错。
7. if (NewState != DISABLE):判断NewState是否为DISABLE,如果不是,则进入if语句。
8. TIMx->DIER |= TIM_IT:将TIM_IT设置到定时器的中断使能寄存器DIER中。
这里使用了位或操作符,可以将TIM_IT对应的比特位置1。
9. else:如果NewState为DISABLE,则执行else语句。
10. TIMx->DIER &= (uint16_t)~TIM_IT:将TIM_IT取反后,与定时
器的中断使能寄存器DIER进行位与操作。
这里使用了位与操作符,可以将TIM_IT对应的比特位清零,从而禁止相应的中断。
通过调用tim_itconfig函数,可以方便地配置定时器的中断类型和中断使能状态。
用户只需要传入相应的参数,函数内部会根据参数进行相应的配置操作。
这样可以大大简化了定时器中断的配置流程,提高了开发效率。