STM32深入学习2:定时器和嵌套向量控制器
定时器
8个定时器,高级定时器TIM1+TIM8,通用定时器TIM2-TIM5,基础定时器TIM6+TIM7;
定时器PWM输出
每个定时器有4路输出通道:OC1-OC4
涉及的固件库:stm32f10x_tim.c/stm32f10x_tim.h
1.定时器初始化:
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
TIM_TimeBaseInitTypeDef结构体包括:
#define TIM_CounterMode_Up ((uint16_t)0x0000)
#define TIM_CounterMode_Down ((uint16_t)0x0010) //计数模式
typedef struct { uint16_t TIM_Prescaler; // PSC预分频器,预分频值 f_cnt= f_tim/(TIM_Prescaler+1) uint16_t TIM_CounterMode; // 计数模式 uint16_t TIM_Period; // 周期(计数值),在0X0000到0XFFFF之间 } TIM_TimeBaseInitTypeDef;
计数器的时钟频率CK_CNT = fck_psc/(PSC[15:0]+1)
2. 输出通道的初始化:
/** * @brief Initializes the TIMx Channel1 according to the specified * parameters in the TIM_OCInitStruct. * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral. * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure * that contains the configuration information for the specified TIM peripheral. * @retval None */ void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
PWM1模式:CNT < CRRx , 输出为有效电平
PWM2模式:相反
有效电平由极性决定:TIM_OCPolarity_High TIM_OCPolarity_Low
3.设置OCX的比较寄存器预装载功能
void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState); void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
4. 设置自动重装载使能
void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState); void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
5.使能定时器的计数功能
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
嵌套向量控制器
NVIC嵌套中断向量控制器,管理中断嵌套和中断优先级
NVIC的初始化:
1. NVIC中断优先级组配置;
2.NVIC初始化:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
typedef struct { uint8_t NVIC_IRQChannel; //外部中断通道 uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级,最大取值15 uint8_t NVIC_IRQChannelSubPriority; //响应优先级,最大取值15 FunctionalState NVIC_IRQChannelCmd; //使能对应的中断通道 } NVIC_InitTypeDef;
中断行为:
入栈->取向量->选择MSP和PSP,更新堆栈指针SP,连接寄存器LR,程序计数器PC
外部中断EXTI的设定
EXTI分为两大功能:产生中断;产生事件
初始化函数:
EXTI_Init(),参数为EXTI_InitStruct;
中断还需要进行处理,中断回调函数
EXTI0_IRQHandler类似
中断需要配置IO,EXTI和NVIC这三个部分。
示例——按键中断: