新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32學習記錄7:定時器中斷

        STM32學習記錄7:定時器中斷

        作者: 時間:2016-11-13 來源:網絡 收藏
        配置流程:
        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

        在宏定義中設置為72MHz時:在system_stm32f10x.c中有以下定義:
        static void SetSysClockTo72(void)
        {
        __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

        /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
        /* Enable HSE */
        RCC->CR |= ((uint32_t)RCC_CR_HSEON);

        /* Wait till HSE is ready and if Time out is reached exit */
        do
        {
        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;
        } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));

        if ((RCC->CR & RCC_CR_HSERDY) != RESET)
        {
        HSEStatus = (uint32_t)0x01;
        }
        else
        {
        HSEStatus = (uint32_t)0x00;
        }

        if (HSEStatus == (uint32_t)0x01)
        {
        /* Enable Prefetch Buffer */
        FLASH->ACR |= FLASH_ACR_PRFTBE;

        /* Flash 2 wait state */
        FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
        FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;


        /* HCLK = SYSCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;///*!< SYSCLK not divided */HCLK = SYSCLK

        /* PCLK2 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;// /*!< HCLK not divided */APB2為HCLK不分頻

        /* PCLK1 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;///*!< HCLK divided by 2 */APB1為HCLK 2分頻


        原程序為:
        #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時鐘頻率除數的預分頻值
        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;
        }
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 北碚区| 东乌珠穆沁旗| 苏尼特右旗| 徐闻县| 德庆县| 大悟县| 大洼县| 武胜县| 云和县| 来凤县| 望江县| 白玉县| 子长县| 隆德县| 华宁县| 固阳县| 嘉荫县| 曲松县| 库尔勒市| 阿克陶县| 唐山市| 二连浩特市| 鸡泽县| 高雄市| 石泉县| 武陟县| 永春县| 三门峡市| 延津县| 东辽县| 额济纳旗| 东乌| 潍坊市| 临夏县| 伊川县| 霸州市| 即墨市| 天水市| 漳平市| 邓州市| 略阳县|