码迷,mamicode.com
首页 > 其他好文 > 详细

STM32定时中断

时间:2016-04-12 00:13:48      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

0.STM32F103上测试


1.

  0)时钟分配图

技术分享

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

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


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

#include <stm32f10x.h>

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);
        }
    }
}

 

STM32定时中断

标签:

原文地址:http://www.cnblogs.com/nekorz/p/5380721.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!