STM32F103ZE的AHB時鐘為72MHz,通過HSE的8M倍頻到72M,然后APB1預(yù)分頻系數(shù)為2,所以TIM2-7時鐘為2*36M。由于定時器是16位,PSC寄存器最大為65536,不支持71999,所以只能以0.1ms計數(shù)。
整個系統(tǒng)在獲取時間的累增時,定義64位變量,即可運行很久的時間,不用擔(dān)心溢出或者死機。定義64位變量有2個方法,一就是用long long 直接定義,通過sizeof測試為8個字節(jié);二就是利用”stdint.h”,typedef uint64_t u64。
一般情況下,定時器計時結(jié)果算法公式為:Tout = (ARR+1)(PSC+1)/Tclk。Tclk即為時鐘頻率。
準(zhǔn)備工作
-
1)建立一個struct
typedef struct{
void (*fTask)(void);
u32 uNextTick;
u32 uLenTick;
}sTask;
1
2
3
4
5
-
2)任務(wù)列表
static sTask mTaskTab[] =
{
{Task_SysTick, 0, 0} ,
{Task1, 0, 100} , // 10ms執(zhí)行一次
{Task2, 0, 200} // 200ms執(zhí)行一次
};
1
2
3
4
5
6
-
3)初始化定時器
void TaskTimer_Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_SetCounter(TIM2, 0);
/* TIM enable counter */
TIM_Cmd(TIM2, ENABLE);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-
4)獲取啟動后時間
u64 GetTimingTick()
{
return TimingTick;
}
1
2
3
4
-
5)任務(wù)執(zhí)行期間獲取系統(tǒng)時間
在這里插入void Task_SysTick()
{
u32 temp = TIM_GetCounter(TIM2);
if(temp > 10000)
{
TIM_SetCounter(TIM2,0);
TimingTickHold = TimingTickHold + temp;
temp = 0;
}
TimingTick = temp + TimingTickHold;
}
1
2
3
4
5
6
7
8
9
10
11
運行實例
#define ARRAYSIZE(a) (sizeof(a)/sizeof((a)[0]))
static sTask mTaskTab[] =
{
{Task_SysTick, 0, 0},
{DATA_HANDLE, 0, 500},//50ms
{Key_Scan, 0, 500}
};
while(1)
{
for(int i = 0;i < ARRAYSIZE(mTaskTab);i++ )
{
if(mTaskTab[i].uNextTick <= GetTimingTick() )
{
mTaskTab[i].uNextTick += mTaskTab[i].uLenTick;
mTaskTab[i].fTask();
}
}
}
文章整合自:CSDN
編輯:ymf
-
定時器
+關(guān)注
關(guān)注
23文章
3259瀏覽量
115912 -
時鐘頻率
+關(guān)注
關(guān)注
0文章
50瀏覽量
20490 -
HSE
+關(guān)注
關(guān)注
0文章
17瀏覽量
9528
發(fā)布評論請先 登錄
相關(guān)推薦
AGV監(jiān)控與任務(wù)管理系統(tǒng)設(shè)計

車隊運營調(diào)度管理系統(tǒng)

基于Flexus X加速MySQL鏡像搭建XXL-JOB任務(wù)調(diào)度平臺

負(fù)載管理器的主要功能
ESP32C3任務(wù)執(zhí)行一段時間,會出現(xiàn)任務(wù)不運行的問題,為什么?
鴻蒙開發(fā)接口資源調(diào)度:【@ohos.workScheduler (延遲任務(wù)調(diào)度)】

淺析FreeRTOS任務(wù)調(diào)度器的三種調(diào)度算法和應(yīng)用

用STM32CubeMX中的FreeRTOS創(chuàng)建3任務(wù)無法運行的原因?
Windows 11任務(wù)管理器將CPU性能單位調(diào)整為MT/s
智慧園區(qū):構(gòu)建安全調(diào)度和預(yù)警管理系統(tǒng)

智慧園區(qū)安全調(diào)度管理都有哪些

評論