以STM32F030F4P6,uVision開發環境為例,注意了,若使用其它相近芯片,本文僅供參考。
TIM3 結構框圖
在中斷文件stm32f0xx_it.c 中修改或添加下面語句、函數。
extern void LED_A4 (); //外部引入函數聲明 加在文件首部
void TIM3_IRQHandler(void) // 加入TIM3中斷函數
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); // 清TIM3溢出中斷標志位
LED_A4 (); //亮燈取反滅燈函數
}
下面是main.c文件
#include "stm32f0xx.h"
void LED_Init(void) //LED初始化函數
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能A口的時鍾
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 ; //指明A4口
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //設定輸出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //設定輸出為上拉
GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3; //設定級別為3
GPIO_Init(GPIOA, &GPIO_InitStruct); //按以上設置初始化A4
}
void LED_A4(void) //亮燈取反滅燈函數
{
GPIO_WriteBit(GPIOA, GPIO_Pin_4, //指定修改A4腳的位
(BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)))); //讀A4狀態后取反
}
void TIM_INIT_Config(void) //TIM3中斷初始化函數
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //聲明TIM_TimeBaseInitTypeDef結構變量
NVIC_InitTypeDef NVIC_InitStructure; //聲明NVIC_InitTypeDef 向量結構變量
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3時鍾
// 定時器基礎設置
TIM_TimeBaseStructure.TIM_Period = 1199; //設置自動重載計數=1199+1=1200
TIM_TimeBaseStructure.TIM_Prescaler = 2-1; //定時器的時鍾頻率=TIM_Prescaler+1=2;
TIM_TimeBaseStructure.TIM_ClockDivision = 1; //輸入捕獲時濾波用的參數,必須設一下
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據指定的參數初始
// TIM3 中斷嵌套設置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //選擇TIM3的IRQ通道
NVIC_InitStructure.NVIC_IRQChannelPriority = 0; //IRQ通道優先級=0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能IRQ通道
NVIC_Init(&NVIC_InitStructure); //按以參數上設置
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除標志位,以免一啟用中斷后立即產生中斷
TIM_ARRPreloadConfig(TIM3, DISABLE); //禁止ARR預裝載緩沖器
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE); //使能TIM3溢出中斷
TIM_Cmd(TIM3, ENABLE); //使能TIM3 總中斷
}
int main(void)
{
LED_Init(); //LED初始化函數
TIM_INIT_Config(); //TIM3中斷初始化函數
while (1) //主環等待
{}
}
說明:
1 上面“使能TIM3時鍾”就是打開開關,引入RCC的CK_INT,見另一篇博文“徹底整明白STM32F030 的時鍾”,
之前設置CK_INT的時鍾為48M,所以TIM3預分頻系數=2時,分頻后時鍾=24M。
2 24M時鍾進入TIM3計數器,計數器溢出門限設置為1200,什么意思?
這是說24M時鍾意味着每秒有24000000個脈沖入重載計數器,每查夠1200個脈沖計數器就溢出,輸出1個
中斷信號,然后程序跳入中斷去翻轉A4腳燈的狀態,亮、滅、亮、滅 ....
3 24MHz時鍾每秒有24000000個脈沖,每個脈沖的時間=1秒/24000000
1200個脈沖的時間=1200*(1秒/24000000)=0.05*10-3 秒
所以A4腳燈亮0.05*10-3 秒,然后滅0.05*10-3 秒,亮0.05*10-3 秒,再滅0.05*10-3 秒,如此循環;
兩個亮之間的間隔時間 = 亮0.05*10-3 +滅0.05*10-3 秒=0.1*10-3 秒
兩個亮之間的間隔時間秒的倒數 = 頻率Hz =1/0.1*10-3 秒=10000Hz=10KHz
用頻率計測A4腳的頻率=10KHz,如果設置頻率小於30Hz,能看到A4腳接的LED燈在閃。
4 如何改變頻率呢?
很簡單,調整TIM3重載計數器溢出門限值和預分頻系數都可以的。
還有別的方法調整TIM3中斷輸出頻率嗎? 當然有,別忘了CK_INT入TIM3前,時鍾系統還有不少可調整
的分頻器、倍頻器哦,翻翻博主的其它相關文章參考下吧。