• stm32单片机时钟中断的配置


    原作者:http://www.eeworld.com.cn/mcu/article_2016082828940.html

    配置流程:

     

    1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。
    2:IO口初始化,包括引脚,速率,输入输出模式等。
    3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。
    4:TIM3初始化:包括自动重装值,分频值,计数模式,使能TIM中断,使能TIM3外设
    5:中断处理函数:注意清除TIMx的中断待处理位
    注意:
    1:RCC初始化要使能或者失能 APB1 外设时钟。
    2:中断处理函数:注意清除TIMx的中断待处理位 TIMx_SR寄存器
    3:关于时钟:初始化RCC时使用SystemInit()函数时默认的是AHB不分频,即HCLK等于SYSHCLK,APB2不分频,APB1为HCLK 2分频而定时器3时钟使能在RCC_APB1ENR寄存器中定义,因此TIM3时钟为36M

    原程序为:
    #include"stm32f10x.h"
    #include"stm32f10x_tim.h"

    #define LED0_OFF  GPIO_SetBits(GPIOA,GPIO_Pin_8)// LED0关
    #define LED0_ON GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0开

    u16 i=0;


    //初始化IO端口
    void IO_Configuart(void)   
    {
        GPIO_InitTypeDef GPIO_InitStructure;                                       //定义 GPIO_InitStructure为    GPIO_InitTypeDef结构体类型
        //LED0
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;                               //引脚选择
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;           //50MHz速率
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;           //推挽输出
        GPIO_Init(GPIOA,&GPIO_InitStructure);                                 //初始化

    }

    //复位和系统时钟控制
    void RCC_Configuare(void)
    {
        SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率
        RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统

        //使能GPIOA,GPIOD端口时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能或者失能 APB1 外设时钟 
    //    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟
        /*    也可以写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);   更加简洁*/
    }

    //NVIC设置 系统中断管理
    void NVIC_Configuare(void)
    {
        NVIC_InitTypeDef   NVIC_InitStructure;
        NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位  从优先级4位

        //使能TIM3中断
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;                       //TIM3中断 
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F;    //先占优先级0位,从优先级4位
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F;                //
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    }
    //初始化TIM3 1ms 定时
    void TIM3_Configuare(void)
    {
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        //TOUT=ARR*(PSC+1)/Tclk   ARR=10 PSC=3599 Tclk=36M  TOUT=0.001s=1ms
        TIM_TimeBaseStructure.TIM_Period = 10;                  //设置在下一个更新事件装入活动的自动重装载寄存器周期的值     计数到10为1ms
        TIM_TimeBaseStructure.TIM_Prescaler =(7200-1);    //设置用来作为TIMx时钟频率除数的预分频值  这里是7200分频    72M=72000000 ; 72000000 /7200=10000;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;         //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        
        TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE); //使能或者失能指定的 TIM 中断 
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设

    }

    int main (void)
    {

        RCC_Configuare();
        IO_Configuart();
        NVIC_Configuare();
        TIM3_Configuare();
        LED0_OFF;
        while(1)
        {
        
        }
                
    }

    //TIM3中断处理函数
    void TIM3_IRQHandler(void)
    {
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //检查指定的 TIM 中断发生与否 
        {
            TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
            i++;
            if(i==1000)
            {
                LED0_ON;

            }
            if(i==2000)
            {
                LED0_OFF;

                i=0;
            }    
        }
    }

  • 相关阅读:
    POJ3714+最近点对
    HDU1632+半平面交
    POJ2402+模拟
    ASP.NET MVC几种找不到资源的问题解决办法
    ASP.NET MVC中的错误-友好的处理方法
    ASP.NET MVC 程序 报错“CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义”的解决办法
    【Reporting Services 报表开发】— 表达式
    【Reporting Services 报表开发】— 级联式参数设置
    【Reporting Services 报表开发】— 数据表的使用
    【Reporting Services 报表开发】— 矩阵的使用
  • 原文地址:https://www.cnblogs.com/chulin/p/8479935.html
Copyright © 2020-2023  润新知