⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hal_lptmr.c

📁 Kinetis_K60开源底层驱动开发包(20120328)
💻 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 + -