STM32F103ZE的AHB時鐘為72MHz,通過HSE的8M倍頻到72M,然后APB1預分頻系數為2,所以TIM2-7時鐘為2*36M。由于定時器是16位,PSC寄存器最大為65536,不支持71999,所以只能以0.1ms計數。
整個系統在獲取時間的累增時,定義64位變量,即可運行很久的時間,不用擔心溢出或者死機。定義64位變量有2個方法,一就是用long long 直接定義,通過sizeof測試為8個字節;二就是利用”stdint.h”,typedef uint64_t u64。
一般情況下,定時器計時結果算法公式為: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執行一次
{Task2, 0, 200} // 200ms執行一次
};
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)任務執行期間獲取系統時間
在這里插入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
-
定時器
+關注
關注
23文章
3241瀏覽量
114513 -
時鐘頻率
+關注
關注
0文章
49瀏覽量
20325 -
HSE
+關注
關注
0文章
17瀏覽量
9447
發布評論請先 登錄
相關推薦
評論