1、36.136.236.336.436.5 定时时间确定:定时时间确定:TN*(PR+1)/FPCLK 计数脉冲个数确定:计数脉冲个数确定:nN*(PR+1)N为内部计数器计数的结果 STM32F10 x集成了集成了8个个16位定时器位定时器(TIM1TIM8),分为两大类,三个级别,分为两大类,三个级别:(1)高级控制定时器:)高级控制定时器:TIM1和和TIM8(连接在(连接在APB2快速外设总线上)快速外设总线上)(2)通用定时器:)通用定时器:TIM2TIM5(连接在(连接在APB1慢速外设总线上)慢速外设总线上)(3)基本定时器:)基本定时器:TIM6和和TIM7(连接在(连接在APB
2、1慢速外设总线上),仅能更新定时慢速外设总线上),仅能更新定时定时器类别定时器类别计数类型计数类型连接总线连接总线及及最高最高频率频率中断中断捕获捕获比较通道比较通道PWMPWM及及互补输出互补输出高级控制定时器高级控制定时器TIM1/TIM8TIM1/TIM8向上向上向下向下上上/下下APB2APB272MHz72MHz刹车、触发刹车、触发、通信通信COM、捕获捕获/比较比较1-4、更新、更新4 4PWMPWM、有有互补输出互补输出通用定时器通用定时器TIM2/TIM3/TIM4/TIM5TIM2/TIM3/TIM4/TIM5向上向上向下向下上上/下下APB1APB136MHz36MHz触发
3、、捕获触发、捕获/比较比较1-4、更新、更新4 4PWMPWM、无无互补互补基本基本定时器定时器TIM6/TIM7向上向上APB1APB1 36MHz36MHz更新更新0 0全无全无 CEN:定时器使能,:定时器使能,1使能,使能,0禁止;禁止;UDIS:禁止更新,:禁止更新,1禁止更新,禁止更新,0允许更新;允许更新;URS:更新请求源,:更新请求源,URS=1只有溢出才更新中断;只有溢出才更新中断;OPM:单脉冲模式,:单脉冲模式,OPM=1在下次更新时停止计数;在下次更新时停止计数;DIR:方向,:方向,DIR=0向上计数,向上计数,DIR=1向下计数;向下计数;CMS1:0:中央对齐模
4、式选择,:中央对齐模式选择,00边沿对齐,边沿对齐,01中央对齐模式中央对齐模式1,10中央对中央对齐模式齐模式2,11中央对齐模式中央对齐模式3,三种中央对齐都是向上向下交替计数,但模式,三种中央对齐都是向上向下交替计数,但模式1是只有在向下计数时被设置,模式是只有在向下计数时被设置,模式2只有在向上计数时被设置,模式只有在向上计数时被设置,模式3只有只有在向上和向下计数时均被设置;在向上和向下计数时均被设置;ARPE:重新重新装载允许,:重新重新装载允许,1为为TIMx_ARR寄存器被装入缓冲器寄存器被装入缓冲器;CKD1:0:时钟因子,决定死区时间是定时器时钟的倍数,:时钟因子,决定死区
5、时间是定时器时钟的倍数,00:1倍,倍,01:2倍,倍,10:4倍,倍,11:保留:保留 TIM6和TIM7TIM1-TIM5/TIM8 UIE:更新中断使能,:更新中断使能,1允许更新中断,允许更新中断,0禁止更新中断;禁止更新中断;CCxIE(x=1,2,3,4):捕获:捕获/比较比较x中断使能,中断使能,1允许捕获允许捕获/比较比较x中断,中断,0禁止;禁止;COMIE:COM中断允许,中断允许,1允许,允许,0禁止;禁止;TIE:触发中断允许,:触发中断允许,1允许,允许,0禁止;禁止;BIE:刹车中断允许,:刹车中断允许,1允许,允许,0禁止;禁止;UDE:更新的:更新的DMA请求允
6、许,请求允许,1允许,允许,0禁止;禁止;CCxDE(x=1,2,3,4):捕获:捕获/比较比较x的的DMA请求,请求,1允许,允许,0禁止;禁止;COMDE:允许:允许COM的的DMA请求,请求,1允许,允许,0禁止;禁止;TDE:允许:允许DMA触发请求,触发请求,1允许,允许,0禁止;禁止;基本基本普通普通高级高级 UIF:更新中断标志,:更新中断标志,1有更新中断,有更新中断,0无更新中断;无更新中断;CCxIF(x=1,2,3,4):捕获:捕获/比较比较x中断标志,中断标志,1有中断,有中断,0无中断;无中断;COMIF:COM中断标志,中断标志,1有中断,有中断,0无中断;无中断;
7、TIF:触发中断标志,:触发中断标志,1有中断,有中断,0无中断;无中断;BIF:刹车中断标志,:刹车中断标志,1有中断,有中断,0无中断;无中断;CCxOF(x=1,2,3,4):捕获:捕获/比较比较x重复重复中断标志,中断标志,1有中断,有中断,0无中断;无中断;预分频器预分频器(TIMx_PSC):决定计数时钟与基准计数时钟的关系:决定计数时钟与基准计数时钟的关系 自动重装载寄存器自动重装载寄存器(TIMx_ARR):重新装入计数初始值:重新装入计数初始值 计数器计数器(TIMx_CNT):当前计数器计数值存放寄存器:当前计数器计数值存放寄存器 捕获捕获/比较寄存器比较寄存器 1(TIM
8、x_CCR1):存放:存放1通道捕获通道捕获/比较寄存器值比较寄存器值 捕获捕获/比较寄存器比较寄存器2(TIMx_CCR2):存放:存放2通道捕获通道捕获/比较寄存器值比较寄存器值 捕获捕获/比较寄存器比较寄存器 3(TIMx_CCR3):存放:存放3通道捕获通道捕获/比较寄存器值比较寄存器值 捕获捕获/比较寄存器比较寄存器 4(TIMx_CCR4):存放:存放4通道捕获通道捕获/比较寄存器值比较寄存器值TIM1 和和TIM8 重复计数寄存器重复计数寄存器(TIMx_RCR):存放溢出:存放溢出 次数次数 1、初始化定时器、初始化定时器(1)使能定时器时钟)使能定时器时钟(2)确定定时时间)
9、确定定时时间(3)设置定时器控制寄存器选择计数模式)设置定时器控制寄存器选择计数模式(4)设置定时器控制寄存器使能定时器)设置定时器控制寄存器使能定时器(5)设置中断允许寄存器允许定时中断,初始化定时器中断)设置中断允许寄存器允许定时中断,初始化定时器中断2、设置、设置NVIC进行定时器中断分组设置进行定时器中断分组设置3、编写定时中断服务函数、编写定时中断服务函数 一、用寄存器操作方式使能定时器时钟一、用寄存器操作方式使能定时器时钟RCC-APB1ENR|=(10)|(1APB2ENR|=(111)|(1ARR=10*N-1;/*定时定时 N ms,N可自行更换初始值可自行更换初始值*/TI
10、M3-PSC=SystemCoreClock/10000-1;/*预分频系数预分频系数*/;当当SystemCoreClockF时,有时,有ARR10000*T-1,当,当TN ms时,有时,有ARR10000*N/1000-1=10*N-1用固件库函数操作如下:用固件库函数操作如下:TIM_TimeBaseStructure.TIM_Period=10*N-1;/*重装计数值重装计数值N ms*/TIM_TimeBaseStructure.TIM_Prescaler=SystemCoreClock/10000-1;对于比较中断定时方式下设置预分频寄存器和比较寄对于比较中断定时方式下设置预分频
11、寄存器和比较寄存器值确定定时时间存器值确定定时时间T=CCR*(1+PSC)/F)F为定时器计数时钟,单位为定时器计数时钟,单位Hz,T单位单位sTIM3-ARR=65535;/*重装值重装值FFFF*/TIM3-CCR=10*N;/*定时定时 N ms,N可自行更换初始值可自行更换初始值*/TIM3-PSC=SystemCoreClock/10000-1;/*预分频系数预分频系数*/;SystemCoreClock=FCCR=10000T=10*1000T,当当T1秒时秒时CCR10*1000T10ms=0.01S时,时,CCR10*10TN ms时,时,CCR10*N 用寄存器操作:用寄存
12、器操作:TIMx-CR1&=(1DIER|=1DIER&=(1DIER|=(11)|(12)|(13)|(1CR1|=165536,因此有三种方法解决长时间,因此有三种方法解决长时间的定时,一种预分频弄大,使计数脉冲周期变长,即可延时定时时间;二的定时,一种预分频弄大,使计数脉冲周期变长,即可延时定时时间;二是用变量计中断次数,三是利用高级定时器特有的重新计数寄存器。是用变量计中断次数,三是利用高级定时器特有的重新计数寄存器。假设我们让更新中断假设我们让更新中断 定时定时1秒,则要定时秒,则要定时10秒,只需要重复计数器值为秒,只需要重复计数器值为10即即可。初始化程序为:可。初始化程序为:v
13、oid TIM_Configuration(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);/使能使能TIM1时钟时钟TIM_TimeBaseStructure.TIM_RepetitionCounter=10;/重复计数器为重复计数器为10TIM_TimeBaseStructure.TIM_Period=10*500-1;/500msTIM_TimeBaseStructure.TIM_Prescaler=SystemCoreClock/1
14、0000-1;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/向上计数向上计数TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);/写入相关寄存器写入相关寄存器TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);/允许允许TIM1更新中断更新中断TIM_Cmd(TIM1,ENABLE);/使能定时器使能定时器TIM1 【例例2】对于对于 STM32F10 x利用利用TIM2四个
15、比较通道中断定时,让四个比较通道中断定时,让LED1、LED2、LED3和和LED4指示灯,分别定时指示灯,分别定时1s,0.5s,200ms,100ms让四个指示灯让四个指示灯改变显示状态。改变显示状态。初始化初始化TIM2如下:如下:void TIM_Configuration(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_TimeBaseStruct
16、ure.TIM_Period=65535;TIM_TimeBaseStructure.TIM_Prescaler=(SystemCoreClock/10000)-1;/*预分频预分频*/TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/*向上计数向上计数*/TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Timing;*
17、输出定时模式输出定时模式*/TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Disable;/*输出禁止输出禁止*/TIM_OCInitStructure.TIM_Pulse=CCR1_Val;TIM_OC1Init(TIM2,&TIM_OCInitStructure);TIM_OCInitStructure.TIM_Pulse=CCR2_Val;TIM_OC2Init(TIM2,&TIM_OCInitStructure);TIM_OCInitStructure.TIM_Pulse=CCR3_Val;TIM_OC3Init(TIM2,&T
18、IM_OCInitStructure);TIM_OCInitStructure.TIM_Pulse=CCR4_Val;TIM_OC4Init(TIM2,&TIM_OCInitStructure);TIM_ITConfig(TIM2,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE);TIM_Cmd(TIM2,ENABLE);void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure;NVIC_SetVectorTable(NVIC_VectTab_FLASH,0 x0);N
19、VIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);void TIM2_IRQHandler(void)uint
20、16_t capture=0;if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET)TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);/*是比较中断,清除中断标志是比较中断,清除中断标志*/GPIOD-ODR=1ODR=1ODR=1ODR=17;/*LED4(PD7)*/capture=TIM_GetCapture4(TIM2);TIM_SetCompare4(TIM2,capture+CCR4_Val);控制寄存器 问:初始化时为何不使能问:初始化时为何不使能IWDG时钟?时钟?名称名称描述描述复位值复位值地址地址CRH 控制寄存器
21、高控制寄存器高16位位0 0 x4000 2800 CRL 控制寄存器低控制寄存器低16位位0 0 x4000 2804 PRLH 预分频装载寄存器高预分频装载寄存器高1616位位0 0 x4000 2808 PRLL 预分频装载寄存器低预分频装载寄存器低1616位位0 x8000 0 x4000 280CDIVH预分频分频因子寄存器高预分频分频因子寄存器高1616位位0 0 x4000 2810DIVL预分频分频因子寄存器低预分频分频因子寄存器低1616位位0 x80000 x4000 2814CNTH 计数器寄存器高计数器寄存器高16位位0 0 x4000 2818CNTL 计数器寄存器低
22、计数器寄存器低16位位0 0 x4000 281CALRH闹钟寄存器高闹钟寄存器高16位位 0 xFFFF0 x4000 2820ALRL 闹钟寄存器低闹钟寄存器低16位位 0 xFFFF 0 x4000 2824 位符号描述0 SECIE 秒中断允许位,1允许,0禁止1 ALRIE 闹钟中断允许位,1允许,0禁止2OWIE 溢出中断允许,1允许,0禁止15:3-保留RTC控制寄存器控制寄存器CRH位描述(位描述(16位寄存器)位寄存器)RTC控制寄存器控制寄存器CRL位描述(位描述(16位寄存器)位寄存器)位位符号符号描述描述0 SECF秒标志,秒标志,1表示秒标志条件成立,表示秒标志条件成
23、立,0秒标志条件不成立秒标志条件不成立1 ALRF闹钟标志,为闹钟标志,为1有闹钟,为有闹钟,为0没有闹钟没有闹钟2OWF溢出标志,为溢出标志,为1有溢出,为有溢出,为0无溢出无溢出3RSF寄存器同步标志,为寄存器同步标志,为1寄存器已经被同步,为寄存器已经被同步,为0 没有同步没有同步4CNF配置标志,为表示进入配置模式,为配置标志,为表示进入配置模式,为0表示退出配置模式表示退出配置模式5RTOFFRTCRTC操作关闭,操作关闭,1表示上一次对表示上一次对RTC寄存器的写操作已经完成,寄存器的写操作已经完成,0为写操作仍在进行为写操作仍在进行15:6-保留,用户软件不要向保留位写入保留,用
24、户软件不要向保留位写入1。从保留位读出的值未定义。从保留位读出的值未定义 1.配置配置PWR和和BKP时钟,并使能时钟,并使能BKP备份区域备份区域2.选择时钟源选择时钟源3.RTC时钟使能时钟使能4.使能使能RTC中断中断5.设置时钟分频值设置时钟分频值6.初始化时间初始化时间7.允许操作后备区域允许操作后备区域8.使能秒中断使能秒中断 void RTC_Configuration(void)/*使能使能PWR和和BKP时钟时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);PWR_BackupAc
25、cessCmd(ENABLE);/*允许访问允许访问BKP备份域备份域*/RCC_LSICmd(ENABLE);/*使能内部时钟使能内部时钟*/RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);/*选择选择LSI为为RTC时钟源时钟源*/RCC_RTCCLKCmd(ENABLE);/*RTC时钟使能,单独使能时钟使能,单独使能*/RTC_WaitForSynchro();/*等待等待RTC寄存器同步寄存器同步*/RTC_WaitForLastTask();/*等待最后对等待最后对RTC寄存器的写操作完成寄存器的写操作完成*/RTC_ITConfig(RTC_IT_S
26、EC,ENABLE);/*RTC中断使能中断使能*/RTC_WaitForLastTask();/*等待最后对等待最后对RTC寄存器的写操作完成寄存器的写操作完成*/RTC_SetPrescaler(40000-1);/*设置设置RTC时钟分频值时钟分频值,频率频率=1Hz(1s)*/RTC_WaitForLastTask();/*等待最后对等待最后对RTC寄存器的写操作完成寄存器的写操作完成*/RTC_ITConfig(RTC_IT_SEC,ENABLE);/*使能秒中断使能秒中断*/RTC_WaitForLastTask();/*等待等待RTC最后一次操作完成最后一次操作完成*/1、设置时
27、间(把年月日时分秒总计秒数写入、设置时间(把年月日时分秒总计秒数写入32位的位的RTC计数寄存器)计数寄存器)RTC_DateTimeStructure.Year=17;/初始化年初始化年 RTC_DateTimeStructure.Month=5;/初始化月初始化月 RTC_DateTimeStructure.Date=8;/初始化日初始化日 RTC_DateTimeStructure.Hour=15;/初始化时初始化时 RTC_DateTimeStructure.Minute=30;/初始化分初始化分 RTC_DateTimeStructure.Second=0;/初始化秒初始化秒 RTC
28、_SetDateTime(RTC_DateTimeStructure);/写入相关寄存器写入相关寄存器2、获取时间(、获取时间(32位的位的RTC计数寄存器计算出年月日时分秒)计数寄存器计算出年月日时分秒)RTC_GetDateTime(&RTC_DateTimeStructure);获取的结果在:获取的结果在:RTC_DateTimeStructure.Year RTC_DateTimeStructure.Month RTC_DateTimeStructure.Date RTC_DateTimeStructure.Hour RTC_DateTimeStructure.Minute RTC_D
29、ateTimeStructure.Second 2023年5月14日星期日52/23n初始输出高/低电平n模式1计数到比较器值输出为低/高定时器/计数器重装寄存器ARRPWM模式1波形比较寄存器CCRi每增加一个PWM输出,需增加一个比较寄存器,每个定时器有4个比较器控制PWM周期控制边沿位置模式1输出PWM波形n再计数到重装寄存器值时输出为高/低PWM模式2波形模式2输出PWM波形2023年5月14日星期日53/23n初始输出低/高电平 n计数到比较器值输出为高/低定时器/计数器重装寄存器ARRPWM模式1波形比较寄存器CCRi每增加一个PWM输出,需增加一个比较寄存器,每个定时器有4个比较
30、器控制PWM周期控制边沿位置模式1输出PWM波形n再计数到重装寄存器值时输出为低/高PWM模式2波形模式2输出PWM波形2023年5月14日星期日54/23n初始输出高/低电平n向上计数到比较器值输出为低/高定时器/计数器重装寄存器ARRPWM模式1波形PWM模式2波形比较寄存器CCRi每增加一个PWM输出,需增加一个比较寄存器,每个定时器有4个比较器控制PWM周期控制边沿位置模式1输出PWM波形n计数到重装寄存器值时开始递减计数,输出电平不变n递减计数到比较器值时,输出高/低电平模式2输出PWM波形 引脚引脚STM32F10 xSTM32F10 x引脚引脚别名别名类型类型描述描述TIM1_C
31、H1 TIM1_CH1 PA8/PE9PA8/PE9OC1OC1输出输出TIM1TIM1的的PWMPWM通道通道1 1输出输出TIM1_CH2 TIM1_CH2 PA9/PE11PA9/PE11OC2OC2输出输出TIM1TIM1的的PWMPWM通道通道2 2输出输出TIM1_CH3 TIM1_CH3 PA10/PE13PA10/PE13OC3OC3输出输出TIM1TIM1的的PWMPWM通道通道3 3输出输出TIM1_CH4 TIM1_CH4 PA11/PE14PA11/PE14OC4OC4输出输出TIM1TIM1的的PWMPWM通道通道4 4输出输出TIM2_CH1 TIM2_CH1 PA
32、0/PA15PA0/PA15OC1OC1输出输出TIM2TIM2的的PWMPWM通道通道1 1输出输出TIM2_CH2 TIM2_CH2 PA1/PB3PA1/PB3OC2OC2输出输出TIM2TIM2的的PWMPWM通道通道2 2输出输出TIM2_CH3 TIM2_CH3 PA2/PB10PA2/PB10OC3OC3输出输出TIM2TIM2的的PWMPWM通道通道3 3输出输出TIM2_CH4 TIM2_CH4 PA3/PB11PA3/PB11OC4OC4输出输出TIM2TIM2的的PWMPWM通道通道4 4输出输出TIM3_CH1 TIM3_CH1 PA6/PB4/PC6PA6/PB4/P
33、C6OC1OC1输出输出TIM3TIM3的的PWMPWM通道通道1 1输出输出TIM3_CH2 TIM3_CH2 PA7/PB5/PC7PA7/PB5/PC7OC2OC2输出输出TIM3TIM3的的PWMPWM通道通道2 2输出输出TIM3_CH3 TIM3_CH3 PB0/PC8PB0/PC8OC3OC3输出输出TIM3TIM3的的PWMPWM通道通道3 3输出输出TIM3_CH4 TIM3_CH4 PB1/PC9PB1/PC9OC4OC4输出输出TIM3TIM3的的PWMPWM通道通道4 4输出输出TIM4_CH1 TIM4_CH1 PB6/PD12PB6/PD12OC1OC1输出输出TI
34、M4TIM4的的PWMPWM通道通道1 1输出输出TIM4_CH2 TIM4_CH2 PB7/PD13PB7/PD13OC2OC2输出输出TIM4TIM4的的PWMPWM通道通道2 2输出输出TIM4_CH3 TIM4_CH3 PB8/PD14PB8/PD14OC3OC3输出输出TIM4TIM4的的PWMPWM通道通道3 3输出输出TIM4_CH4 TIM4_CH4 PB9/PD15PB9/PD15OC4OC4输出输出TIM4TIM4的的PWMPWM通道通道4 4输出输出TIM5_CH4 TIM5_CH4 PA3PA3OC4OC4输出输出TIM5TIM5的的PWMPWM通道通道1 1输出输出
35、1、捕获、捕获/比较寄存器比较寄存器TIMx_CCR1/2/3/4TIMx_CCR1TIMx_CCR4分别对于第分别对于第TIMx的第的第1第第4个通道的捕获个通道的捕获/比比较寄存器,它们为较寄存器,它们为16位寄存器,决定各自位寄存器,决定各自PWM通道通道输出输出PWM波形的占波形的占空比空比。2、重装载寄存器、重装载寄存器TIMx_ARR1/2/3/4TIMx_ARR1TIMx_ARR4为定时器为定时器TIMx第第1到第到第4通道的通道的16位重装寄存位重装寄存器。器。决定输出决定输出PWM波形的周期。波形的周期。3、捕获、捕获/比较使能寄存器比较使能寄存器TIMx_CCERTIMx_
36、CCER控制各通道有开关,它是控制各通道有开关,它是16位的寄存器,要让位的寄存器,要让PWM从相应从相应引脚输出,必须使相应位设置为引脚输出,必须使相应位设置为1。4、捕获、捕获/比较模式寄存器比较模式寄存器TIMx_CCMR1/2TIMx_CCMR1和和TIMx_CCMR2分别控制定时器分别控制定时器TIMx的的PWM通道通道1,2和和PWM通道通道3,4的工作模式。的工作模式。1、PWM输出频率输出频率FPWMOUT=FPCLK/(1+TIM_Period)/(1+TIM_Prescaler)(6-5)2、重新寄存器的值、重新寄存器的值TIMx_ARR决定决定PWM输出周期输出周期/频率
37、频率TIMx_ARR=FPCLK/FPWMOUT/(1+TIM_Prescaler)-1 (6-6)3、捕获、捕获/比较寄存器比较寄存器TIMx_CCR决定占空比决定占空比周期确定之后,周期确定之后,PWM输出占空比由捕获输出占空比由捕获/比较寄存器比较寄存器通过分析通过分析6.5.2节边沿对齐和中心对齐方式可知,各通道的节边沿对齐和中心对齐方式可知,各通道的占空比占空比DutyRatio=TIMx_CCRi/TIMx_ARRi i=1,2,3,4 (6-7)1.开启开启TIMx时钟,配置相关引脚为复用时钟,配置相关引脚为复用PWM输出输出2.设置设置TIMx_CHi重映射到输出引脚上重映射到
38、输出引脚上(见(见P.206表表6.5 PWM引脚关系)引脚关系)3.设置设置TIMx的的ARR和和PSC以确定以确定PWM输出频率输出频率4.通过通过TIMx_CCMR1/2配置配置TIMx_CHi的的PWM模式模式5.使能使能TIMx_CHi输出,使能输出,使能TIMx6.根据占空比要求设置根据占空比要求设置TIMx_CCRi PA6引脚输出频率为引脚输出频率为1KHz,占空比从占空比从50%开始上下可通过按键开始上下可通过按键可调整的可调整的PWM波形,并控制直流电机和灯泡。波形,并控制直流电机和灯泡。1、初始化、初始化GPIO(1)初始化)初始化GPIO,使,使PA6为利用推挽输出为利
39、用推挽输出(2)初始化)初始化TIM3为定时为定时1ms(1KHz)自动重装)自动重装(3)配置)配置PWM通道通道(TIM3-CH1)及占空比及占空比2、主循环体通过按键、主循环体通过按键KEY1增加占空比,按增加占空比,按KEY2减小占空比减小占空比 void PWM_GPIO_Init(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);/使能使能A端口和多功能端口和多功能IO时钟时钟GPIO_InitStructu
40、re.GPIO_Pin=GPIO_Pin_6;/PA6引脚引脚TIM4对应的对应的CH1GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;/复用输出推挽复用输出推挽GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/速度为速度为50MGPIO_Init(GPIOA,&GPIO_InitStructure);/将端口将端口GPIOD进行初始化配置进行初始化配置 void Init_TIMER(void)TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;/定义一个定时器结构
41、体变量定义一个定时器结构体变量RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);/使能定时器使能定时器4,重要!,重要!TIM_DeInit(TIM3);/将将TIM3定时器初始化位复位值定时器初始化位复位值TIM_InternalClockConfig(TIM3);/配置配置 TIM3 内部时钟内部时钟TIM_BaseInitStructure.TIM_Period=7200-1;/0.1ms 10KHz TIM_BaseInitStructure.TIM_Prescaler=0;TIM_BaseInitStructure.TIM_Cloc
42、kDivision=TIM_CKD_DIV1;/时钟分割为时钟分割为0TIM_BaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;/TIM向上计数模式向上计数模式 TIM_TimeBaseInit(TIM3,&TIM_BaseInitStructure TIM_ARRPreloadConfig(TIM3,ENABLE);/使能使能TIMx在在 ARR 上的预装载寄存器上的预装载寄存器 TIM_Cmd(TIM3,ENABLE);/使能使能TIM3 void Init_PWM(uint16_t Dutyfactor)TIM_OCInitType
43、Def TIM_OCInitStructure;TIM_OCStructInit(&TIM_OCInitStructure);/设置缺省值设置缺省值TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;/PWM 模式模式 1 输出输出 TIM_OCInitStructure.TIM_Pulse=Dutyfactor;/设置占空比,占空比设置占空比,占空比=(CCRx/ARR)*100%或或(TIM_Pulse/TIM_Period)*100%TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;/T
44、IM 输出比较极性高输出比较极性高 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;/使能输出使能输出TIM_OC1Init(TIM3,&TIM_OCInitStructure);/根据参数初始化根据参数初始化PWM寄存器寄存器 通道通道1(PA6)TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);/使能使能 TIMx在在 CCR1 上的预装载寄存器上的预装载寄存器 TIM_CtrlPWMOutputs(TIM3,ENABLE);/设置设置TIM3 的的PWM 输出为使能输出为使能 TIM_SetCompare1(TIM3,Pulse);/设置比较器CCR1的值