STM32F103单片机TIM1定时器

毕业后工作首次使用STM32F103单片机(这里将作为日常学习与开发的调试记录)

调试呼吸灯功能使用TIM1\2\3\4\5定时器。
在调试过程中使用相同的配置,对定时器进行配置,但是发现对TIM1定时器CH4通道4,进行配置时,未能如愿实现功能在查看手册以及网上资料的时候发现对高级定时器如TIM1,必须对TIM_CtrlPWMOutputs进行使能。

	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//使能定时器1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM5, ENABLE);	//使能定时器2、3、4、5时钟
	
	
	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);  //使能GPIOA、B、C外设和AFIO复用功能模块时钟

GPIO_PinRemapConfig(GPIO_FullRemap_TIM2|GPIO_FullRemap_TIM3, ENABLE); //Timer2部分重映射PB10\PB11,Timer3完全重映射       //TIM3_CH2->PC6789     TIM1CH4 TIM4 TIM5未使用映射  GPIO_PartialRemap_TIM1|

   //设置该引脚为复用输出功能,输出TIM1的PWM脉冲波形	GPIOA.11
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
   //初始化TIM1
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	//初始化TIM1 Channe4 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OC4
	TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR2上的预装载寄存器
	TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能,高级定时器必须开启这个

在添加后实现PWM功能。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103单片机内部集成了多个定时器,其中包括基本定时器、通用定时器和高级定时器。这些定时器可以用来产生定时中断、PWM波形输出等功能,非常实用。 下面以通用定时器TIM2为例,介绍如何使用STM32F103单片机定时器功能。 首先,需要初始化定时器。以下是一个简单的定时器初始化函数: ```c void TIM2_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 999; //设置自动重装值,即计数器自动重置的值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; //设置分频系数,即将TIM2的时钟频率分频到72MHz/72=1MHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数器为向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_Cmd(TIM2, ENABLE); //使能TIM2定时器 } ``` 在上面的函数中,首先需要开启TIM2的时钟,然后设置自动重装值、分频系数、时钟分割和计数器模式等参数,最后使能定时器即可。 接下来,可以通过中断来实现定时器功能。以下是一个简单的定时器中断程序: ```c void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM2更新中断是否发生 { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除TIM2更新中断标志位 //在此处添加需要执行的代码 } } ``` 在上面的中断程序中,首先检查TIM2更新中断是否发生,如果发生则清除中断标志位,并在此处添加需要执行的代码即可。 最后,需要在主函数中开启定时器中断,如下所示: ```c int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断优先级分组为2 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //选择TIM2定时器中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道 NVIC_Init(&NVIC_InitStructure); TIM2_Init(); //初始化TIM2定时器 while(1) { } } ``` 在上面的主函数中,首先设置NVIC中断优先级分组为2,然后初始化TIM2定时器,并开启TIM2定时器中断。最后进入死循环,等待定时器中断发生。 使用以上代码,即可在STM32F103单片机上实现定时器功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值