1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【蓝桥杯嵌入式】【STM32】4_TIM之定时器及其中断 PWM初探

【蓝桥杯嵌入式】【STM32】4_TIM之定时器及其中断 PWM初探

时间:2018-12-03 17:56:16

相关推荐

【蓝桥杯嵌入式】【STM32】4_TIM之定时器及其中断 PWM初探

文章目录

1、定时器中断2、定时器输出PWM3、定时器复用功能重印象表

下载工程文件:

/Joseph_Cooper/blue-bridge-embedded

1、定时器中断

定时器的分类:

定时器的三种计数模式:

向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

通用定时器框图:

定时器和总线对应关系:

实验:在LCD屏幕上每秒滚动显示字符。

配置步骤:

    (1)、TIM3 时钟使能。

    (2)、初始化定时器参数,设置自动重装值,分频系数,计数方式等

    (3)、设置 TIM3_DIER 允许更新中断。

    (4)、TIM3 中断优先级设置。

    (5)、允许 TIM3 工作,也就是使能 TIM3。

    (6)、编写中断服务函数。

TIM.c:

#include "Headfile.h"u8 TimCount = 0;//Tout = (ARR+1)(PSC+1)/Tclk 时间计算公式void Timer3InteruptInit(u16 arr, u16 psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;//(1)、TIM3 时钟使能。RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟//(2)、初始化定时器参数,设置自动重装值,分频系数,计数方式等TIM_TimeBaseInitStructure.TIM_Period = arr;//自动重装值TIM_TimeBaseInitStructure.TIM_Prescaler = psc;//分频系数TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数方式TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//(3)、设置 TIM3_DIER 允许更新中断。TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//(4)、TIM3 中断优先级设置。NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器//(5)、允许 TIM3 工作,也就是使能 TIM3。TIM_Cmd(TIM3,ENABLE);}//(6)、编写中断服务函数。void TIM3_IRQHandler(void){if(TIM_GetFlagStatus(TIM3,TIM_FLAG_Update) == SET){TIM_ClearITPendingBit(TIM3,TIM_IT_Update);}TimCount ++;LCD_DisplayStringLine(Line4 ,&(TimCount));}

main.c:

#include "Headfile.h"//Main Bodyint main(void){SysTick_Config(SystemCoreClock/1000);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);Timer3InteruptInit(9999,7199);//1sLEDInit();Delay_Ms(100);STM3210B_LCD_Init();LCD_Clear(Blue);LCD_SetBackColor(Blue);LCD_SetTextColor(White);LCD_DisplayStringLine(Line4 ,(unsigned char *)" Hello,world. ");LCD_Clear(Blue);while(1);}

2、定时器输出PWM

TIM3重映射表:

两种PWM_OC_MODE:

    PWM1模式:向上计数时,一旦TIMx_CNT<TIMx_CCR3时通道3为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道3为无效电平。

则为有效电平(OC1REF=1)。

    PWM2模式:在向上计数时,一旦TIMx_CNT<TIMx_CCR3时通道3为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR3时通道3为有效电平。

(有效电平是高电平还是低电平可以在TIM_OCPolarity设置。)

下面是PWM2模式(有效电平是高电平)示意图:

实验:LD1、LD2(PC8、PC9)呼吸灯交替闪烁。

配置步骤:

    (1)开启 TIM3 时钟以及复用功能时钟,配置 PB8、PB9 为复用输出。

    (2)、设置 TIM3_CH3 TIM3_CH4 重映射到 PB8、PB9 上。

    (3)、初始化 TIM3,设置 TIM3 的 ARR 和 PSC。

    (4)、设置 TIM3_CH3(4) 的 PWM 模式,使能 TIM3 的 CH3 (4)输出。

    (5)、修改 TIM3_CCR3、TIM3_CCR4 来控制占空比。

TIM.c:

#include "Headfile.h"void Timer3PWMInit(u16 arr, u16 psc){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;//(1)开启 TIM3 时钟以及复用功能时钟,配置 PB8、PB9 为复用输出。RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC,ENABLE);//(2)、设置 TIM3_CH3 TIM3_CH4 重映射到 PB8、PB9 上。GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//通过Datasheet可知PC8和PC9对应TIM3PWM输出为完全重映射GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);//(3)、初始化 TIM3,设置 TIM3 的 ARR 和 PSC。TIM_TimeBaseInitStructure.TIM_Period = arr;TIM_TimeBaseInitStructure.TIM_Prescaler = psc;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//PC8 PWM输出设置TIM3_CH3TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//PWM输出模式TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高TIM_OC3Init(TIM3,&TIM_OCInitStructure);//(4)、设置 TIM3_CH3 的 PWM 模式,使能 TIM3 的 CH3 输出。TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);//PC9 PWM输出设置TIM3_CH4TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC4Init(TIM3,&TIM_OCInitStructure);//(4)、设置 TIM3_CH4 的 PWM 模式,使能 TIM3 的 CH4 输出。TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);//TIM_Cmd(TIM3,ENABLE);}

main.c:

#include "Headfile.h"int main(void){u16 led0pwmval = 0;u8 dir = 1;SysTick_Config(SystemCoreClock/1000);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级LEDInit();//闪灯Delay_Ms(200);LEDCmd(Bit_SET);GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC) & 0x00FF);LEDCmd(Bit_RESET);Delay_Ms(200);LEDCmd(Bit_SET);GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC) | 0xFF00);LEDCmd(Bit_RESET);//LEDCmd(Bit_SET);Timer3PWMInit(899,99);//72000000/900/1000=800Hz ω=72MHz/arr/psc//STM3210B_LCD_Init();//LCD_Clear(Blue);//LCD_SetBackColor(Blue);//LCD_SetTextColor(White);while(1){Delay_Ms(10); if(dir)led0pwmval++;else led0pwmval--;if(led0pwmval>300)dir=0;if(led0pwmval==0)dir=1;//(5)、修改 TIM3_CCR3、TIM3_CCR4 来控制占空比。TIM_SetCompare3(TIM3,led0pwmval);//LD1TIM_SetCompare4(TIM3,301-led0pwmval);//LD2} }

3、定时器复用功能重印象表

Tips:蓝桥板子上使用的是64脚。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。