提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
前言
提示:這里可以添加本文要記錄的大概內(nèi)容:
定時器有什么用?精準(zhǔn)延時,PWM,做一個時鐘:年月日,時分秒。時鐘最基本的就是1s怎么來?
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、STM32定時器的結(jié)構(gòu)?
1. 51定時器的結(jié)構(gòu)
1.1如何實現(xiàn)定時1s的功能?
- 選定時功能
- 裝初值
- 配置定時器中斷
- 中斷里面計數(shù),計數(shù)多少次根據(jù)定時的需要
2. stm32定時器的結(jié)構(gòu)
2.1 通用定時器
部分芯片時沒有基本定時器的
有基本定時器的型號
- 時鐘來源RCC
- 控制器,應(yīng)該是要使能
- 分頻器
- 裝計數(shù)初值
- 中斷
二、使用步驟
1.開啟時鐘
代碼如下(示例):
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
2.初始化定時器
代碼如下(示例):
//TIM_TimeBaseInitStruct.TIM_ClockDivision=
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=50000-1;
TIM_TimeBaseInitStruct.TIM_Prescaler= 72-1;
//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct);
3.中斷配置(分組、優(yōu)先級)
3.1 配置中斷源
timer6只有溢出中斷
TIM_ITConfig( TIM6, TIM_IT_Update, ENABLE);
3.2配置中斷優(yōu)先級
NVIC_InitStruct.NVIC_IRQChannel=TIM6_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; //0-3
NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1; //0-3
NVIC_Init(&NVIC_InitStruct);
3.3 開啟定時器
出了GPIO今后每個外設(shè)都要單獨開啟
TIM_Cmd( TIM6, ENABLE); //使能
3.4 中斷服務(wù)函數(shù)
在啟動文件找到中斷向量表,然后完成中斷服務(wù)函數(shù)
void TIM6_IRQHandler()
{
if(TIM_GetITStatus( TIM6, TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
num++;
if(num==20)
{
num=0;
//led取反
}
}
}
3.5判斷中斷源, 清除中斷源
三、參考初始化函數(shù)
3.1寫成外設(shè)初始化函數(shù),方便main函數(shù)調(diào)用
void timer6()
{
/*
1.開啟APB1時鐘 72MHz
2.配置定時器6 TimeInit() 72預(yù)分配,0-65535 1000000us/50000us =CNT=20 定時時間/中斷溢出時間=計數(shù)值
3.中斷配置 分組,優(yōu)先級 。開啟中斷源
4.中斷服務(wù)函數(shù) 計數(shù)值, 1us ,計數(shù)20次后讓一個LED取反
*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
//TIM_TimeBaseInitStruct.TIM_ClockDivision=
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=50000-1;
TIM_TimeBaseInitStruct.TIM_Prescaler= 72-1;
//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct);
//開啟中斷:
TIM_ITConfig( TIM6, TIM_IT_Update, ENABLE);
TIM_Cmd( TIM6, ENABLE); //使能
NVIC_InitStruct.NVIC_IRQChannel=TIM6_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; //0-3
NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1; //0-3
NVIC_Init(&NVIC_InitStruct);
}
3.2中斷函數(shù)
void TIM6_IRQHandler()
{
if(TIM_GetITStatus( TIM6, TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
num++;
if(num==20)
{
num=0;
//led取反
}
}
}
3.3 中斷服務(wù)函數(shù)加入時分秒
void TIM6_IRQHandler()
{
if(TIM_GetITStatus( TIM6, TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
num++;
if(num==20)
{
num=0;
//led取反
GPIOA->ODR^=0x0100;
// 異或,相同為0,不同為1
//拿0 去異或,原來是0,還是0;原來是1,還是1。既可以保持不變
//拿1 去異或,原來是0,變成1;原來是0,變成1。起到取反的作用
second++;
one_second_flag=1;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
}
四、測試驗證
在中斷服務(wù)函數(shù)設(shè)定斷點
4.1時鐘使能查看
4.2 更新中斷狀態(tài)位
4.3 其他狀態(tài)和配置
五、拓展
串口: 時鐘
- 通過串口獲取時分秒
- 通過串口修改時間
文章來源:http://www.zghlxwxcb.cn/news/detail-734637.html
總結(jié)
深入淺出,從51單片機定時結(jié)構(gòu)到stm32定時結(jié)構(gòu)引導(dǎo)講解了,STM32如何實現(xiàn)定時1s的原理,并工程實現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-734637.html
到了這里,關(guān)于STM32基本定時器中斷的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!