完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
定时器的基本概念及初始化配置
硬件:STM32F103C8T6 平台: ARM-MDk V5.11 基本构成: 加1/减1 计数器 + 脉冲源 注:当脉冲源来自内部频率固定,构成定时器 当脉冲源来自外部,频率不固定,构成计数器 计数器的启动方式: 内触发:软件触发 外触发:硬件触发;上升沿/下降沿触发 使计数器的工 作与外部信号同步 计数模式: 向上计数 向下计数 向上向下计数 应用: 硬件延时器 周期中断触发源 pwm波等固定波形的形成 定时器: 简化定时器:sys,rtc,看门狗 高级定时器 通用定时器 基本定时器 高级定时器:支持互补输出,可用于pwm电机控制死区 4通道 通用定时器:主要用于定时计数、输入捕获、输出比较 4通道 通用定时器功能包括: 16位向上向下自动装在计数器 16位可编程预分频器 4个独立通道 可以用来作为: 输入捕获 输出比较 pwm生成 单脉冲模式输出 4.可使用外部信号控制定时器与定时器互连 5.可产生中断,事件包括: 更新 触发事件 输出比较 支持增量编码器和霍尔传感器电路 触发输入作为外部时钟或者按周期的电流管理 定时器的时钟源有四个: 内部时钟 CK_INT 外部时钟模式1 外部时钟模式2 内部触发输入 定时器之间相互独立 基本定时器:主要用于驱动dac 0通道 三大功能 时基 = 定时功能 输入捕获 + 时基 = 周期、脉宽测量功能; 输出比较 + 时基 = pwm输出功能 通用定时器默认使用时钟频率:72M #####定时器中断实现步骤: 使能定时器时钟 初始化定时器 开启定时器中断,配置nvic 使能定时器 编写中断服务函数 例程:定时器中断使用 翻转led灯 TIM2的初始化: GPIO初始化: void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStruct;//定义结构体 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIO时钟 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;//管脚定义 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;//设定模式 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType=GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOC,&GPIO_InitStruct); //初始化配置 } NVIC中断使能 void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Enable the TIM2 gloabal Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM2 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能TIM2时钟 /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 5000; //0.5S 计数5000次进入中断 TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_PrescalerConfig(TIM2, 8399, TIM_PSCReloadMode_Immediate); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); } 中断函数内部配置: //翻转pc13状态 void TIM2_IRQHandler(void)//中断函数 { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); GPIO_ToggleBits(GPIOC,GPIO_Pin_13); } } 自行在main函数中使用函数进行初始化 例2:输出100hz、占空比为10%的pwm波 void TIM1_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设时钟使能 //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K 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的时间基数单位 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1预装载使能 TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1预装载使能 TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器 TIM_Cmd(TIM1, ENABLE); //使能TIM1 } main函数中添加 TIM1_Init(999,99) ;//72000000/720/1000 = 10HZ TIM_SetCompare1(TIM1,100); //占空比100/1000 TIM_SetCompare2(TIM1,100); //占空比100/1000 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1786 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1622 浏览 1 评论
1089 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
730 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1941浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
738浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
573浏览 3评论
598浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
560浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 09:39 , Processed in 0.596579 second(s), Total 44, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号