做网站需要哪些审核,深圳酒店品牌设计公司,品牌网站推广方案,微信小程序 网站开发PY32F003F18定时器有TIM1#xff0c;TIM3#xff0c;TIM14#xff0c;TIM16和TIM17。其中TIM1为高级定时器#xff0c;其它为通用定时器。见下表#xff1a; 一、PY32F003F18定时器的工作模式#xff1a;
1、边沿对齐模式
计数器工作在边沿对齐模式 设置TIM3TIM14TIM16和TIM17。其中TIM1为高级定时器其它为通用定时器。见下表 一、PY32F003F18定时器的工作模式
1、边沿对齐模式
计数器工作在边沿对齐模式 设置TIMx控制寄存器1(TIMx_CR1)的DIR和TIMx控制寄存器1(TIMx_CR1)的CMS[1:0] CMS[1:0]00配置TIMx为边沿对齐模式当DIR0时计数器向上计数当DIR1时,计数器向下计数
计数器使用内部时钟源 如果从模式控制器被禁止则CEN、DIRTIMx_CR1 寄存器和UG 位TIMx_EGR 寄存器是事实上的控制位并且只能被软件修改。只要CEN 位被写成1预分频器的时钟就由内部时钟CK_INT 提供。
2、中央对齐模式1
3、中央对齐模式2
4、中央对齐模式3 在中央对齐模式中计数器从0开始计数到自动加载的值(TIMx_ARR 寄存器)会产生一个计数器溢出事件然后向下计数 当计数器计数到1时也会产生一个计数器下溢事件然后再从0开始重新计数这样循环往复开始计数。所以计数器中断时间不变。 计数器工作在中央对齐模式 设置TIMx控制寄存器1(TIMx_CR1)的CMS[1:0] 1、CMS[1:0]01配置TIMx为中央对齐模式1计数器交替地向上和向下计数若配置为输出通道的则在计数器向下计数时,OCx的输出比较中断标志位被置1 2、CMS[1:0]10配置TIMx为中央对齐模式2计数器交替地向上和向下计数若配置为输出通道的则在计数器向上计数时,OCx的输出比较中断标志位被置1 3、CMS[1:0]11配置TIMx为中央对齐模式3计数器交替地向上和向下计数若配置为输出通道的则在计数器向上/向下计数时,OCx的输出比较中断标志位被置1
计数器使用内部时钟源 如果从模式控制器被禁止则CEN、DIRTIMx_CR1 寄存器和UG 位TIMx_EGR 寄存器是事实上 的控制位并且只能被软件修改。只要CEN 位被写成1预分频器的时钟就由内部时钟CK_INT 提供。
二、计数器使用内部时钟源的时序图 三、测试程序
#include TIM1_COUNTERMODE_UP.h
#include LED.h
#include MyTimer.h/*
计数器工作在边沿对齐模式
//将TIMx控制寄存器1(TIMx_CR1)的DIR0
//将TIMx控制寄存器1(TIMx_CR1)的CMS[1:0]00B
//CMS[1:0]00配置TIMx为边沿对齐模式当DIR0时计数器向上计数当DIR1时,计数器向下计数计数器使用内部时钟源
如果从模式控制器被禁止则CEN、DIRTIMx_CR1 寄存器和UG 位TIMx_EGR 寄存器是事实上
的控制位并且只能被软件修改。只要CEN 位被写成1预分频器的时钟就由内部时钟CK_INT 提供。
*/void TIM1_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc);//函数功能:TIM1中基本计数功能,并使能了更新中断,每次重装ARR值时会产生一次更新中断
//arr自动重装值。
//psc时钟预分频数
//TIM1_COUNTERMODE_UP_Init(20000,240);//若使用HSE当arr20000,psc240时,则为200ms,误差为10us;
//TIM1_COUNTERMODE_UP_Init(20000,80);//若使用HSI当arr20000,psc80时,则为200ms,误差为10us;
void TIM1_COUNTERMODE_UP_Init(uint16_t arr,uint16_t psc)
{TIM_Base_InitTypeDef TIM_Base_InitStructure;
// TIM_HandleTypeDef TIM1_HandleStructure;__HAL_RCC_TIM1_CLK_ENABLE(); //使能TIM1时钟HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0, 0); //设置中断优先级HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn); //使能TIM1中断TIM_Base_InitStructure.Period arr-1;//设置在下一个更新事件产生时装入自动重载入寄存器TIMx_ARR的值//将(1600 - 1)写入自动重载入寄存器TIMx_ARR,设置自动重装载值TIM_Base_InitStructure.Prescaler psc-1;//设置用来作为TIMx时钟频率除数的预分频值//将(1000-1)写入预装载寄存器TIMx_PSC,的PSC[15:0],设置预分频值//计数器的时钟频率CK_CNTfCK_PSC/(PSC[15:0]1)TIM_Base_InitStructure.ClockDivision TIM_CLOCKDIVISION_DIV1; //时钟不分频,则tDTStCK_INT//若使用HSE计算公式:arr*psc/24000000/1,当arr20000,psc240时,则为200ms,误差为10us;//若使用HSI计算公式:arr*psc/8000000/1,当arr20000,psc80时,则为200ms,误差为100us;TIM_Base_InitStructure.CounterMode TIM_COUNTERMODE_UP; //计数器向上计数TIM_Base_InitStructure.RepetitionCounter 1 - 1;//不重复计数//将(1-1)写入重复计数寄存器TIMx_RCR中的REP[7:0],设置重复计数器值TIM_Base_InitStructure.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_DISABLE;//自动重装载寄存器没有缓冲//不允许将TIMx自动重新加载寄存器TIMx_ARR的值被装入缓冲区;TIM_Base_SetConfig(TIM1,TIM_Base_InitStructure);//选择计数器模式:向上计数//设置时钟分频因子:时钟不分频,则tDTStCK_INT//设置自动重装载:自动重装载寄存器没有缓冲//设置自动重装载值:TIM_Base_InitStructure.Period//设置预分频值:TIM_Base_InitStructure.Prescaler//设置重复计数器值:TIM_Base_InitStructure.RepetitionCounter//启动更新事件:将TIMx_EGR中的UG位置1,由软件产生更新事件_HAL_TIM_ENABLE_IT(TIM1, TIM_IT_UPDATE);//将TIMx DMA/中断使能寄存器TIM3_DIER的UIE1,允许计数器更新产生中断_HAL_TIM_ENABLE(TIM1);//计数器使能,开始计数// TIM1_HandleStructure.Instance TIM1;
// HAL_TIM_Base_Start_IT(TIM1_HandleStructure);//TIM1使能启动,开始计数,并使能中断
}//函数功能:定时器中断服务程序
//200ms中断一次
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{if (_HAL_TIM_GET_FLAG(TIM1,TIM_FLAG_UPDATE) ! RESET){//计数器更新事件if (_HAL_TIM_GET_IT_SOURCE(TIM1, TIM_IT_UPDATE) ! RESET){_HAL_TIM_CLEAR_IT(TIM1, TIM_IT_UPDATE);MCU_LED_Toggle();}}
}
#ifndef __MyTimer_H
#define __MyTimer_H#include py32f0xx_hal.h#define _HAL_TIM_ENABLE(__INSTANCE__) ((__INSTANCE__)-CR1|(TIM_CR1_CEN))
//计数器使能,开始计数#define _HAL_TIM_DISABLE(__INSTANCE__) \do { \if (((__INSTANCE__)-CCER TIM_CCER_CCxE_MASK) 0UL) \{ \if(((__INSTANCE__)-CCER TIM_CCER_CCxNE_MASK) 0UL) \{ \(__INSTANCE__)-CR1 ~(TIM_CR1_CEN); \} \} \} while(0)
//计数器不使能,停止计数#define _HAL_TIM_MOE_ENABLE(__INSTANCE__) ((__INSTANCE__)-BDTR|(TIM_BDTR_MOE))
//将TIMx刹车和死区寄存器(TIMx_BDTR)中的MOE1,开启OCx和OCxN输出,即使能TIMx_CH1和TIMx_CH1N输出#define _HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__INSTANCE__) (__INSTANCE__)-BDTR ~(TIM_BDTR_MOE)
//将TIMx刹车和死区寄存器(TIMx_BDTR)中的MOE0,关闭OCx和OCxN输出,即不使能TIMx_CH1和TIMx_CH1N输出#define _HAL_TIM_MOE_DISABLE(__INSTANCE__) \do { \if (((__INSTANCE__)-CCER TIM_CCER_CCxE_MASK) 0UL) \{ \if(((__INSTANCE__)-CCER TIM_CCER_CCxNE_MASK) 0UL) \{ \(__INSTANCE__)-BDTR ~(TIM_BDTR_MOE); \} \} \} while(0)
//在TIMx捕获/比较使能寄存器TIMx_CCER中,如果OCx禁止输出或捕获禁止,且OCxNE禁止输出
//则将TIMx刹车和死区寄存器(TIMx_BDTR)中的MOE0,关闭OCx和OCxN输出,即不使能TIMx_CH1和TIMx_CH1N输出#define _HAL_TIM_ENABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)-DIER | (__INTERRUPT__))
//根据__INTERRUPT__将TIMx DMA/中断使能寄存器(TIM3_DIER)的对应位置1使能相应的中断
//TIM_IT_UPDATE,允许定时器更新中断,UIE1
//TIM_IT_CC1,允许捕获/比较1中断,CC1IE1
//TIM_IT_CC2,允许捕获/比较2中断,CC2IE1
//TIM_IT_CC3,允许捕获/比较3中断,CC3IE1
//TIM_IT_CC4,允许捕获/比较4中断,CC4IE1
//TIM_IT_COM,允许COM事件中断,COMIE1
//TIM_IT_TRIGGER,允许触发中断,TIE1
//TIM_IT_BREAK,允许刹车中断,BIE1#define _HAL_TIM_DISABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)-DIER ~(__INTERRUPT__))
//根据__INTERRUPT__将TIMx DMA/中断使能寄存器(TIM3_DIER)的对应位清除不使能相应的中断
//TIM_IT_UPDATE,禁止定时器更新中断,UIE0
//TIM_IT_CC1,禁止捕获/比较1中断,CC1IE0
//TIM_IT_CC2,禁止捕获/比较2中断,CC2IE0
//TIM_IT_CC3,禁止捕获/比较3中断,CC3IE0
//TIM_IT_CC4,禁止捕获/比较4中断,CC4IE0
//TIM_IT_COM,禁止COM事件中断,COMIE0
//TIM_IT_TRIGGER,禁止触发中断,TIE0
//TIM_IT_BREAK,禁止刹车中断,BIE0#define _HAL_TIM_ENABLE_DMA(__INSTANCE__, __DMA__) ((__INSTANCE__)-DIER | (__DMA__))
//根据__INTERRUPT__将TIMx DMA/中断使能寄存器(TIMx_DIER)的对应位置1使能相应的DMA请求
//TIM_DMA_UPDATE,允许更新的DMA请求,UDE1
//TIM_DMA_CC1,允许捕获/比较1的DMA请求,CC1DE1
//TIM_DMA_CC2,允许捕获/比较2的DMA请求,CC2DE1
//TIM_DMA_CC3,允许捕获/比较3的DMA请求,CC3DE1
//TIM_DMA_CC4,允许捕获/比较4的DMA请求,CC4DE1
//TIM_DMA_COM,允许COM的DMA请求,COMDE1
//TIM_DMA_TRIGGER,允许触发DMA请求,TDE1#define _HAL_TIM_DISABLE_DMA(__INSTANCE__, __DMA__) ((__INSTANCE__)-DIER ~(__DMA__))
//根据__INTERRUPT__将TIMx DMA/中断使能寄存器(TIMx_DIER)的对应位置1不使能相应的DMA请求
//TIM_DMA_UPDATE,禁止更新的DMA请求,UDE0
//TIM_DMA_CC1,禁止捕获/比较1的DMA请求,CC1DE0
//TIM_DMA_CC2,禁止捕获/比较2的DMA请求,CC2DE0
//TIM_DMA_CC3,禁止捕获/比较3的DMA请求,CC3DE0
//TIM_DMA_CC4,禁止捕获/比较4的DMA请求,CC4DE0
//TIM_DMA_COM,禁止COM的DMA请求,COMDE0
//TIM_DMA_TRIGGER,禁止触发DMA请求,TDE0#define _HAL_TIM_GET_FLAG(__INSTANCE__, __FLAG__) (((__INSTANCE__)-SR (__FLAG__)) (__FLAG__))
//根据__FLAG__,若TIMx状态寄存器(TIMx_SR)中相应的位置1,则返回1
//TIM_FLAG_UPDATE,若UIF1,建立更新事件
//TIM_FLAG_CC1,若CC1IF1,如果通道CC1配置为输出模式则建立CC1输出事件
//TIM_FLAG_CC1,若CC1IF1,如果通道CC1配置为输入模式则建立CC1捕获事件
//TIM_FLAG_CC2,若CC2IF1,如果通道CC2配置为输出模式则建立CC2输出事件
//TIM_FLAG_CC2,若CC2IF1,如果通道CC2配置为输入模式则建立CC2捕获事件
//TIM_FLAG_CC3,若CC3IF1,如果通道CC3配置为输出模式则建立CC3输出事件
//TIM_FLAG_CC3,若CC3IF1,如果通道CC3配置为输入模式则建立CC3捕获事件
//TIM_FLAG_CC4,若CC4IF1,如果通道CC4配置为输出模式则建立CC4输出事件
//TIM_FLAG_CC4,若CC4IF1,如果通道CC4配置为输入模式则建立CC4捕获事件
//TIM_FLAG_COM若COMIF1则建立COM事件
//TIM_FLAG_TRIGGER若TIF1则建立触发事件
//TIM_FLAG_BREAK,若BIF1,则建立刹车事件
//TIM_FLAG_CC1OF,若CC1OF1,则表示计数器x的值被捕获到TIMx_CCR1寄存器
//TIM_FLAG_CC2OF,若CC2OF1,则表示计数器x的值被捕获到TIMx_CCR2寄存器
//TIM_FLAG_CC3OF,若CC3OF1,则表示计数器x的值被捕获到TIMx_CCR3寄存器
//TIM_FLAG_CC4OF,若CC4OF1,则表示计数器x的值被捕获到TIMx_CCR4寄存器#define _HAL_TIM_CLEAR_FLAG(__INSTANCE__, __FLAG__) ((__INSTANCE__)-SR ~(__FLAG__))
//这么写的原因,因为定时器只能做某一种功能,不能同时实现多种功能
//根据__FLAG__,若TIMx状态寄存器(TIMx_SR)中相应的位置0,则返回1
//TIM_FLAG_UPDATE,若UIF1,建立更新事件
//TIM_FLAG_CC1,令CC1IF0,如果通道CC1配置为输出模式则清除CC1输出事件
//TIM_FLAG_CC1,令CC1IF0,如果通道CC1配置为输入模式则清除CC1捕获事件
//TIM_FLAG_CC2,令CC2IF0,如果通道CC2配置为输出模式则清除CC2输出事件
//TIM_FLAG_CC2,令CC2IF0,如果通道CC2配置为输入模式则清除CC2捕获事件
//TIM_FLAG_CC3,令CC3IF0,如果通道CC3配置为输出模式则清除CC3输出事件
//TIM_FLAG_CC3,令CC3IF0,如果通道CC3配置为输入模式则清除CC3捕获事件
//TIM_FLAG_CC4,令CC4IF0,如果通道CC4配置为输出模式则清除CC4输出事件
//TIM_FLAG_CC4,令CC4IF0,如果通道CC4配置为输入模式则清除CC4捕获事件
//TIM_FLAG_COM令COMIF0则清除COM事件
//TIM_FLAG_TRIGGER令TIF0则清除触发事件
//TIM_FLAG_BREAK,令BIF0,则清除刹车事件
//TIM_FLAG_CC1OF,令CC1OF0,则清除建立的事件(计数器x的值被捕获到TIMx_CCR1寄存器)
//TIM_FLAG_CC2OF,令CC2OF0,则清除建立的事件(计数器x的值被捕获到TIMx_CCR2寄存器)
//TIM_FLAG_CC3OF,令CC3OF0,则清除建立的事件(计数器x的值被捕获到TIMx_CCR3寄存器)
//TIM_FLAG_CC4OF,令CC4OF0,则清除建立的事件(计数器x的值被捕获到TIMx_CCR4寄存器)#define _HAL_TIM_GET_IT_SOURCE(__INSTANCE__, __INTERRUPT__) ((((__INSTANCE__)-DIER (__INTERRUPT__)) \ (__INTERRUPT__)) ? SET : RESET)
//根据__INTERRUPT__,若TIMx DMA/中断使能寄存器(TIM3_DIER)的对应位置1,则返回1
//TIM_IT_UPDATE,若UIE1返回1,当前允许定时器更新中断
//TIM_IT_CC1,若CC1IE1返回1,当前允许捕获/比较1中断
//TIM_IT_CC2,若CC2IE1返回1,当前允许捕获/比较2中断
//TIM_IT_CC3,若CC3IE1返回1,当前允许捕获/比较3中断
//TIM_IT_CC4,若CC4IE1返回1,当前允许捕获/比较4中断
//TIM_IT_COM,若COMIE1返回1,当前允许COM事件中断
//TIM_IT_TRIGGER,若TIE1返回1,当前允许触发中断
//TIM_IT_BREAK,若BIE1,返回1,当前允许刹车中断#define _HAL_TIM_CLEAR_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)-SR ~(__INTERRUPT__))
//根据__INTERRUPT__,将TIMx状态寄存器(TIMx_SR)中相应的位置0,取消中断标志位
//TIM_IT_UPDATE,令UIE0不允许定时器更新中断
//TIM_IT_CC1,令CC1IE0不允许捕获/比较1中断
//TIM_IT_CC2,令CC2IE0不允许捕获/比较2中断
//TIM_IT_CC3,令CC3IE0不允许捕获/比较3中断
//TIM_IT_CC4,令CC4IE0不允许捕获/比较4中断
//TIM_IT_COM,令COMIE0不允许COM事件中断
//TIM_IT_TRIGGER,令TIE0不允许触发中断
//TIM_IT_BREAK,令BIE0,不允许刹车中断#define _HAL_TIM_IS_TIM_COUNTING_DOWN(__INSTANCE__) (((__INSTANCE__)-CR1 (TIM_CR1_DIR)) (TIM_CR1_DIR))
//读TIMx控制寄存器1(TIMx_CR1)的DIR位,若返回值为1,则表示该计数器为向下计数否则为向上计数#define _HAL_TIM_SET_PRESCALER(__INSTANCE__, __PRESC__) ((__INSTANCE__)-PSC (__PRESC__))
//将(__PRESC__)写入预装载寄存器TIMx_PSC,的PSC[15:0],设置预分频值
//计数器的时钟频率CK_CNTfCK_PSC/(PSC[15:0]1)#define _HAL_TIM_SET_COUNTER(__INSTANCE__, __COUNTER__) ((__INSTANCE__)-CNT (__COUNTER__))
//将(__COUNTER__)的值写入TIMx计数器(TIMx_CNT)#define _HAL_TIM_GET_COUNTER(__INSTANCE__) ((__INSTANCE__)-CNT)
//读TIMx计数器(TIMx_CNT)的值#define _HAL_TIM_SET_AUTORELOAD(__INSTANCE__, __AUTORELOAD__) \do{ \(__INSTANCE__)-ARR (__AUTORELOAD__); \} while(0)
//将(__AUTORELOAD__)写入自动重载入寄存器TIMx_ARR,设置自动重装载值#define _HAL_TIM_GET_AUTORELOAD(__INSTANCE__) ((__INSTANCE__)-ARR)
//从自动重载入寄存器TIMx_ARR中,读取自动重装载值#define _HAL_TIM_SET_CLOCKDIVISION(__INSTANCE__, __CKD__) \do{ \(__INSTANCE__)-CR1 (~TIM_CR1_CKD); \(__INSTANCE__)-CR1 | (__CKD__); \} while(0)
//设置时钟分频因子
//将TIM1控制寄存器1(TIM1_CR1)的CKD[1:0]置00B
//TIM_CLOCKDIVISION_DIV1,则(__CKD__)00B时钟分频因子tDTStCK_INT
//TIM_CLOCKDIVISION_DIV2,则((__CKD__)01B时钟分频因子tDTS2*tCK_INT
//TIM_CLOCKDIVISION_DIV4,则((__CKD__)10B时钟分频因子tDTS4*tCK_INT#define _HAL_TIM_GET_CLOCKDIVISION(__INSTANCE__) ((__INSTANCE__)-CR1 TIM_CR1_CKD)
//从TIMx控制寄存器1(TIM1_CR1)中,读取CKD[1:0]位值,就是时钟分频因子
//将TIM1控制寄存器1(TIM1_CR1)的CKD[1:0]置00B
//返回值为TIM_CLOCKDIVISION_DIV1,表示时钟分频因子tDTStCK_INT
//返回值为TIM_CLOCKDIVISION_DIV2,表示时钟分频因子tDTS2*tCK_INT
//返回值为TIM_CLOCKDIVISION_DIV4,表示时钟分频因子tDTS4*tCK_INT#define TIMx_RESET_ICPRESCALERVALUE(__INSTANCE__, __CHANNEL__) \( ( (__CHANNEL__) TIM_CHANNEL_1) ? ( (__INSTANCE__)-CCMR1 ~TIM_CCMR1_IC1PSC ) :\( (__CHANNEL__) TIM_CHANNEL_2) ? ( (__INSTANCE__)-CCMR1 ~TIM_CCMR1_IC2PSC ) :\( (__CHANNEL__) TIM_CHANNEL_3) ? ( (__INSTANCE__)-CCMR2 ~TIM_CCMR2_IC3PSC ) :\( (__INSTANCE__)-CCMR2 ~TIM_CCMR2_IC4PSC ) )
//设置输入捕获模式Input Capture mode
//如果(__CHANNEL__)为TIM_CHANNEL_1则清除TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获1预分频器C1PSC[1:0]
//如果(__CHANNEL__)为TIM_CHANNEL_2则清除TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获2预分频器C2PSC[1:0]
//如果(__CHANNEL__)为TIM_CHANNEL_3则清除TIMx捕获/比较模式寄存器1(TIMx_CCMR2)中的输入/捕获3预分频器C3PSC[1:0]#define TIMx_SET_ICPRESCALERVALUE(__INSTANCE__, __CHANNEL__, __ICPSC__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCMR1 | (__ICPSC__)) :\((__CHANNEL__) TIM_CHANNEL_2) ? ((__INSTANCE__)-CCMR1 | ((__ICPSC__) 8U)) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCMR2 | (__ICPSC__)) :\((__INSTANCE__)-CCMR2 | ((__ICPSC__) 8U)))
//设置输入捕获模式Input Capture mode
//若(__CHANNEL__)TIM_CHANNEL_1则用(__ICPSC__)设置TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获1预分频器C1PSC[1:0]
//若(__CHANNEL__)TIM_CHANNEL_2则(__ICPSC__)设置TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获2预分频器C2PSC[1:0]
//若(__CHANNEL__)TIM_CHANNEL_3则(__ICPSC__)设置TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的输入/捕获3预分频器C3PSC[1:0]#define _HAL_TIM_GET_ICPRESCALER(__INSTANCE__, __CHANNEL__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCMR1 TIM_CCMR1_IC1PSC) :\((__CHANNEL__) TIM_CHANNEL_2) ? (((__INSTANCE__)-CCMR1 TIM_CCMR1_IC2PSC) 8U) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCMR2 TIM_CCMR2_IC3PSC) :\(((__INSTANCE__)-CCMR2 TIM_CCMR2_IC4PSC)) 8U)
//在输入捕获模式中,
//若(__CHANNEL__)TIM_CHANNEL_1则读取TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获1预分频器C1PSC[1:0]
//若(__CHANNEL__)TIM_CHANNEL_2则读取TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获2预分频器C2PSC[1:0]
//若(__CHANNEL__)TIM_CHANNEL_3则读取TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的输入/捕获3预分频器C3PSC[1:0]#define _HAL_TIM_SET_COMPARE(__INSTANCE__, __CHANNEL__, __COMPARE__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCR1 (__COMPARE__)) :\((__CHANNEL__) TIM_CHANNEL_2) ? ((__INSTANCE__)-CCR2 (__COMPARE__)) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCR3 (__COMPARE__)) :\((__INSTANCE__)-CCR4 (__COMPARE__)))
//设置CCx的预装载值
//若(__CHANNEL__)TIM_CHANNEL_1则将(__COMPARE__)写入TIMx捕获/比较寄存器1(TIMx_CCR1)中的CCR1[15:0],表示预装载值
//若(__CHANNEL__)TIM_CHANNEL_2则将(__COMPARE__)写入TIMx捕获/比较寄存器2(TIMx_CCR2)中的CCR2[15:0],表示预装载值
//若(__CHANNEL__)TIM_CHANNEL_3则将(__COMPARE__)写入TIMx捕获/比较寄存器3(TIMx_CCR3)中的CCR3[15:0],表示预装载值
//若(__CHANNEL__)TIM_CHANNEL_4则将(__COMPARE__)写入TIMx捕获/比较寄存器4(TIMx_CCR4)中的CCR3[15:0],表示预装载值#define _HAL_TIM_GET_COMPARE(__INSTANCE__, __CHANNEL__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCR1) :\((__CHANNEL__) TIM_CHANNEL_2) ? ((__INSTANCE__)-CCR2) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCR3) :\((__INSTANCE__)-CCR4))
//读取CCx的预装载值
//若(__CHANNEL__)TIM_CHANNEL_1则从TIMx捕获/比较寄存器1(TIMx_CCR1)中的CCR1[15:0]读取预装载值
//若(__CHANNEL__)TIM_CHANNEL_2则从TIMx捕获/比较寄存器2(TIMx_CCR2)中的CCR2[15:0]读取预装载值
//若(__CHANNEL__)TIM_CHANNEL_3则从TIMx捕获/比较寄存器3(TIMx_CCR3)中的CCR3[15:0]读取预装载值
//若(__CHANNEL__)TIM_CHANNEL_4则从TIMx捕获/比较寄存器3(TIMx_CCR4)中的CCR3[15:0]读取预装载值#define _HAL_TIM_ENABLE_OCxPRELOAD(__INSTANCE__, __CHANNEL__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCMR1 | TIM_CCMR1_OC1PE) :\((__CHANNEL__) TIM_CHANNEL_2) ? ((__INSTANCE__)-CCMR1 | TIM_CCMR1_OC2PE) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCMR2 | TIM_CCMR2_OC3PE) :\((__INSTANCE__)-CCMR2 | TIM_CCMR2_OC4PE))
//开启TIMx_CCRy寄存器的预装载功能
//若(__CHANNEL__)TIM_CHANNEL_1则将TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的OC1PE位置1开启TIMx_CCR1寄存器的预装载功能
//若(__CHANNEL__)TIM_CHANNEL_2则将TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的OC2PE位置1开启TIMx_CCR2寄存器的预装载功能
//若(__CHANNEL__)TIM_CHANNEL_3则将TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的OC3PE位置1开启TIMx_CCR3寄存器的预装载功能
//若(__CHANNEL__)TIM_CHANNEL_4则将TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的OC4PE位置1开启TIMx_CCR4寄存器的预装载功能#define _HAL_TIM_DISABLE_OCxPRELOAD(__INSTANCE__, __CHANNEL__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCMR1 ~TIM_CCMR1_OC1PE) :\((__CHANNEL__) TIM_CHANNEL_2) ? ((__INSTANCE__)-CCMR1 ~TIM_CCMR1_OC2PE) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCMR2 ~TIM_CCMR2_OC3PE) :\((__INSTANCE__)-CCMR2 ~TIM_CCMR2_OC4PE))
//禁止TIMx_CCRy寄存器的预装载功能
//若(__CHANNEL__)TIM_CHANNEL_1则将TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的OC1PE位置0禁止TIMx_CCR1寄存器的预装载功能
//若(__CHANNEL__)TIM_CHANNEL_2则将TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的OC2PE位置0禁止TIMx_CCR2寄存器的预装载功能
//若(__CHANNEL__)TIM_CHANNEL_3则将TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的OC3PE位置0禁止TIMx_CCR3寄存器的预装载功能
//若(__CHANNEL__)TIM_CHANNEL_4则将TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的OC4PE位置0禁止TIMx_CCR4寄存器的预装载功能#define _HAL_TIM_ENABLE_OCxFAST(__INSTANCE__, __CHANNEL__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCMR1 | TIM_CCMR1_OC1FE) :\((__CHANNEL__) TIM_CHANNEL_2) ? ((__INSTANCE__)-CCMR1 | TIM_CCMR1_OC2FE) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCMR2 | TIM_CCMR2_OC3FE) :\((__INSTANCE__)-CCMR2 | TIM_CCMR2_OC4FE))
//开启比较x快速输出功能加快CCx输出对触发器x输入事件的响应
//若(__CHANNEL__)TIM_CHANNEL_1则将TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的OC1FE位置1开启比较1快速输出功能
//若(__CHANNEL__)TIM_CHANNEL_2则将TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的OC2FE位置1开启比较2快速输出功能
//若(__CHANNEL__)TIM_CHANNEL_3则将TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的OC3FE位置1开启比较3快速输出功能
//若(__CHANNEL__)TIM_CHANNEL_4则将TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的OC4FE位置1开启比较4快速输出功能#define _HAL_TIM_DISABLE_OCxFAST(__INSTANCE__, __CHANNEL__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCMR1 ~TIM_CCMR1_OC1FE) :\((__CHANNEL__) TIM_CHANNEL_2) ? ((__INSTANCE__)-CCMR1 ~TIM_CCMR1_OC2FE) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCMR2 ~TIM_CCMR2_OC3FE) :\((__INSTANCE__)-CCMR2 ~TIM_CCMR2_OC4FE))
//禁止比较x快速输出功能不用加快CC输出对触发器输入事件的响应
//若(__CHANNEL__)TIM_CHANNEL_1则将TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的OC1FE位置0禁止比较1快速输出功能
//若(__CHANNEL__)TIM_CHANNEL_2则将TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的OC2FE位置0禁止比较2快速输出功能
//若(__CHANNEL__)TIM_CHANNEL_3则将TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的OC3FE位置0禁止比较3快速输出功能
//若(__CHANNEL__)TIM_CHANNEL_4则将TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的OC4FE位置0禁止比较4快速输出功能#define _HAL_TIM_URS_ENABLE(__INSTANCE__) ((__INSTANCE__)-CR1| TIM_CR1_URS)
//将TIMx控制寄存器1(TIM1_CR1)中的URS位置1
//允许在计数器溢出/下溢时,产生一个更新中断或DMA请求;#define _HAL_TIM_URS_DISABLE(__INSTANCE__) ((__INSTANCE__)-CR1~TIM_CR1_URS)
//将TIMx控制寄存器1(TIM1_CR1)中的URS位置0
//允许在计数器溢出/下溢时,产生一个更新中断或DMA请求;
//允许在TIMx_EGR中的UG位置1时,产生一个更新中断或DMA请求;
//允许在从模式控制器产生更新时,产生一个更新中断或DMA请求;#define _HAL_TIM_SET_ICPRESCALER(__INSTANCE__, __CHANNEL__, __ICPSC__) \do{ \TIMx_RESET_ICPRESCALERVALUE((__INSTANCE__), (__CHANNEL__)); \TIMx_SET_ICPRESCALERVALUE((__INSTANCE__), (__CHANNEL__), (__ICPSC__)); \} while(0)
//使用(__ICPSC__)设置通道为(__CHANNEL__)的输入捕获预分频器的值
//设置输入捕获模式Input Capture mode
//如果(__CHANNEL__)为TIM_CHANNEL_1则清除TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获1预分频器C1PSC[1:0]
//如果(__CHANNEL__)为TIM_CHANNEL_2则清除TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获2预分频器C2PSC[1:0]
//如果(__CHANNEL__)为TIM_CHANNEL_3则清除TIMx捕获/比较模式寄存器1(TIMx_CCMR2)中的输入/捕获3预分频器C3PSC[1:0]
//设置输入捕获模式Input Capture mode
//若(__CHANNEL__)TIM_CHANNEL_1则用(__ICPSC__)设置TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获1预分频器C1PSC[1:0]
//若(__CHANNEL__)TIM_CHANNEL_2则(__ICPSC__)设置TIMx捕获/比较模式寄存器1(TIMx_CCMR1)中的输入/捕获2预分频器C2PSC[1:0]
//若(__CHANNEL__)TIM_CHANNEL_3则(__ICPSC__)设置TIMx捕获/比较模式寄存器2(TIMx_CCMR2)中的输入/捕获3预分频器C3PSC[1:0]#define TIMx_RESET_CAPTUREPOLARITY(__INSTANCE__, __CHANNEL__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCER ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\((__CHANNEL__) TIM_CHANNEL_2) ? ((__INSTANCE__)-CCER ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCER ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\((__INSTANCE__)-CCER ~(TIM_CCER_CC4P | TIM_CCER_CC4NP)))
//设置输入/捕获x的输出极性
//TIMx捕获/比较使能寄存器(TIMx_CCER)
//当(__CHANNEL__)TIM_CHANNEL_1,(__POLARITY__)TIM_CCER_CC1P时,令CC1P0CC1P0表示输入/捕获1输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_1,(__POLARITY__)TIM_CCER_CC1NP时,令CC1NP0CC1NP0表示输入/捕获1互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_2,(__POLARITY__)TIM_CCER_CC2P时,令CC2P0CC2P0表示输入/捕获2输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_2,(__POLARITY__)TIM_CCER_CC2NP时,令CC2NP0CC2NP0表示输入/捕获2互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_3,(__POLARITY__)TIM_CCER_CC3P时,令CC3P0CC3P0表示输入/捕获3输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_3,(__POLARITY__)TIM_CCER_CC3NP时,令CC3NP0CC3NP0表示输入/捕获3互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_4,(__POLARITY__)TIM_CCER_CC4P时,令CC4P0CC4P0表示输入/捕获4输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_4,(__POLARITY__)TIM_CCER_CC4NP时,令CC4NP0CC4NP0表示输入/捕获4互补输出极性为高电平有效否则为低电平有效#define TIMx_SET_CAPTUREPOLARITY(__INSTANCE__, __CHANNEL__, __POLARITY__) \(((__CHANNEL__) TIM_CHANNEL_1) ? ((__INSTANCE__)-CCER | (__POLARITY__)) :\((__CHANNEL__) TIM_CHANNEL_2) ? ((__INSTANCE__)-CCER | ((__POLARITY__) 4U)) :\((__CHANNEL__) TIM_CHANNEL_3) ? ((__INSTANCE__)-CCER | ((__POLARITY__) 8U)) :\((__INSTANCE__)-CCER | (((__POLARITY__) 12U))))
//设置输入/捕获x的输出极性
//TIMx捕获/比较使能寄存器(TIMx_CCER)
//当(__CHANNEL__)TIM_CHANNEL_1,(__POLARITY__)TIM_CCER_CC1P时,令CC1P1CC1P0表示输入/捕获1输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_1,(__POLARITY__)TIM_CCER_CC1NP时,令CC1NP1CC1NP0表示输入/捕获1互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_2,(__POLARITY__)TIM_CCER_CC2P时,令CC2P1CC2P0表示输入/捕获2输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_2,(__POLARITY__)TIM_CCER_CC2NP时,令CC2NP1CC2NP0表示输入/捕获2互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_3,(__POLARITY__)TIM_CCER_CC3P时,令CC3P1CC3P0表示输入/捕获3输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_3,(__POLARITY__)TIM_CCER_CC3NP时,令CC3NP1CC3NP0表示输入/捕获3互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_4,(__POLARITY__)TIM_CCER_CC4P时,令CC4P1CC4P0表示输入/捕获4输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_4,(__POLARITY__)TIM_CCER_CC4NP时,令CC4NP1CC4NP0表示输入/捕获4互补输出极性为高电平有效否则为低电平有效#define _HAL_TIM_SET_CAPTUREPOLARITY(__INSTANCE__, __CHANNEL__, __POLARITY__) \do{ \TIMx_RESET_CAPTUREPOLARITY((__INSTANCE__), (__CHANNEL__)); \TIMx_SET_CAPTUREPOLARITY((__INSTANCE__), (__CHANNEL__), (__POLARITY__)); \}while(0)
//设置输入/捕获x的输出极性
//TIMx捕获/比较使能寄存器(TIMx_CCER)
//当(__CHANNEL__)TIM_CHANNEL_1,(__POLARITY__)TIM_CCER_CC1P时,令CC1P0CC1P0表示输入/捕获1输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_1,(__POLARITY__)TIM_CCER_CC1NP时,令CC1NP0CC1NP0表示输入/捕获1互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_2,(__POLARITY__)TIM_CCER_CC2P时,令CC2P0CC2P0表示输入/捕获2输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_2,(__POLARITY__)TIM_CCER_CC2NP时,令CC2NP0CC2NP0表示输入/捕获2互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_3,(__POLARITY__)TIM_CCER_CC3P时,令CC3P0CC3P0表示输入/捕获3输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_3,(__POLARITY__)TIM_CCER_CC3NP时,令CC3NP0CC3NP0表示输入/捕获3互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_4,(__POLARITY__)TIM_CCER_CC4P时,令CC4P0CC4P0表示输入/捕获4输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_4,(__POLARITY__)TIM_CCER_CC4NP时,令CC4NP0CC4NP0表示输入/捕获4互补输出极性为高电平有效否则为低电平有效
//设置输入/捕获x的输出极性
//TIMx捕获/比较使能寄存器(TIMx_CCER)
//当(__CHANNEL__)TIM_CHANNEL_1,(__POLARITY__)TIM_CCER_CC1P时,令CC1P1CC1P0表示输入/捕获1输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_1,(__POLARITY__)TIM_CCER_CC1NP时,令CC1NP1CC1NP0表示输入/捕获1互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_2,(__POLARITY__)TIM_CCER_CC2P时,令CC2P1CC2P0表示输入/捕获2输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_2,(__POLARITY__)TIM_CCER_CC2NP时,令CC2NP1CC2NP0表示输入/捕获2互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_3,(__POLARITY__)TIM_CCER_CC3P时,令CC3P1CC3P0表示输入/捕获3输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_3,(__POLARITY__)TIM_CCER_CC3NP时,令CC3NP1CC3NP0表示输入/捕获3互补输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_4,(__POLARITY__)TIM_CCER_CC4P时,令CC4P1CC4P0表示输入/捕获4输出极性为高电平有效否则为低电平有效
//当(__CHANNEL__)TIM_CHANNEL_4,(__POLARITY__)TIM_CCER_CC4NP时,令CC4NP1CC4NP0表示输入/捕获4互补输出极性为高电平有效否则为低电平有效
#endif /* __MyTimer_H */
#include py32f0xx_hal.h
#include SystemClock.h
#include USART2.h
#include stdio.h //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include string.h //使能strcpy(),strlen(),memset()
#include delay.h
#include LED.h
#include TIM1_COUNTERMODE_UP.h
#include SystemClock.hconst char CPU_Reset_REG[]\r\nCPU reset!\r\n;
int main(void)
{HSE_Config();HAL_Init();//systick初始化delay_init();HAL_Delay(1000);MCU_LED_Init();USART2_Init(115200);printf(%s,CPU_Reset_REG);TIM1_COUNTERMODE_UP_Init(20000,240);//若使用HSE当arr20000,psc240时,则为200ms,误差为10us;
// TIM1_COUNTERMODE_UP_Init(20000,80);//若使用HSI当arr20000,psc80时,则为200ms,误差为10us;while (1){delay_ms(100);}
}
#include SystemClock.h
#include py32f0xx_hal.hvoid HSE_Config(void);
void HSI_Config(void);//函数功能:初始化HSI,HSE,LSI振荡器,HSE用作系统时钟(SYSCLK),同时配置AHB时钟(HCLK)和APB时钟(PCLK)
void HSE_Config(void)
{HAL_StatusTypeDef retData;RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};//配置HSE,HSI和LSI振荡器RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI;RCC_OscInitStruct.HSIState RCC_HSI_ON; //开启HSIRCC_OscInitStruct.HSIDiv RCC_HSI_DIV1; //HSI不分频
// RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_4MHz; //配置HSI输出时钟为4MHzRCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_8MHz; //配置HSI输出时钟为8MHz
// RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_16MHz; //配置HSI输出时钟为16MHz
// RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_22p12MHz;//配置HSI输出时钟为22.12MHz
// RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_24MHz; //配置HSI输出时钟为24MHzRCC_OscInitStruct.HSEState RCC_HSE_ON; //开启HSERCC_OscInitStruct.HSEFreq RCC_HSE_16_32MHz; //HSE工作频率范围16M~32MRCC_OscInitStruct.LSIState RCC_LSI_ON; //开启LSIretDataHAL_RCC_OscConfig(RCC_OscInitStruct);//初始化HSI,HSE,LSI振荡器if ( retData! HAL_OK)//初始化振荡器失败{}//初始化系统时钟(SYSCLK),AHB时钟(HCLK)和APB时钟(PCLK)RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_HSE;//SYSCLK的源选择为HSERCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1;//AHB时钟(HCLK)不分频,输出为APB时钟RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2; //APB时钟(PCLK)分频器为2分频,输出为PCLK时钟retDataHAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_0);//初始化RCC系统时钟(小于24MHz,则使用FLASH_LATENCY_0;大于24MHz且小于48MHz,则使用FLASH_LATENCY_1)if ( retData! HAL_OK)//初始化RCC系统时钟失败{}
}//函数功能:初始化HSI振荡器,用作系统时钟(SYSCLK),同时配置AHB时钟(HCLK)和APB时钟(PCLK)
void HSI_Config(void)
{HAL_StatusTypeDef retData;RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};//配置HSI振荡器RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSI;//选择振荡器类型为HSIRCC_OscInitStruct.HSIState RCC_HSI_ON;//开启HSIRCC_OscInitStruct.HSIDiv RCC_HSI_DIV1;//不分频
// RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_4MHz;//配置HSI输出时钟为4MHz
// RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_8MHz;//配置HSI输出时钟为8MHz
// RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_16MHz;//配置HSI输出时钟为16MHz
// RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_22p12MHz;//配置HSI输出时钟为22.12MHzRCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_24MHz; //配置HSI输出时钟为24MHzretDataHAL_RCC_OscConfig(RCC_OscInitStruct);if(retData ! HAL_OK)//初始化振荡器失败{}//初始化系统时钟(SYSCLK),AHB时钟(HCLK)和APB时钟(PCLK)RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; //RCC系统时钟类型RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_HSI;//SYSCLK的源选择为HSIRCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1; //AHB时钟(HCLK)不分频,输出为APB时钟RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV1; //APB时钟(PCLK)分频器为1分频,输出为PCLK时钟retDataHAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_0);初始化RCC系统时钟(小于24MHz,则使用FLASH_LATENCY_0;大于24MHz且小于48MHz,则使用FLASH_LATENCY_1)if( retData!HAL_OK)初始化RCC系统时钟失败{}
}
四、测试结果