stm32單片機時鐘中斷的配置

原做者:http://www.eeworld.com.cn/mcu/article_2016082828940.htmlhtml

 

配置流程:安全

 

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

相關文章
相關標籤/搜索