我们以KEA64系列来学习周期中断定时器PIT, 其中KEA64系列包括:

SKEAZN16AMLC®
SKEAZN32AMLC®
SKEAZN64AMLC®
SKEAZN32AMLH®
SKEAZN64AMLH®

PIT框图

注: KEA64有1个PIT, 里面又有2个独立的通道PIT0和PIT1;我的理解就是两个独立的定时器。

PIT寄存器


这里不展开来说明寄存器,具体地还是要看相应的手册。

PIT时序

PIT用法之一:查询标志位

以PIT0为例

基本步骤

  • 初始化时钟(core clock和bus clock)
  • 初始化PIT
    • 使能 bus clock
    • 启动 PIT
    • 加载PIT_LDVAL0或PIT_LDVAL1初始值
    • 启动PIT定时器
  • 主循环
    • 查询PIT定时器中断标志位
    • 清除中断标志位

定时1s例程

通过查询方式,使LED每隔1s周期地闪烁

#include "derivative.h" /* include peripheral declarations SSKEAZN64M2 */#define PTD2 26  /* Port PTD2, bit 26: output to blue LED */void Clk_Init(void);
void init_PIT(void);int main(void)
{Clk_Init();init_PIT();GPIOA_PDDR |= 1<<PTD2; /* Port D2: Data Direction= output */GPIOA_PIDR &= 1<<PTD2; /* Port D2: Input Disable= 1 (default) */for(;;){while (0 == (PIT_TFLG0 & PIT_TFLG_TIF_MASK)) {}   /* Wait for PIT0 flag */PIT_TFLG0 |= PIT_TFLG_TIF_MASK;   /* Clear PIT0 flag */GPIOA_PTOR |= 1<<PTD2; /* Set Output on port D2 (LED on) */}return 0;
}/***********************************************************************************************
*
* @brief    CLK_Init - Initialize Core Clock to 40MHz, Bus Clock to 20MHz
* @param    none
* @return   none
*
************************************************************************************************/
void Clk_Init(void)
{OSC_CR = 0x00;      /* (default value) *//* OSCEN=0: OSC module disabled *//* OSCSTEN=0: OSC clock disabled in Stop mode *//* OSCOS=0: Ext clk source (don't care here) *//* RANGE=0: Low Freq range of 32 KHz *//* HGO=0: low power High Gan Osc mode (don't care here) */ICS_C1|=ICS_C1_IRCLKEN_MASK; /* Enable the internal reference clock*/ICS_C3= 0x50; /* Reference clock frequency =  39.0625 kHz*/while(!(ICS_S & ICS_S_LOCK_MASK)); /* Wait for PLL lock, now running at 40 MHz (1024*39.0625 kHz) */ICS_C2|=ICS_C2_BDIV(1) ; /*BDIV=2, Bus clock = 20 MHz*/ICS_S |= ICS_S_LOCK_MASK ; /* Clear Loss of lock sticky bit */
}/***********************************************************************************************
*
* @brief    init_PIT - 设定定时器周期溢出时间1s, 没有启动中断,需要外部查询溢出标志位
* @param    none
* @return   none
*
************************************************************************************************/
void init_PIT(void)
{SIM_SCGC |= SIM_SCGC_PIT_MASK;     /* Enable bus clock to PIT module */PIT_MCR = 0x0;                     /* Turn on PIT module, Freeze disabled */PIT_LDVAL0 = 20000000 - 1;         /* PIT0: Load value to count 20M bus clocks */PIT_TCTRL0 |= PIT_TCTRL_TEN_MASK;  /* PIT0: Start timer */PIT_TCTRL0 |= PIT_TCTRL_TEN_MASK;
}

PIT用法之二:中断

以PIT1为例

基本步骤

  • 初始化时钟(core clock和bus clock)
  • 初始化中断
    • Clear any prior pending PIT channel 1 interrupt
    • Enable PIT channel 1 interrupt
    • Set PIT channel 1 interrupt priority from 0 to 3 (3 is highest)
  • 初始化PIT
    • 使能 bus clock
    • 启动 PIT
    • 加载PIT_LDVAL0或PIT_LDVAL1初始值
    • 允许PIT中断
    • 启动PIT定时器
  • PIT1中断服务程序
    • 清除中断标志位

定时1s例程

以PIT1为例 ,通过中断方式,使LED每隔1s周期地闪烁

#include "derivative.h" /* include peripheral declarations SSKEAZN64M2 */#define PTD2 26  /* Port PTD2, bit 26: output to blue LED */void Clk_Init(void);
void init_IRQs(void);
void init_PIT(void);int main(void)
{Clk_Init();init_IRQs();init_PIT();GPIOA_PDDR |= 1<<PTD2; /* Port D2: Data Direction= output */GPIOA_PIDR &= 1<<PTD2; /* Port D2: Input Disable= 1 (default) */for(;;){;}return 0;
}/***********************************************************************************************
*
* @brief    CLK_Init - Initialize Core Clock to 40MHz, Bus Clock to 20MHz
* @param    none
* @return   none
*
************************************************************************************************/
void Clk_Init(void)
{OSC_CR = 0x00;      /* (default value) *//* OSCEN=0: OSC module disabled *//* OSCSTEN=0: OSC clock disabled in Stop mode *//* OSCOS=0: Ext clk source (don't care here) *//* RANGE=0: Low Freq range of 32 KHz *//* HGO=0: low power High Gan Osc mode (don't care here) */ICS_C1|=ICS_C1_IRCLKEN_MASK; /* Enable the internal reference clock*/ICS_C3= 0x50; /* Reference clock frequency =  39.0625 kHz*/while(!(ICS_S & ICS_S_LOCK_MASK)); /* Wait for PLL lock, now running at 40 MHz (1024*39.0625 kHz) */ICS_C2|=ICS_C2_BDIV(1) ; /*BDIV=2, Bus clock = 20 MHz*/ICS_S |= ICS_S_LOCK_MASK ; /* Clear Loss of lock sticky bit */
}/***********************************************************************************************
*
* @brief    init_PIT - 设定定时器周期溢出时间1s, 启动中断
* @param    none
* @return   none
*
************************************************************************************************/
void init_PIT(void)
{SIM_SCGC |= SIM_SCGC_PIT_MASK;     /* Enable bus clock to PIT module */PIT_MCR = 0x0;                     /* Turn on PIT module, Freeze disabled */PIT_LDVAL1 = 20000000 - 1;         /* PIT1: Load value to count 20M bus clocks */PIT_TCTRL1 |= PIT_TCTRL_TIE_MASK;  /* Enable interrupt */PIT_TCTRL1 |= PIT_TCTRL_TEN_MASK;  /* PIT1: Start timer */PIT_TCTRL1 |= PIT_TCTRL_TEN_MASK;
}/***********************************************************************************************
*
* @brief    init_IRQs
* @param    none
* @return   none
*
************************************************************************************************/
void init_IRQs(void)
{NVIC_ClearPendingIRQ(PIT_CH1_IRQn);  /* Clear any Pending IRQ for all PIT ch1 (#23) */NVIC_EnableIRQ(PIT_CH1_IRQn);        /* Set Enable IRQ for PIT_CH1 */NVIC_SetPriority(PIT_CH1_IRQn,0);    /* Set Priority for PIT_CH1 */
}/***********************************************************************************************
*
* @brief    PIT_CH1_IRQHandler - PIT CH1中断程序
* @param    none
* @return   none
*
************************************************************************************************/
void PIT_CH1_IRQHandler (void)
{PIT_TFLG1 |= PIT_TFLG_TIF_MASK; /* Clear PIT1 flag */GPIOA_PTOR |= 1<<PTD2; /* Set Output on port D2 (LED on) */
}

上面两个例程的结果如下:

小结

  • PIT有两个独立的通道: PIT0和PIT1
  • PIT时钟来自bus clock
  • 当PIT_LDVAL0或PIT_LDVAL1 初始值减到0的时候,便会产生一个定时中断标志,同时也会自动加载这个初始值,以便产生下一个周期的定时中断标志
  • 产生中断标志后,一定要手动清除这个标志位,不然不会进入下一个中断周期
  • PIT有两种用法:中断标志位查询法 和 中断服务程序法

学习KEA之周期中断定时器PIT相关推荐

  1. 9、ARM嵌入式系统:周期中断定时器PIT初始化

    一.PIT是什么 PIT即Periodic interrupt timer,周期中断定时器,PIT模块是一组计时器,可用于引发中断和触发DMA信道.PIT主要功能是定时器产生DMA触发脉冲和定时器产生 ...

  2. MPC5744P-PIT模块(周期中断定时器)

    1.功能描述 在周期中断定时器使能的情况下,定时器加载被LDVAL寄存器指定的计数初值,然后递减计数,当递减到0时自动重载LDVAL指定的计数初值并触发一次中断.中断的使能由TCTR寄存器TIE位控制 ...

  3. 痞子衡嵌入式:介绍i.MXRT定时器PIT的多通道链接模式及其在coremark测试工程里的应用...

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT定时器PIT的多通道链接模式及其在coremark测试里的应用. 早在 2018 年 i.MXRT 系列跨界处理器刚推出的时 ...

  4. 嵌入式小白学习:STM32实现定时器控制LED灯

    嵌入式小白学习:STM32实现定时器控制LED 目录 嵌入式小白学习:STM32实现定时器控制LED Part1.理论基础 Part2.环境的配置 Part3.代码的更改 Part4.实物的连线 Pa ...

  5. 学习笔记3 Linux定时器和sg90舵机的综合应用

    今天学习了Linux的定时器功能,并复刻了学习51单片机时玩的智能感应垃圾桶项目.总体感觉难度不大. 先捏软柿子,sg90舵机,应该是市面上能能买到的最便宜的舵机了吧(我瞎说的,如果不是可以发链接给我 ...

  6. C#多线程学习之(五)使用定时器进行多线程的自动管理

    本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执 ...

  7. STM32学习笔记(五 定时器及应用 3 PWM输出实验 )

    一.PWM 简介 脉冲宽度调制(PWM) Pulse Width Modulation (调制) 简单来说就是对脉冲宽度的控制. 高级定时器 TIM1 和 TIM8: 可以同时产生多达 7 路的 PW ...

  8. 基于STM32G431嵌入式学习笔记——七、定时器定时

    一.题目引入 上述为第13届蓝桥杯省赛节选内容,为了研究定时器的机理并独立书写计时函数,上述内容简化为以下要求: ①按下B4按键,LD1点亮5s后熄灭 ②按下B3按键,LD2以0.1秒为间隔切换亮灭状 ...

  9. 蓝桥杯STM32G431学习记录9——基本定时器CubeMX配置及使用

    定时器模块 定时器总体概述 定时器计数方式 复用引脚分配图(可通过此图查阅各个IO口的复用功能并进行配置) 基本定时器 基本定时器TIM6/7内部结构图 基本定时器CubeMX配置 basic_tim ...

最新文章

  1. Centos7下安装Docker1.8
  2. java如何解决高并发症,一整套Java线上故障排查技巧,爱了!
  3. ios逆向小试牛刀之操作手记
  4. Chrome DevTools — Network 1
  5. 一周时间摸清一个行业
  6. Serverless实战之路
  7. 计算机游戏设计专业世界大学排名,看过来,世界五大顶尖游戏设计大学在这里...
  8. 硅谷大佬们屡次推荐的10本书,你看过几本?
  9. (美国)数字设备公司 DEC
  10. “select count (1)”是什么意思?
  11. 使用Helm在k8s集群上部署以太坊私有链
  12. html封面设计图片手绘大全,封面设计铅笔画手绘图片
  13. ATFX:中国10月CPI增速2.1,USDCNH稳定在7.2附近
  14. 深度学习入门 | Self-attentionRNNLSTM
  15. 微众银行助力粤港澳大湾区首个跨境数据验证平台上线
  16. 随意细解:UI -- 初级数据持久化
  17. nc提示java过期_用友NC系统使用过程中常见问题和解决方法!财会必看!
  18. 又寂寞又美好-四月物语
  19. 第09期精品旅游网站
  20. 干货 | IP高防使用配置

热门文章

  1. printf花式输出图形
  2. Swoole的功能及简介
  3. fiddler-电脑端抓包
  4. 实现sohu社区′只看楼主′的功能,抓取连载帖子中楼主的所有帖子
  5. Docker模板【Nacos+MySQL+Redis+Kafka+Flink】
  6. 西游记中好色的猪八戒
  7. Win7 删除wifi热点
  8. ESP32学习笔记(51)——搭建环境、编译烧写(Windows+Espressif-IDE)
  9. 知识变现的三种主要方式
  10. 【OC】线性二次型(LQR)性能指标最优控制(3)