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文章
3287瀏覽量
117205 -
時鐘頻率
+關注
關注
0文章
50瀏覽量
20615 -
HSE
+關注
關注
0文章
18瀏覽量
9596
發布評論請先 登錄
快速入門——LuatOS:sys庫多任務管理實戰攻略!

工控一體機多線程任務調度優化:聚徽分享破解工業復雜流程高效協同密碼
安全生產調度管理系統的核心功能模塊
AGV監控與任務管理系統設計

數字化工廠物流核心技術—AGV調度系統

SSTF中脈沖前傾的仿真
基于Flexus X加速MySQL鏡像搭建XXL-JOB任務調度平臺

負載管理器的主要功能
MES系統如何實現生產車間的實時監控、精準調度

上線 Airflow 官方!DolphinDB 帶來數據管理新體驗

Linux調度器的核心scheduler_tick介紹
智能調度 多臺AGV為什么不會撞在一起?

評論