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这三个部分。
示例——按键中断:
按键中断是外部中断,因此需要involve EXTI部分。
主要步骤为:
-
GPIO触发
-
EXTI配置
-
NVIC配置
-
NVIC中断服务
我的按键接在PB1上,因此,采用的EXTI1和GPIOB的设定。
void KEY_Init(){ //外部按键的GPIO时钟和AFIO复用时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB,ENABLE); //初始化所需的参数 NVIC_InitTypeDef NVIC_InitStruct; EXTI_InitTypeDef EXTI_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; //GPIO配置 GPIO_InitStruct.GPIO_Pin = KEY_PIN; GPIO_InitStruct.GPIO_Mode =GPIO_Mode_IPU; GPIO_Init(KEY_GPIO,&GPIO_InitStruct); //将GPIO口与中断线映射 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1); //外部中断初始化 EXTI_InitStruct.EXTI_Line = EXTI_Line1; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //配置为下降沿,因为按键常规状态为高电平,按下则为低电平,因此选择下降沿触发 EXTI_Init(&EXTI_InitStruct); //中断优先级配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&NVIC_InitStruct); }
初始化结束之后,需要进行中断处理:
void EXTI1_IRQHandler(){ if (EXTI_GetITStatus(EXTI_Line1) != RESET){ while(!GPIO_ReadInputDataBit(KEY_GPIO,KEY_PIN)); if(led_flag == 0){ LED_ON(); led_flag = 1; }else { LED_OFF(); led_flag = 0; } EXTI_ClearITPendingBit(EXTI_Line1); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!