?? 專欄簡介:本專欄記錄了從零學(xué)習(xí)單片機的過程,其中包括51單片機和STM32單片機兩部分;建議先學(xué)習(xí)51單片機,其是STM32等高級單片機的基礎(chǔ);這樣再學(xué)習(xí)STM32時才能融會貫通。
?? 專欄適用人群 :適用于想要從零基礎(chǔ)開始學(xué)習(xí)入門單片機,且有一定C語言基礎(chǔ)的的童鞋。
??專欄目標(biāo):實現(xiàn)從零基礎(chǔ)入門51單片機和STM32單片機,力求在玩好單片機的同時,能夠了解一些計算機的基本概念,了解電路及其元器件的基本理論等。?? 專欄主要內(nèi)容: 主要學(xué)習(xí)STM32單片機的功能、各個模塊、單片機的外設(shè)、驅(qū)動等,最終玩好單片機和單片機的外設(shè),全程手敲代碼,實現(xiàn)我們所要實現(xiàn)的功能。
?? 專欄說明 :如果文章知識點有錯誤的地方,歡迎大家隨時在文章下面評論,我會第一時間改正。讓我們一起學(xué)習(xí),一起進步。
??專欄主頁:http://t.csdn.cn/HCD8v
本學(xué)習(xí)過程參考:https://space.bilibili.com/383400717
STM3單片機安裝軟件、各種資料以及源碼的路徑:
鏈接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取碼:asdf
鏈接里壓縮包的解壓密碼:32
本大節(jié)主要學(xué)習(xí)TIM定時器的相關(guān)知識,包含八小節(jié):
第一小節(jié)主要學(xué)習(xí)定時器基本定時的功能,第二小節(jié)是對第一小節(jié)的內(nèi)容寫兩個程序進行練習(xí),分別是定時器定時中斷和定時器外部時鐘;
第三小節(jié)主要學(xué)習(xí)定時器輸出比較的功能,第四小節(jié)是對第三小節(jié)的內(nèi)容寫三個程序進行練習(xí),分別是PWM驅(qū)動LED呼吸燈、PWM驅(qū)動舵機以及PWM驅(qū)動直流電機;
第五小節(jié)主要學(xué)習(xí)定時器輸入捕獲的功能,第六小節(jié)是對第五小節(jié)的內(nèi)容寫兩個程序進行練習(xí),分別是輸入捕獲模式測頻率和PWMI模式測頻率占空比;
第七小節(jié)主要學(xué)習(xí)定時器的編碼器接口功能,第八小節(jié)是對第七小節(jié)的內(nèi)容寫一個程序進行練習(xí),即編碼器接口測速;
最終附上所有的源代碼;
本小節(jié)是對第一小節(jié)TIM定時中斷的內(nèi)容寫兩個程序進行練習(xí),分別是定時器定時中斷和定時器外部時鐘;并附上源碼;
一、本節(jié)目標(biāo)
目標(biāo):定時器定時中斷
定時器使用內(nèi)部時鐘定了一個1秒的時間,每隔1秒申請一下中斷,然后在中斷函數(shù)里執(zhí)行Num++;最后在OLED上顯示NUm;
現(xiàn)象是OLED上顯示一個數(shù)字Num,并且每秒鐘自動加1;如下圖所示:
二、示例:定時器定時中斷
2.1 接線圖
此接線圖和之前的OLED顯示屏的接線圖是一樣的,因為定時器和中斷系統(tǒng)的電路都在STM32內(nèi)部,定時中斷也是位我們程序設(shè)計提供服務(wù)的,所以芯片外面只插一個OLED顯示數(shù)據(jù)就行了;
硬件電路接線圖如下所示:
2.2 程序源碼
代碼路徑:
STM32入門教程資料\程序源碼\STM32Project\6-1 定時器定時中斷\User
STM32入門教程資料\程序源碼\STM32Project\6-1 定時器定時中斷\Hardware
具體代碼
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
uint16_t Num;
int main(void)
{
OLED_Init();
Timer_Init();
OLED_ShowString(1, 1, "Num:");
while (1)
{
OLED_ShowNum(1, 5, Num, 5);
}
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)//檢查中斷標(biāo)志位,檢查TIM_IT_Update是否更新
{
Num ++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
Time.c
:
#include "stm32f10x.h" // Device header
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//開啟TIM2的時鐘函數(shù)
TIM_InternalClockConfig(TIM2);//TIM2的時基單元由內(nèi)部時鐘控制
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//1分頻模式
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//計數(shù)器模式選擇為向上計數(shù)
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//周期,ARR自動重裝器的值,
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//PSC預(yù)分頻器的值,
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重復(fù)計數(shù)器的值,
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//配置時基單元
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//選擇中斷
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC優(yōu)先級分組
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);//NVIC初始化
TIM_Cmd(TIM2, ENABLE);//啟動定時器TIM2
}
/*
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
*/
代碼解釋:文章來源:http://www.zghlxwxcb.cn/news/detail-488943.html
代碼基本就是按照下圖一步步實現(xiàn):文章來源地址http://www.zghlxwxcb.cn/news/detail-488943.html
-
TIM_TimeBaseInit()
函數(shù):配置初始化時基單元,第一個參數(shù)是選擇具體的定時器,第二個參數(shù)是配置時基單元的一些參數(shù) -
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//開啟TIM2的時鐘函數(shù) -
TIM_InternalClockConfig(TIM2);
//TIM2的時基單元由內(nèi)部時鐘控制 - 代碼詳細解釋看注釋
到了這里,關(guān)于STM32單片機(六)TIM定時器 -> 第二節(jié):TIM定時中斷練習(xí)(定時器定時中斷和定時器外部時鐘)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!