?? hal_lptmr.c
字號:
/*
* 測試硬件平臺:LPLD_K60 Card
* 版權所有:北京拉普蘭德電子技術有限公司
* 網絡銷售:http://laplenden.taobao.com
* 公司門戶:http://www.lpld.cn
*
* 文件名: HAL_LPTMR.c
* 用途: LPTMR底層模塊相關函數
* 最后修改日期: 20120326
*
* 開發者使用協議:
* 本代碼面向所有使用者開放源代碼,開發者可以隨意修改源代碼。但本段及以上注釋應
* 予以保留,不得更改或刪除原版權所有者姓名。二次開發者可以加注二次版權所有者,
* 但應在遵守此協議的基礎上,開放源代碼、不得出售代碼本身。
*/
/*
*******需用到LPTMR中斷,請在isr.h中粘貼一下代碼:*********
//LPTMR模塊中斷服務定義
#undef VECTOR_101
#define VECTOR_101 LPLD_LPTMR_Isr
//以下函數在LPLD_Kinetis底層包,不必修改
extern void LPLD_LPTMR_Isr(void);
***********************代碼結束*************************
*/
#include "common.h"
#include "HAL_LPTMR.h"
LPTMR_ISR_CALLBACK LPTMR_ISR;
/*
* LPLD_GPIO_Init
* GPIO通用初始化函數
*
* 參數:
* mod--選擇LPTMR模式
* |__0-- 低功耗定時器模式
* |__1-- 脈沖累加模式
* period_ms--設定定時器的定時值 單位ms
* |__0-- 設置脈沖累加模式時選擇為0
* |__1ms<= period_ms <=65535ms
* channel--選擇累加輸入通道
* |__0-- 設置為定時器時選擇為0
* |__1-- 設置LPTMR_ALT1, PTA19為脈沖累加輸入
* |__2-- 設置LPTMR_ALT2, PTC5 為脈沖累加輸入
* irqc--輸入中斷
* |__0--不使能中斷
* |__1--使能中斷
* func
* |__低功耗定時器中斷回調函數
*
* 輸出:
* 0--配置錯誤
* 1--配置成功
*/
uint8_t LPLD_LPTMR_Init(uint8_t mod, uint16_t period_ms, uint8_t channel, uint8_t irqc, LPTMR_ISR_CALLBACK func)
{
SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK;//初始化LPTMR時鐘
LPTMR0_CSR=0x00; //清空寄存器
LPTMR0_PSR=0x00;
LPTMR0_CMR=0x00;
if(mod==0)// 配置成低功耗定時器功能
{
/* 配置LPTMR */
// LPO 1Khz
//設置比較的值
//使用內部時鐘 分頻系數Prescale為 2^(X+1)
//定時器的一個計數周期=時鐘源(Clk_Src)/ 預分頻值(Prescale)
//定時器的定時值=設置的比較值(compare_value)/定時器的一個計數周期
LPTMR0_CMR=LPTMR_CMR_COMPARE(period_ms); //Set compare value
LPTMR0_PSR=LPTMR_PSR_PCS(0x1)|LPTMR_PSR_PBYP_MASK; //Use LPO clock with bypass enabled
}
else if(mod==1) //配置成脈沖捕獲模式
{
if(channel==1) //LPTMR_ALT1
{
SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;
PORTA_PCR19=PORT_PCR_MUX(0x6); //設置PTA19為脈沖累加
}
else if(channel==2)//LPTMR_ALT2
{
SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK; //設置PTC5為脈沖累加
PORTC_PCR5=PORT_PCR_MUX(0x4);
}
else
{
return 0;
}
//與所用的內部時鐘無關
//外部輸入的信號作為計數時鐘
LPTMR0_PSR =LPTMR_PSR_PCS(0x1)|LPTMR_PSR_PBYP_MASK;
LPTMR0_CSR =LPTMR_CSR_TPS(channel);
LPTMR0_CSR|=LPTMR_CSR_TMS_MASK; //捕獲模式
LPTMR0_CSR|=LPTMR_CSR_TFC_MASK; //自由計數模式
}
else
{
return 0;
}
if(func!=NULL)
{
LPTMR_ISR=func;
enable_irq(85);
}
if(irqc==1)
{
LPTMR0_CSR|=LPTMR_CSR_TIE_MASK;
}
else if(irqc==0)
{
LPTMR0_CSR&=~LPTMR_CSR_TIE_MASK;
}
else
{
return 0;
}
LPTMR0_CSR|=LPTMR_CSR_TEN_MASK; //開啟LPTMR
return 1;
}
/*
* LPLD_LPTMR_Reset
* 低功耗定時器復位,復位以后清空低功耗定時器Counter
*
* 參數:
* 無
* 返回值:
* 無
*/
void LPLD_LPTMR_Reset(void)
{
LPTMR0_CSR&=(~LPTMR_CSR_TEN_MASK); //Reset LPTMR0
}
/*
* LPLD_LPTMR_GetPulseAcc
* 得到脈沖累加的值
*
* 參數:
* 無
* 返回值:
* 脈沖累加值
*/
uint16_t LPLD_LPTMR_GetPulseAcc(void)
{
return (uint16_t)LPTMR0_CNR;
}
/*
* LPLD_LPTMR_DelayMs
* 低功耗定時器延時n個ms
*
* 參數:
* period_ms--設定定時器的定時值 單位ms
* 最大65535ms
*
* 返回值:
* 無
*/
void LPLD_LPTMR_DelayMs(uint16_t period_ms)
{
if(!period_ms)
return;
/* 開啟LPTMR時鐘 */
SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK;
/* 設置毫秒延時計數 */
LPTMR0_CMR = period_ms;
/* 設置LPTMR不分頻采用1kHz LPO為時鐘源 */
LPTMR0_PSR = LPTMR_PSR_PCS(1)|LPTMR_PSR_PBYP_MASK;
/* 開啟定時器 */
LPTMR0_CSR |= LPTMR_CSR_TEN_MASK;
/* 等待計數達到設定值 */
while (!(LPTMR0_CSR & LPTMR_CSR_TCF_MASK));
/*清除定值比較標志 */
LPTMR0_CSR &= ~LPTMR_CSR_TEN_MASK;
return;
}
/*
* LPLD_LPTMR_Isr
* 低功耗定時器中斷服務子程序
*
* 參數:
* 無
*
* 返回值:
* 無
*/
void LPLD_LPTMR_Isr(void)
{
LPTMR0_CSR|=LPTMR_CSR_TCF_MASK; //清除LPT比較標志
LPTMR_ISR();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -