本文來源電子發(fā)燒友社區(qū),作者:HonestQiao, 帖子地址:https://bbs.elecfans.com/jishu_2289203_1_1.html
效果演示(開發(fā)板體驗視頻,詳見作者原文鏈接內(nèi)容)
在微五科技CF3310開發(fā)板上,提供了兩個32 位可編程中斷計時器模塊:
其具體的處理邏輯如下:
通過對官方提供的pit32_demo的學(xué)習(xí),了解到該定時器的基礎(chǔ)使用方式。
要使用開發(fā)板上的定時器,有兩個概念,我們需要先了解:
- 分頻:為了得到準(zhǔn)確的計時時間,通常使用開發(fā)板運行頻率,取其2的整數(shù)次方 之一,得到一個合適的頻率值,然后根據(jù)該頻率值進(jìn)行計數(shù);否則,頻率值過大,導(dǎo)致計數(shù)值增長太快,計數(shù)器溢出。
- 計數(shù):在上述分頻的基礎(chǔ)上,進(jìn)行計數(shù),累積到預(yù)先設(shè)定的數(shù)值,就觸發(fā)定時器進(jìn)行具體的操作。
通過查看官方手冊,可以了解到該開發(fā)板的具體可分頻數(shù):
在系統(tǒng)的src/hal/inc/pit32_hal.h中,也有具體的定義:
在pit32_demo中,分頻取得是32:
那么,根據(jù)該分頻,最終需要的計數(shù)值,則由下面的函數(shù)來計算:
如果系統(tǒng)運行在30MHz,則1秒對應(yīng)的計數(shù)值為:counter
= 30*10e6/32/1 = 937500
也就是說,每計數(shù)到該數(shù)值,就能觸發(fā)一次計時器回調(diào)了。
在上述代碼中,對定時器的具體設(shè)置說明如下:
// 定時器初始化
// 定義定時器變量
PIT32_HandleTypeDef hpit32;
// 使用PIT1定時器,有兩個PIT1、PIT2可用
hpit32.instance = PIT1;
// 設(shè)定計數(shù)值
hpit32.init.counter = pit32_led_CalcCounter(g_ips_clk,PIT32_CLK_DIV_32,PIT32_1S);
// 啟用中斷
hpit32.init.enableIE = ENABLE;
// 啟用重復(fù)調(diào)用,否則就是單詞觸發(fā)
hpit32.init.reLoad = ENABLE;
// 設(shè)定分頻
hpit32.init.prescaler = PIT32_CLK_DIV_32;
// 以下三項,可具體查看手冊詳細(xì)了解
hpit32.init.runatDebug = ENABLE;
hpit32.init.runatDoze = ENABLE;
hpit32.init.updateCNT = ENABLE;
設(shè)置好定時器后,就可以使用下面的調(diào)用來啟動定時器:HAL_PIT32_Init(&hpit32);
然后,定時器觸發(fā)時,會自動調(diào)用:void HAL_PIT32_Callback(void *hpit32)
我們的處理程序,就可以寫到該回調(diào)中進(jìn)行處理。
需要注意的是,這是一個全局回調(diào),所以只能定義一次。
我在寫pit32_led例子的時候,就需要先把原來的pit32_demo.c中的注釋掉。
了解了以上定時器的基礎(chǔ)使用方法,再結(jié)合eport_demo中控制LED的方法,我們就能用定時器實現(xiàn)一個閃亮LED的程序。
具體的代碼展示如下:
- src/demo/inc/demo.h中,添加如下部分:
#ifdef PIT32_LED_EN
#include "pit32_led.h"
#endif
- src/main/main.c中,添加如下部分:
#ifdef PIT32_LED_EN
/* 32bits 可編程中斷定時器*/
PIT32_LED_Run();
#endif
- src/demo/inc/pit32_led.h
/*
* pit32_led.h
*
*/
#ifndef PIT32_LED_H_
#define PIT32_LED_H_
extern void PIT32_LED_Run(void);
#endif /* PIT32_LED_H_ */
- src/demo/pit32_led.c:
/*
* pit32_led.c
*
*/
#include "pit32_demo.h"
#include "pit32_hal.h"
#include "eport_hal.h"
#include "cpm_hal.h"
#include "hal.h"
#include "delay.h"
#include "debug.h"
#define RETERR() do{printf("t行號:%d ERRrn",__LINE__);
return;}while(0)
EPORT_InitTypeDef eport;
EPORT_PinDef pin_num;
EPORT_TypeDef *eport_base;
int32_t led_status = 0;
uint32_t pit32_led_CalcCounter(uint32_t clk,uint32_t div, uint32_t time)
{
return (clk/(1<
void PIT32_LED_Run(void)
{
// 定時器初始化
PIT32_HandleTypeDef hpit32;
hpit32.instance = PIT1;
hpit32.init.counter = pit32_led_CalcCounter(g_ips_clk,PIT32_CLK_DIV_32,PIT32_1S);
hpit32.init.enableIE = ENABLE;
hpit32.init.reLoad = ENABLE;
hpit32.init.prescaler = PIT32_CLK_DIV_32;
hpit32.init.runatDebug = ENABLE;
hpit32.init.runatDoze = ENABLE;
hpit32.init.updateCNT = ENABLE;
// LED初始化
pin_num = EPORT_PIN4;
eport_base = EPORT;
eport.pin = pin_num;
eport.func = GPIO_FUN;
eport.dir = GPIO_DIR_OUT;
eport.output_mode = EPORT_OUTPUT_MODE_CMOS;
eport.pull_mode = EPORT_PULL_UP;
HAL_EPORT_Init(eport_base, &eport);
HAL_EPORT_TogglePin(eport_base, pin_num);
// 啟動定時器
HAL_PIT32_Init(&hpit32);
while(1);
}
void HAL_PIT32_Callback(void *hpit32)
{
led_status = !led_status;
if(led_status) {
printf("Enter PIT interrupt, set LED Onrn");
HAL_EPORT_WritePin(eport_base, pin_num, BIT_SET);
} else {
printf("Enter PIT interrupt, set LED Offrn");
HAL_EPORT_WritePin(eport_base, pin_num, BIT_RESET);
}
}
)>
在以上的代碼中,使用到了PIN4,實際驅(qū)動的LED,直接使用了板載的LED2,具體接線如下:
另外,上圖中的兩個跳線帽,短接對應(yīng)的引腳后,開發(fā)板上的Type-C接口在連接到電腦后,就能直接用串口工具打開,查看調(diào)試信息了:
連接好線,在IDE中編輯下載后,實際跑起來之后,效果如視頻所示
-
微五科技
+關(guān)注
關(guān)注
1文章
27瀏覽量
2601 -
開發(fā)板試用
+關(guān)注
關(guān)注
3文章
301瀏覽量
2121 -
CF3310
+關(guān)注
關(guān)注
0文章
23瀏覽量
351
發(fā)布評論請先 登錄
相關(guān)推薦
評論