STM32深入学习2:定时器和嵌套向量控制器

发布时间 2023-08-23 01:39:20作者: zxkic

定时器

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类似