引脚和定时器初始化TIM2_Configuration
我们使用TIM2作为普通的定时器,一秒以后将LED循环的点亮和关闭,结构体初始化函数如下:
void TIM2_Configuration(void)
{
//首先申明一个初始化结构体和开启定时器时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period=1000;
//时钟为72M,我们用TIM_Prescaler=71,则时钟为1M
//设置TIM_Period=1000,则1ms进行一次溢出
TIM_TimeBaseStructure.TIM_Prescaler= (72 - 1);
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//清更新FLAG,使能中断和先关闭时钟。
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE);
}
用下面的语句对LED进行取反操作,如下:
if((GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_7 )))
GPIO_ResetBits(GPIOF, GPIO_Pin_7 );
else
GPIO_SetBits(GPIOF, GPIO_Pin_7);
中断服务程序
中断优先级配置函数如下:
void TIM2_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
服务程序如下:
void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
time++;
}
}
标准库函数
初始化函数
TIM_TimeBaseInit,以及去初始化TIM_DeInit
- 功能:定时器结构体初始化,开启定时器必须用到
- 函数入口:见上文,主要设置时钟分频和计时器模式
uint16_t TIM_ClockDivision
uint16_t TIM_CounterMode
uint16_t TIM_Period
uint16_t TIM_Prescaler
uint8_t TIM_RepetitionCounter
输入捕获模式下的初始化函数
初始化 ICStructInit ICInit TIM_TimeBaseStructInit
- 功能:输出比较功能的初始化结构体,一共有4个IC
- 函数入口:TIMx 和结构体
uint16_t TIM_Channel //4通道
uint16_t TIM_ICFilter //滤波
uint16_t TIM_ICPolarity //
uint16_t TIM_ICPrescaler //
uint16_t TIM_ICSelection //是否直连
TI1_Config
- 功能:将某个引脚作为捕获输入,对引脚进行配置
- 函数入口:4个
- 定时器1
- 极性,上升沿OR下降沿
- 模式:引脚输入1直接输入捕获模块1
- 滤波:具体数值
- 函数输出:void
输出比较模式下的初始化函数
初始化 TIM_OC1Init
- 功能:输出比较功能的初始化结构体,一共有4个OC
- 函数入口:TIMx 和结构体
uint16_t TIM_OCIdleState //闲置时的状态
uint16_t TIM_OCMode //激活,PWM,定时OR反转
uint16_t TIM_OCNIdleState //
uint16_t TIM_OCNPolarity //输出极性,高低电平
uint16_t TIM_OCPolarity
uint16_t TIM_OutputNState
uint16_t TIM_OutputState //比较输出的状态,使能OR
uint16_t TIM_Pulse //捕获比较寄存器的值
重载配置 TIM_OC1PreloadConfig
- 功能:TIMx 重载功能使能
- 函数入口:TIMx ENABLE
极性和N极性的配置OC1PolarityConfig和OC1NPolarityConfig
- 功能:略
- 函数入口:TIMx和HIGH和LOW
快速功能配置 OC1FastConfig
- 功能:TIMx快速功能使能
- 函数入口:TIMx ENABLE
内部时钟配置 InternalClockConfig
- 功能:使能定时器的内部时钟
PWM输入功能设置 TIM_PWMIConfig
- 功能:配置以测量外部PWM的占空比
- 为外部捕获功能,所以初始化结构体如IC的初始化结构
TIM_BDTRConfig
- 功能:仅限高级定时器
TIM_Cmd 定时器打开
TIM_ITConfig 中断配置功能
- 功能:TIMx 中断配置源使能
- 函数入口:中断源有如下定义的多种
#define TIM_IT_Update ((uint16_t)0x0001)
#define TIM_IT_CC1 ((uint16_t)0x0002)
#define TIM_IT_CC2 ((uint16_t)0x0004)
#define TIM_IT_CC3 ((uint16_t)0x0008)
#define TIM_IT_CC4 ((uint16_t)0x0010)
#define TIM_IT_COM ((uint16_t)0x0020)
#define TIM_IT_Trigger ((uint16_t)0x0040)
#define TIM_IT_Break ((uint16_t)0x0080)
TIM_GenerateEvent 事件配置功能
- 功能:TIMx 事件配置源使能
- 函数入口:事件源有如下定义的多种,同上
- 事件和中断的区别就是,中断需要转中断服务程序,而事件则自动触发动作,属于硬件完成
DMA配置TIM_DMAConfig
- 函数入口
- TIMx
- TIM_DMABase:DMA可以存储如下的寄存器,如TIM_DMABase_CR, TIM_DMABase_CR2, TIM_DMABase_SMCR,
- TIM_DMABurstLength:可以是1Transfer和18Transfer
DMA的命令参数TIM_DMACmd
- 函数入口
- TIMx
- TIM_DMASource:TIM_DMA_Update或者其他源TIM_DMA_CC1和TIM_DMA_Trigger等
- NewState:使能
TIM_ITRxExternalClockConfig
- 功能:外部时钟模式1,有多种时钟源
TIM_TIxExternalClockConfig
- 功能:另一种外部时钟,设置稍复杂一点
ETR时钟TIM_ETRClockMode1Config和TIM_ETRConfig
- 功能:高级定时器用到
TIM_PrescalerConfig
- 功能:分频设置
TIM_SelectInputTrigger
- 功能:多种输入触发可选
TIM_EncoderInterfaceConfig
- 功能:编码器功能配置
TIM_ForcedOC1Config
- 功能:强制输出配置
TIM_ARRPreloadConfig
- 功能:ARR重载
TIM_SelectCOM
- 功能:高级功能
TIM_SelectCCDMA
- 功能:捕获比较的DMA设置
TIM_CCPreloadControl
- 功能:捕获比较的重载设置
TIM_OC1PreloadConfig
- 功能:输出的重载设置
TIM_OC2FastConfig
- 功能:快速性能设置
TIM_ClearOC1Ref
- 功能:清OC
TIM_CCxCmd TIM_CCxNCmd
- 功能:
TIM_SelectOCxM
- 功能:选择OC模式