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

📄 hal_pit.c

📁 Kinetis_K60开源底层驱动开发包(20120328)
💻 C
字号:
/*
 * 测试硬件平台:LPLD_K60 Card
 * 版权所有:北京拉普兰德电子技术有限公司
 * 网络销售:http://laplenden.taobao.com
 * 公司门户:http://www.lpld.cn
 *
 * 文件名: HAL_PIT.c
 * 用途: PIT底层模块相关函数
 * 最后修改日期: 20120321
 *
 * 开发者使用协议:
 *  本代码面向所有使用者开放源代码,开发者可以随意修改源代码。但本段及以上注释应
 *  予以保留,不得更改或删除原版权所有者姓名。二次开发者可以加注二次版权所有者,
 *  但应在遵守此协议的基础上,开放源代码、不得出售代码本身。
 */

/*
 *******需用到定时中断,请在isr.h中粘贴一下代码:*********

//PIT模块中断服务定义
#undef  VECTOR_084
#define VECTOR_084 LPLD_PIT_Isr
#undef  VECTOR_085
#define VECTOR_085 LPLD_PIT_Isr
#undef  VECTOR_086
#define VECTOR_086 LPLD_PIT_Isr
#undef  VECTOR_087
#define VECTOR_087 LPLD_PIT_Isr
//以下函数在LPLD_Kinetis底层包,不必修改
extern void LPLD_PIT_Isr(void);

 ***********************代码结束*************************
*/

#include "common.h"
#include "HAL_PIT.h"


//引用总线时钟频率,该值在sysinit.c文件中取得
extern int periph_clk_khz;

//用户自定义中断服务函数数组
PIT_ISR_CALLBACK PIT_ISR[4];


/*
 * LPLD_PIT_Init
 * PIT通用初始化函数
 * 
 * 参数:
 *    channel--PIT通道号
 *      |__0--PIT0
 *      |__1--PIT1
 *      |__2--PIT2
 *      |__3--PIT3
 *    period_us--中断周期
 *      |__单位为微妙
 *    isr_func--用户中断程序入口地址
 *      |__用户在工程文件下定义的中断函数名,函数必须为:无返回值,无参数(eg. void isr(void);)
 *
 * 输出:
 *    0--配置错误
 *    1--配置成功
 */
uint8_t LPLD_PIT_Init(uint8_t channel, uint32_t period_us, PIT_ISR_CALLBACK isr_func)
{ 
  uint32_t ldval;
  uint32_t periph_clk_mhz;
  
  if(channel>3)
    return 0;
  
  //计算定时加载值
  periph_clk_mhz = periph_clk_khz/1000;
  ldval = period_us*periph_clk_mhz;
  if(ldval<1)
    return 0;
  
  //开启定时模块时钟
  SIM_SCGC6 |= SIM_SCGC6_PIT_MASK;
  
  // 开启 PIT
  PIT_MCR = 0x00;
 
  if(isr_func!=NULL){
    PIT_ISR[channel] = isr_func;
    //在NVIC中使能PIT中断
    enable_irq(68+channel); 
  }
  
  //period = (period_ns/bus_period_ns)-1
  PIT_LDVAL_REG(PIT_BASE_PTR,channel) = ldval-1;
  
  //使能中断
  PIT_TCTRL_REG(PIT_BASE_PTR,channel) = PIT_TCTRL_TIE_MASK;
  //开始定时
  PIT_TCTRL_REG(PIT_BASE_PTR,channel) |= PIT_TCTRL_TEN_MASK;
  
  return 1;
}

/*
 * LPLD_PIT_Isr
 * PIT通用中断底层入口函数
 * 
 * 用户无需修改,程序自动进入对应通道中断函数
 */
void LPLD_PIT_Isr(void)
{
  #define PIT_VECTORNUM   (*(volatile uint8_t*)(0xE000ED04))
  uint8_t pit_ch = PIT_VECTORNUM - 84;
    
  //调用用户自定义中断服务
  PIT_ISR[pit_ch]();  
  //清除中断标志位
  PIT_TFLG_REG(PIT_BASE_PTR,pit_ch) |= PIT_TFLG_TIF_MASK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -