新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32學習筆記(4):通用定時器基本定時功能

        STM32學習筆記(4):通用定時器基本定時功能

        作者: 時間:2016-11-28 來源:網絡 收藏

        //使能預取指緩存

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        //設置PLL時鐘,為HSE的9倍頻8MHz * 9 = 72MHz

        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

        //使能PLL

        RCC_PLLCmd(ENABLE);

        //等待PLL準備就緒

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

        //設置PLL為系統時鐘源

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        //判斷PLL是否是系統時鐘

        while(RCC_GetSYSCLKSource() != 0x08);

        }

        //允許TIM2的時鐘

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

        //允許GPIO的時鐘

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

        }

        void TIMER_cfg()

        {

        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

        //重新將Timer設置為缺省值

        TIM_DeInit(TIM2);

        //采用內部時鐘給TIM2提供時鐘源

        TIM_InternalClockConfig(TIM2);

        //預分頻系數為36000-1,這樣計數器時鐘為72MHz/36000 = 2kHz

        TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;

        //設置時鐘分割

        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

        //設置計數器模式為向上計數模式

        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

        //設置計數溢出大小,每計2000個數就產生一個更新事件

        TIM_TimeBaseStructure.TIM_Period = 2000 - 1;

        //將配置應用到TIM2中

        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

        //清除溢出中斷標志

        TIM_ClearFlag(TIM2, TIM_FLAG_Update);

        //禁止ARR預裝載緩沖器

        TIM_ARRPreloadConfig(TIM2, DISABLE);

        //開啟TIM2的中斷

        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

        }

        void NVIC_cfg()

        {

        NVIC_InitTypeDef NVIC_InitStructure;

        //選擇中斷分組1

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

        //選擇TIM2的中斷通道

        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

        //搶占式中斷優先級設置為0

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

        //響應式中斷優先級設置為0

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

        //使能中斷

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);

        }

        void GPIO_cfg()

        {

        GPIO_InitTypeDef GPIO_InitStructure;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//選擇引腳5

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出頻率最大50MHz

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //帶上拉電阻輸出

        GPIO_Init(GPIOB,&GPIO_InitStructure);

        }

        在stm32f10x_it.c中,我們找到函數TIM2_IRQHandler(),并向其中添加代碼

        void TIM2_IRQHandler(void)

        {

        u8 ReadValue;

        //檢測是否發生溢出更新事件

        if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

        {

        //清除TIM2的中斷待處理位

        TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);

        //將PB.5管腳輸出數值寫入ReadValue

        ReadValue = GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);

        if(ReadValue == 0)

        {

        GPIO_SetBits(GPIOB,GPIO_Pin_5);

        }

        else

        {

        GPIO_ResetBits(GPIOB,GPIO_Pin_5);

        }

        }

        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 资中县| 京山县| 布拖县| 南雄市| 黄石市| 和田市| 威宁| 固始县| 互助| 建昌县| 中方县| 仁怀市| 东乡族自治县| 临泉县| 南木林县| 武定县| 沽源县| 凤城市| 灯塔市| 昌吉市| 图木舒克市| 屯门区| 台湾省| 株洲市| 云和县| 通道| 吴川市| 泊头市| 桃源县| 满洲里市| 澄江县| 宿迁市| 伽师县| 池州市| 年辖:市辖区| 汉源县| 湾仔区| 嘉峪关市| 二连浩特市| 清丰县| 武定县|