S32K144(9)LPIT

目录

1、简介

2、原理图

3、寄存器

3.1、VERID:Version ID Register

3.2、Parameter Register

3.3、MCR:Module Control Register

3.4、MSR:Module Status Register

3.5、MIER:Module Interrupt Enable Register

3.6、SETTEN:Set Timer Enable Register

3.7、CLRTEN:Clear Timer Enable Register

3.8、TVAL0 - TVAL3:Timer Value Register

3.9、CVAL0 - CVAL3:Current Timer Value

3.10、TCTRL0 - TCTRL3:Timer Control Register

 4、代码编程

4.1、lpit.h

4.2、lpit.c

4.3、main.c

4.4、附不使用中断的调用方法


1、简介

开发板S32K144+S32DS+JLINK,裸机版的程序编写

  • LPIT通道是32位的计数器
  • 一个LPIT模块带有四个通道,不支持低功耗和等待模式,当功能时钟被禁用时访问LPIT可能会产生错误
  • LPIT可以用作ADC触发源
  • LPIT是一个具有多个计数器通道的低功率周期性中断计数器
  • CPU接口提供时钟、复位、寄存器读写总线接口处理来自LPIT的中断
  • 每个计数器都可以配置为比较模式和捕获模式
  • 寄存器大端模式

2、原理图

3、寄存器

3.1、VERID:Version ID Register

版本寄存器

3.2、Parameter Register

参数寄存器:

Field

Name

Description

0-7

CHANNEL

定时器通道数

8-15

EXT_TRIG

外部触发输入数

3.3、MCR:Module Control Register

Field

Name

Description

0

M_CEN

时钟模块使能,将外部时钟设置为模块定时器

1

SW_RST

软件复位

2

DOZE_EN

睡眠模式继续运行定时器

3

DBG_EN

调试模式继续运行定时器

3.4、MSR:Module Status Register

Field

Name

Description

0-3

TIFn

定时器通道n中断标志

3.5、MIER:Module Interrupt Enable Register

Field

Name

Description

0-3

TIEn

定时器通道n中断使能

3.6、SETTEN:Set Timer Enable Register

Field

Name

Description

0-3

SET_T_EN_n

设置定时器通道n使能

3.7、CLRTEN:Clear Timer Enable Register

Field

Name

Description

0-3

CLR_T_EN_n

设置定时器通道n禁止启用

3.8、TVAL0 - TVAL3:Timer Value Register

0-31

TMR_VAL

在比较模式下:

TMR_VAL是定时器通道的起始值,定时器会一直倒数直到为0,定时器会产生一个中断,并再次加载计数器值到寄存器中。

中止当前的计数器周期,并开启一个新的计数器周期,计时器通道必须重新禁用和使用

在捕获模式下:加载值

3.9、CVAL0 - CVAL3:Current Timer Value

Field

Name

Description

0-31

TMR_CUR_VAL

当前定时器的值

3.10、TCTRL0 - TCTRL3:Timer Control Register

Field

Name

Description

0

T_EN

定时器使能

1

CHAIN

通道链接使能

2-3

MODE

定时器操作模式

16

TSOT

定时器触发期待,控制计数器何时开始递减

17

TSOI

中断时定时器停止,控制通道计数器在超时后是否停止

18

TROT

触发时重新加载计数器

23

TRG_SRC

选择内部或外部触发源

24-27

TRG_SET

触发选择,选择用于启动或者重新加载LPIT计数器

 4、代码编程

跟定时器相关的最千篇一律了

其中SPLLDIV2_CLOCK定义为:

 #define SPLLDIV2_CLOCK            (((SCG->SPLLDIV & SCG_SPLLDIV_SPLLDIV2_MASK)!=0) ? (CPU_SPLL_CLOCK/(1<<(((SCG->SPLLDIV & SCG_SPLLDIV_SPLLDIV2_MASK)>>SCG_SPLLDIV_SPLLDIV2_SHIFT)-1))) : 0)    //由SCG_SPLLDIV[SPLLDIV2]确定

4.1、lpit.h


#ifndef LPIT_H_
#define LPIT_H_

#include "S32K144.h"
#include "common.h"

void lpit_ch_init(uint_8 Lpit_CHn,uint32_t init_ms);


#endif /* CLOCKS_AND_MODES_H_ */

4.2、lpit.c

#include "lptmr.h"
#include "led.h"
#include "common.h"
void lpit_ch_init(uint_8 Lpit_CHn,uint32_t init_ms)
{
	PCC->PCCn[PCC_LPIT_INDEX] |= PCC_PCCn_PCS(6) | PCC_PCCn_CGC_MASK;	/* Enable LPIT Clock 		*/

    LPIT0->MCR = LPIT_MCR_M_CEN(1);		// DBG_EN-0: 当设备进入调试模式停止计时器
    									// DOZE_EN=0: 当设备进入睡眠模式停止计时器
    									// SW_RST=0: 计时器通道和寄存器未重置
    									// M_CEN=1: 启用外围时钟定时器
    //这里我犯了一个小错误,因为我一开始只使用了一个通道,所以直接赋值,当初始化多个通道时,就将之前的通道使能清空来
    //LPIT0->MIER = 1 << Lpit_CHn;   
    LPIT0->MIER |= 1 << Lpit_CHn;   // TIE0=1: 定时器LPIT 通道启动中断
    LPIT0->TMR[Lpit_CHn].TVAL = (init_ms/1000.0)*SPLLDIV2_CLOCK;
    LPIT0->TMR[Lpit_CHn].TCTRL = LPIT_TMR_TCTRL_T_EN(1);

    S32_NVIC_EnableIRQ(LPIT0_Ch0_IRQn+Lpit_CHn,10);
}

void LPIT0_Ch0_IRQHandler(void)
{
    if(LPIT0->MSR & LPIT_MSR_TIF0_MASK)
    {
    	//清中断标志位
    	LPIT0->MSR |= LPIT_MSR_TIF0_MASK;
    	LED2_TOGGLE;
    }
}

void LPIT0_Ch1_IRQHandler(void)
{
    if(LPIT0->MSR & LPIT_MSR_TIF1_MASK)
    {
    	//清中断标志位
    	LPIT0->MSR |= LPIT_MSR_TIF1_MASK;
    	LED3_TOGGLE;
    }
}

4.3、main.c


#include "S32K144.h"
#include "led.h"
#include "key.h"
#include "uart.h"
#include "clocks.h"
#include "lptmr.h"
#include "lpit.h"

int main(void)
{
	unsigned long i;
	WDOG_disable();        /* Disable WDOG */
	SOSC_init_8MHz();      /* Initialize system oscilator for 8 MHz xtal */
	SPLL_init_160MHz();    /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
	NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk & core, 40 MHz bus, 20 MHz flash */
	bsp_led_init();
	bsp_key_init();

	uart_init(UART_Debug,19200);
    uart_enable_re_int(UART_Debug);

    lptmr_init(1000);

    lpit_ch_init(1,1000);
    lpit_ch_init(0,1000);

	uart_send_string(UART_Debug,"Running LPUART example\r\n");     /* Transmit char string */
	u1_printf("u1_printf Running LPUART example\r\n");     /* Transmit char string */
	while(1){
		for(i = 10000000;i>0;i--);
		LED4_ON;
		for(i = 10000000;i>0;i--);
		LED_OFF;
		uart_send_string(UART_Debug,"The LED light is flashing\r\n");     /* Transmit char string */
	}
    return 0;
}

4.4、附不使用中断的调用方法

while(1){
    while((LPIT0->MSR & LPIT_MSR_TIF0_MASK) == 0){}
    LPIT0->MSR |= LPIT_MSR_TIF0_MASK;
    LED2_TOGGLE;
}

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
S32K144是一款基于ARM Cortex-M4内核的微控制器,可以使用C语言进行编程。在S32K144中,可以使用LPIT(Low Power Periodic Interrupt Timer)模块进行定时器计数和中断处理。下面是一个简单的示例,演示如何在S32K144中使用LPIT模块实现中断处理: ```c #include "S32K144.h" void LPIT0_Ch0_IRQHandler(void) { // 处理定时器中断 LPIT0->MSR |= LPIT_MSR_TIF0_MASK; // 清除中断标志位 // TODO: 执行中断处理函数 } void LPIT_Init(void) { // 使能LPIT模块时钟 PCC->PCCn[PCC_LPIT0_INDEX] |= PCC_PCCn_CGC_MASK; // 初始化LPIT模块 LPIT0->MCR |= LPIT_MCR_M_CEN_MASK; // 使能LPIT模块时钟 LPIT0->MCR |= LPIT_MCR_SW_RST_MASK; // 复位LPIT模块 // 配置定时器0 LPIT0->TMR[0].TVAL = 10000; // 设置定时器周期为10ms LPIT0->TMR[0].TCTRL |= LPIT_TMR_TCTRL_T_EN_MASK; // 使能定时器 LPIT0->MIER |= LPIT_MIER_TIE0_MASK; // 使能定时器中断 // 注册定时器中断处理函数 NVIC_EnableIRQ(LPIT0_Ch0_IRQn); NVIC_SetPriority(LPIT0_Ch0_IRQn, 2); } int main() { // 初始化LPIT模块 LPIT_Init(); // 等待定时器中断 while(1); return 0; } ``` 该程序使用LPIT模块实现了一个定时器中断处理,并在中断处理函数中清除中断标志位和执行相应的处理操作。程序中首先使用PCC使能LPIT模块时钟,并初始化LPIT模块和定时器0。在LPIT_Init函数中,将定时器周期设置为10ms,并使能定时器和定时器中断。同时,使用NVIC_EnableIRQ函数注册中断处理函数,并设置中断优先级。 需要注意的是,LPIT模块的使用需要根据具体的业务需求进行设计和优化。同时,需要注意中断处理函数的实现和优化,以确保代码的质量和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值