STM32——定时中断

0.STM32F103上测试


1.

  0)时钟分配图

STM32——定时中断_第1张图片

  1)定时器的时钟不是直接来自于APB1或APB2,而来自其上面的倍频器

  2)APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟。设置这个倍频器可以在保证其它外设使用较低时钟频率时


3.代码:使PG14,每隔一秒闪烁1次

#include 

void GPIO_Config(void);
void NVIC_Config(void);
void TIMER_Config(void);

int main(void)
{
    GPIO_Config();
    NVIC_Config();
    TIMER_Config();
    
    while(1);
}

void GPIO_Config(void)
{
    /* 定义GPIO结构体 */
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /* 总线2使能 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
    
    /* 配置GPIO引脚,模式,速度 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    /* 初始化 */
    GPIO_Init(GPIOG, &GPIO_InitStructure);
}

void NVIC_Config(void)
{
    /* 定义配置中断向量表变量 */
    NVIC_InitTypeDef NVIC_InitStructure;
    
    /* 选择中断分组1 */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    
    /* 选择TIM2的中断通道 */
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    
    /* 抢占式中断优先级设置为0 */
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    
    /* 响应式中孤单优先级设置为0 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    
    /* 初始化 */
    NVIC_Init(&NVIC_InitStructure);
}

/* 定时器的配置 */
void TIMER_Config(void)
{
    /* 定义TIM的变量 */
    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
    /* 开启总线1 */
    /* TIM2~7 在总线1上 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
    /* 设置TIM2为默认设置 */
    TIM_DeInit(TIM2);
    
    /* 自动重装载寄存器的值 */
    TIM_TimeBaseStructure.TIM_Period = 2000 - 1;
    /* 时钟预分频数 */
    TIM_TimeBaseStructure.TIM_Prescaler = (36000 - 1);
    /* 采样分频 */
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    /* 向上计数模式 */
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    
    /* 初始化 */
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    
    
    /* 清除溢出中断标志 */
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    
    
    /* 开启TIM2的中断 */
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    
    /* 开启时钟 */
    TIM_Cmd(TIM2, ENABLE);
}

void TIM2_IRQHandler(void)
{
    u8 ReadValue;
    
    /* 检测是否发生溢出更新事件 */
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
        /* 清除TIM2的中断待处理位 */
        TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
        
        ReadValue = GPIO_ReadOutputDataBit(GPIOG, GPIO_Pin_14);
        
        /* 若该端口当前为低电平 */
        if(ReadValue == 0)
        {
            GPIO_SetBits(GPIOG, GPIO_Pin_14);
        }
        else
        {
            GPIO_ResetBits(GPIOG, GPIO_Pin_14);
        }
    }
}

 

转载于:https://www.cnblogs.com/maplesnow/p/5380721.html

你可能感兴趣的:(STM32——定时中断)