• STM32——定时中断


    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);
            }
        }
    }
  • 相关阅读:
    跟面试官侃半小时MySQL事务,说完原子性、一致性、持久性的实现
    谈谈程序员的非技术思维
    跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现
    面试官问,你在开发中有用过什么设计模式吗?我懵了
    关于校招面试要怎么准备,这里有一些过来人的建议
    数据库中间件漫谈
    「从零单排HBase 06」你必须知道的HBase最佳实践
    「从零单排HBase 05」核心特性region split
    《Scalable IO in Java》译文
    Java多线程同步工具类之Semaphore
  • 原文地址:https://www.cnblogs.com/maplesnow/p/5380721.html
Copyright © 2020-2023  润新知