STM32F103ZE的AHB時鐘為72MHz,通過HSE的8M倍頻到72M,然后APB1預分頻系數(shù)為2,所以TIM2-7時鐘為2*36M。由于定時器是16位,PSC寄存器最大為65536,不支持71999,所以只能以0.1ms計數(shù)。
整個系統(tǒng)在獲取時間的累增時,定義64位變量,即可運行很久的時間,不用擔心溢出或者死機。定義64位變量有2個方法,一就是用long long 直接定義,通過sizeof測試為8個字節(jié);二就是利用”stdint.h”,typedef uint64_t u64。
一般情況下,定時器計時結(jié)果算法公式為:Tout = (ARR+1)(PSC+1)/Tclk。Tclk即為時鐘頻率。
準備工作
-
1)建立一個struct
typedef struct{
void (*fTask)(void);
u32 uNextTick;
u32 uLenTick;
}sTask;
1
2
3
4
5
-
2)任務列表
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)任務執(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文章
3375瀏覽量
124683 -
時鐘頻率
+關(guān)注
關(guān)注
0文章
74瀏覽量
21185 -
HSE
+關(guān)注
關(guān)注
0文章
18瀏覽量
9879
發(fā)布評論請先 登錄
一文說透了如何實現(xiàn)單片機的多任務并發(fā)!
國內(nèi)七大基于大模型的發(fā)射任務調(diào)度與過程保障分系統(tǒng)軟件介紹
基于大模型的發(fā)射任務調(diào)度與過程保障分系統(tǒng)平臺的應用與未來發(fā)展
深入Linux內(nèi)核:進程調(diào)度的核心邏輯與實現(xiàn)細節(jié)
大模型驅(qū)動的發(fā)射任務智能調(diào)度分系統(tǒng)軟件平臺的應用與未來發(fā)展
大模型ai驅(qū)動的發(fā)射任務智能調(diào)度分系統(tǒng):功能特點與平臺架構(gòu)解析
嵌入式基礎(chǔ)知識-系統(tǒng)調(diào)度
在多任務系統(tǒng)中,如何平衡任務調(diào)度以防止因高負載導致的再次進入低功耗模式的延遲?
freertos關(guān)閉任務調(diào)度的方法
FreeRTOS任務調(diào)度及優(yōu)先級問題
【產(chǎn)品介紹】Altair PBS Professional HPC工作負載管理器和作業(yè)調(diào)度管理系統(tǒng)
揭秘LuatOS Task:多任務管理的“智能中樞”
快速入門——LuatOS:sys庫多任務管理實戰(zhàn)攻略!
stm32任務調(diào)度和管理
評論