做網(wǎng)站哪些技術(shù)資源優(yōu)化排名網(wǎng)站
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、STM32定時器的結(jié)構(gòu)?
- 1. 51定時器的結(jié)構(gòu)
- 1.1如何實現(xiàn)定時1s的功能?
- 2. stm32定時器的結(jié)構(gòu)
- 2.1 通用定時器
- 二、使用步驟
- 1.開啟時鐘
- 2.初始化定時器
- 3.中斷配置(分組、優(yōu)先級)
- 3.1 配置中斷源
- 3.2配置中斷優(yōu)先級
- 3.3 開啟定時器
- 3.4 中斷服務(wù)函數(shù)
- 3.5判斷中斷源, 清除中斷源
- 三、參考初始化函數(shù)
- 3.1寫成外設(shè)初始化函數(shù),方便main函數(shù)調(diào)用
- 3.2中斷函數(shù)
- 3.3 中斷服務(wù)函數(shù)加入時分秒
- 四、測試驗證
- 4.1時鐘使能查看
- 4.2 更新中斷狀態(tài)位
- 4.3 其他狀態(tài)和配置
- 五、拓展
- 總結(jié)
前言
提示:這里可以添加本文要記錄的大概內(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-3NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1; //0-3NVIC_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時鐘 72MHz2.配置定時器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-3NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1; //0-3NVIC_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)和配置
五、拓展
串口: 時鐘
- 通過串口獲取時分秒
- 通過串口修改時間
總結(jié)
深入淺出,從51單片機定時結(jié)構(gòu)到stm32定時結(jié)構(gòu)引導(dǎo)講解了,STM32如何實現(xiàn)定時1s的原理,并工程實現(xiàn)