zoukankan      html  css  js  c++  java
  • STM32 时钟 、中断、定时器使用

      

    函数RCC_APB1PeriphClockCmd() 和RCC_APB2PeriphClockCmd(),RCC_AHBPeriphClockCmd()

    第一个参数形式如下RCC_APB2Periph_GPIOA 或者RCC_APB1Periph_TIM3

    /** @defgroup APB2_peripheral
    AFIO GPIOA GPIOB GPIOC ....GPIOG ADC1 ADC2 ADC3 SPI1 UART1 TIM1 TIM8 TIM9~11 TIM15~17

    注意:AFIO当事件控制、重映射、外部中断需要使能AFIO时钟。

    /** @defgroup APB1_peripheral
    TIM2~7 TIM12~14 WWDG USB CAN1 CAN2 PWR DAC SPI2 SPI3 UART2~5 I2C1 I2C2

    中断优先级分组

    一般使用NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);设置一次。

     以PE2为例,使用外部中断

    //初始化代码
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2;//KEY2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
    GPIO_Init(GPIOE, &GPIO_InitStructure);//
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //使能复用时钟
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
    
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    EXTI_InitStructure.EXTI_Line=EXTI_Line2;    //KEY2
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
    
    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//使能外部中断2通道            
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                
    NVIC_Init(&NVIC_InitStructure);
    
    //中断相应函数
    void EXTI2_IRQHandler(void)
    {
        delay_ms(10);//消抖
        if(KEY2==0)      //按键PE2
        {
            LED0=!LED0;
        }         
        EXTI_ClearITPendingBit(EXTI_Line2);  //清除line2上的中断标志位
    }
    View Code

     

    定时器

     使用内部时钟

     以TIM3为例子,使用定时器中断

    //arr自动装载值
    //psc时钟预分频数
    void TIM3_Int_Init(u16 arr,u16 psc)
    {
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
    
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能时钟
        TIM_TimeBaseStructure.TIM_Period = arr; 
        TIM_TimeBaseStructure.TIM_Prescaler =psc; 
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //允许更新中断
        //中断优先级设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
        NVIC_Init(&NVIC_InitStructure);  
        TIM_Cmd(TIM3, ENABLE);  //使能TIM3                 
    }
    //中断服务程序
    void TIM3_IRQHandler(void)   //TIM3ÖжÏ
    {
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查Tim3中断发生与否
            {
            TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除标志
            LED1=!LED1;
            }
    }

     在主函数中,比如500ms中断一次

    TIM3_Int_Init(4999,7199);//10Kh计数频率,计数5000为500ms  

  • 相关阅读:
    从留言簿开始,学习MonoRail MVC(三)
    从留言簿开始,学习MonoRail MVC(二)
    程序集版本最后一位使用SVN版本号的自动生成方法
    如何让.Net控件在设计时InitializeComponent()中不生成相关代码
    [收藏]Web Services and C# Enums
    从留言簿开始,学习MonoRail MVC(一)
    .Net控制USB设备相关内容
    .Net 2.0ListView控件在Windows 2000和Windows XP上的差异
    基于高德地图Windows Phone API 快速开发地图相关APP(二)
    android map api v2 示例 步骤及问题
  • 原文地址:https://www.cnblogs.com/legion/p/6641646.html
Copyright © 2011-2022 走看看