打印
[应用相关]

STM32高级控制定时器1学习

[复制链接]
571|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
高级控制定时器(Tim1)是由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。
用途在于:测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补PWM等)。
使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
具体如下:

16位上下,自动装载计数器。
16位可编程预分频器,计数器时钟频率的分频率的分频系数为1-65535之间任意数值
4个独立通道:
输入捕获
输出比较
PWM生成
单脉冲模式输出
死区时间可编程的互补输出
使用外部信号控制定时器和定时器互连的同步电路
在指定数目的计数器周期之后更新定时器寄存器
刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
如下事件发生时产生中断:
更新:计数器向上溢出或者向下溢出,计数器初始化。
触发事件(计数器启动,停止,初始化)
输入捕获
输出比较
刹车信号输入

使用特权

评论回复
沙发
工程师犹饿死|  楼主 | 2022-4-29 17:39 | 只看该作者
今天我们来实现用tim1实现计数器的功能:

步骤一:进行定时器时钟启动:

void tim1_on()
{
  //Step1.时钟设置:启动TIM1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  

}

使用特权

评论回复
板凳
工程师犹饿死|  楼主 | 2022-4-29 17:40 | 只看该作者
步骤二:实现对定时器的配置(对其内部寄存器进行配置初始化)

//Step2.TIM1模块设置
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;  //比较PWM的时候用。

//TIM1 使用内部时钟
//TIM_InternalClockConfig(TIM1);

//TIM1基本设置
//设置预分频器分频系数71,即APB2=72M, TIM1_CLK=72/72=1MHz
//TIM_Period(TIM1_ARR)=1000,计数器向上计数到1000后产生更新事件,计数值归零
//向上计数模式
//TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都产生更新事件
TIM_BaseInitStructure.TIM_Period = 1000;
TIM_BaseInitStructure.TIM_Prescaler = 71;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);

//清中断,以免一启用中断后立即产生中断
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
//使能TIM1中断源
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

//TIM1总开关:开启
TIM_Cmd(TIM1, ENABLE);
}

根据上面的提示,我们可以看到1000*1/1MHz=1ms的时候进入中断一次。

使用特权

评论回复
地板
工程师犹饿死|  楼主 | 2022-4-29 17:42 | 只看该作者
步骤三:对定时器中断进行优先级别设置:

void NVIC_Configuration(void)
{  
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif

//Step3.中断NVIC设置:允许中断,设置优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;    //更新事件
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断
NVIC_Init(&NVIC_InitStructure);                            //写入设置

}

将这里基本设施都能好了。

使用特权

评论回复
5
工程师犹饿死|  楼主 | 2022-4-29 17:45 | 只看该作者
我们可以进行中断函数的设置,就是进入中断要干什么。

tim1中断有:

TIM1_BRK_IRQHandler(void) //tim1的暂停中断

TIM1_CC_IRQHandler(void)//tim1的捕获比较中断

TIM1_TRG_COM_IRQHandler(void)//tim1的触发

TIM1_UP_IRQHandler(void)//tim1的刷新中断和通讯中断。

我们使用的是向上计数的模式,所以要进入向上计数的中断:

void TIM1_UP_IRQHandler(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_12);
delay_nms(100);                       //闪灯
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断

}

使用特权

评论回复
6
工程师犹饿死|  楼主 | 2022-4-29 17:47 | 只看该作者
将所有的准备工作的做好了,我们开始写main函数()

如下:

  /* 系统时钟初始化 */
  RCC_Configuration();
  /* Led_IO 口初始化 */
  ledGPIO_init();
  /*Key_IO 口初始化*/
  //key_init();
  tim1_on();
  TIM_Configuration();
  NVIC_Configuration();

  while(1)
  {

  }

这样就完成了定时器1的计数器功能。

使用特权

评论回复
7
qbwww| | 2022-10-2 16:14 | 只看该作者
测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补PWM等)。
使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。

使用特权

评论回复
8
AloneKaven| | 2022-10-7 20:31 | 只看该作者
学习了

使用特权

评论回复
9
Pulitzer| | 2022-10-8 07:21 | 只看该作者

系统时钟通过AHB预分频器,给相对应的外设设置相对应的时钟频率

使用特权

评论回复
10
Uriah| | 2022-10-8 14:22 | 只看该作者

TIM4正常中断,UART1串口发送正常,就是串口接收中断进不去。

使用特权

评论回复
11
Bblythe| | 2022-10-8 17:21 | 只看该作者

保存当前被执行函数的上下文

使用特权

评论回复
12
Pulitzer| | 2023-7-1 07:21 | 只看该作者

当PWM频率较高时,频繁的中断将影响程序运行的效率

使用特权

评论回复
13
公羊子丹| | 2023-7-1 08:24 | 只看该作者

核心模块被封装成了一个函数

使用特权

评论回复
14
公羊子丹| | 2023-7-1 09:17 | 只看该作者

这是个再正常不过的coding习惯

使用特权

评论回复
15
Wordsworth| | 2023-7-1 10:20 | 只看该作者

单片机的外部都连接有象电池等电源部分

使用特权

评论回复
16
Clyde011| | 2023-7-1 11:23 | 只看该作者

时钟信号推动单片机内各个部分执行相应的指令

使用特权

评论回复
17
万图| | 2023-7-1 13:19 | 只看该作者

待向GPIO(通用I/O端口)的输入从0变为1时,程序可以一定的间隔来检查GPIO的状态

使用特权

评论回复
18
Uriah| | 2023-7-1 14:22 | 只看该作者

A直接通过B声明的函数调用即可

使用特权

评论回复
19
帛灿灿| | 2023-7-1 16:18 | 只看该作者

CPLD解密,DSP解密都习惯称为单片机解密

使用特权

评论回复
20
Bblythe| | 2023-7-1 17:21 | 只看该作者

只有一块PCB,其上有一个12MHz的晶体

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

886

帖子

0

粉丝