Kinetis单片机K64F开发笔记:PIT中断定时器
概述
一个单片机程序,从本质上讲,都可以归结为对GPIOh和定时器的操作,也就是说,单片机就是按照一定周期执行特定操作的器件,因此学习单片机,学会GPIO操作后,应该学习一种定时器。对于Kinetis器件,具有很多种定时器,包括FlexTimer Module (FTM),Periodic Interrupt Timer (PIT),Low-Power Timer (LPTMR)还有系统定时器等等,其中PIT最简单,所有先从这里下手。
官方例程
官方例程中,pit.c包含了PIT操作的主要步骤和函数。
void PIT_LED_HANDLER(void)
{
/* 清除中断标志位*/
PIT_ClearStatusFlags(PIT, kPIT_Chnl_0, kPIT_TimerFlag);
pitIsrFlag = true;
/* 添加DSB指令,防止重复进入中断*/
__DSB();
}
/*!
* @brief 主函数
*/
int main(void)
{
/* PIT配置 */
pit_config_t pitConfig;
/* Board pin, clock, debug console init */
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
/* Initialize and enable LED */
LED_INIT();
/*
* pitConfig.enableRunInDebug = false;
*/
PIT_GetDefaultConfig(&pitConfig);
/* pit模块初始化 */
PIT_Init(PIT, &pitConfig);
/* 设置通道0的周期 */
PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, USEC_TO_COUNT(1000000U, PIT_SOURCE_CLOCK));
/* 使能通道0中断 */
PIT_EnableInterrupts(PIT, kPIT_Chnl_0, kPIT_TimerInterruptEnable);
/* NVIC中使能中断 */
EnableIRQ(PIT_IRQ_ID);
/* 启动定时器 通道 0 */
PRINTF("\r\nStarting channel No.0 ...");
PIT_StartTimer(PIT, kPIT_Chnl_0);
while (true)
{
/* 中断时点亮LED指示灯 */
if (true == pitIsrFlag)
{
PRINTF("\r\n Channel No.0 interrupt is occurred !");
LED_TOGGLE();
pitIsrFlag = false;
}
}
}
详见注释。
使用配置工具操作PIT
打开MCUXpresso IDE的外设配置工具。(USB符号图标)
按照下图,在左侧勾选PIT选择框
在中间按照提示,选择PIT配置,这里设置中断时间间隔为1S,然后点击“更新源代码”,工程中会添加peripherals.h和peripherals.c两个配置文件。打开文件peripherals.c文件,发现pit的配置工作已经做好了。
const pit_config_t PIT_config = {
.enableRunInDebug = false
};
static void PIT_init(void) {
/* Initialize the PIT. */
PIT_Init(PIT_PERIPHERAL, &PIT_config);
/* Set channel 0 period to 1 s (60000000 ticks). */
PIT_SetTimerPeriod(PIT_PERIPHERAL, PIT_CHANNEL_0, PIT_CHANNEL_0_TICKS);
/* Enable interrupts from channel 0. */
PIT_EnableInterrupts(PIT_PERIPHERAL, PIT_CHANNEL_0, kPIT_TimerInterruptEnable);
/* Enable interrupt PIT_CHANNEL_0_IRQN request in the NVIC */
EnableIRQ(PIT_CHANNEL_0_IRQN);
/* Start channel 0. */
PIT_StartTimer(PIT_PERIPHERAL, PIT_CHANNEL_0);
}
但是中断处理函数没有生成,需要从这里获得
代码如下:
/* PIT0_IRQn interrupt handler */
void PIT_CHANNEL_0_IRQHANDLER(void) {
uint32_t intStatus;
/* Reading all interrupt flags of status register */
intStatus = PIT_GetStatusFlags(PIT_PERIPHERAL, PIT_CHANNEL_0);
PIT_ClearStatusFlags(PIT_PERIPHERAL, PIT_CHANNEL_0, intStatus);
/* Place your code here */
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
Store immediate overlapping exception return operation might vector to incorrect interrupt. */
#if defined __CORTEX_M && (__CORTEX_M == 4U)
__DSB();
#endif
}
好了,到此为止,我们一行代码也没敲,pit代码就准备好了。