LPC804开发(6.MRT使用)

1.前言

原本打算下午就能结束804开发的,结果翻手册的时候发现竟然还有一个mrt定时器,看了一下是16位的,比ctimer稍逊一点,但是基础的定时功能应该是满足的,这样也好ctimer就可以专门输出pwm波了,mrt就能空出4通道的定时器来用了。

2.初始化

整个程序比较简单,我来快速介绍一下。

程序如下

void init_mrt_ch0(unsigned int time)
{
	uint32_t mrtDividerValue = 0;

    /* Structure of initialize MRT */
    mrt_config_t mrtConfig;

    /* mrtConfig.enableMultiTask = false; */
    MRT_GetDefaultConfig(&mrtConfig);

    /* Init mrt module */
    MRT_Init(MRT0, &mrtConfig);

    /* Setup Channel 0 to be repeated */
    MRT_SetupChannelMode(MRT0, kMRT_Channel_0, kMRT_RepeatMode);

    /* Enable timer interrupts for channel 0 */
    MRT_EnableInterrupts(MRT0, kMRT_Channel_0, kMRT_TimerInterruptEnable);

    /* Enable at the NVIC */
    EnableIRQ(MRT0_IRQn);

    /* Start channel 0 */
    if (USEC_TO_COUNT(time, CLOCK_GetFreq(kCLOCK_CoreSysClk)) > MRT_CHANNEL_INTVAL_IVALUE_MASK)
    {
        mrtDividerValue = 0;
        while (USEC_TO_COUNT((time >> (++mrtDividerValue)), CLOCK_GetFreq(kCLOCK_CoreSysClk)) > MRT_CHANNEL_INTVAL_IVALUE_MASK)
        {
        }
        MRT_StartTimer(MRT0, kMRT_Channel_0, USEC_TO_COUNT((time >> mrtDividerValue), CLOCK_GetFreq(kCLOCK_CoreSysClk)));
    }
    else
    {
        MRT_StartTimer(MRT0, kMRT_Channel_0, USEC_TO_COUNT(time, CLOCK_GetFreq(kCLOCK_CoreSysClk)));
    }
}

首先申请一个结构体,一个分频系数。结构体是用来进行mrt的配置,分频系数是防止我们的重装值超过16位而再次进行分频的。

是获取默认配置,这里配置只有一个是多任务,用在rtos里面,默认不开启

将我们的配置投入到mrt中

设置通道模式

这里一个有三种模式,如下,常用的就是这个repeatmode

 之后是设置中断与开启NVIC,这些是arm,内核的设置,有兴趣大家可以看看内核的参考资料,这里就不多说了

 之后是设置重装值,如果位数超过16位就会再进行分频,程序如下

 这里注意一下,定时器的时间就是在这里设置的,如果我们要更改定时器时间就改我这里time的值,单位是us

 3.中断

代码如下,我这里开启了通道0和1的中断

void MRT0_IRQHandler(void)
{
	if(MRT_GetStatusFlags(MRT0,kMRT_Channel_0))
	{
		LEDTOL;
		MRT_ClearStatusFlags(MRT0, kMRT_Channel_0, kMRT_TimerInterruptFlag);
	}

	if(MRT_GetStatusFlags(MRT0,kMRT_Channel_1))
	{
		LEDTOL;
		MRT_ClearStatusFlags(MRT0, kMRT_Channel_1, kMRT_TimerInterruptFlag);
	}
}

首先是判断中断号

因为在芯片内部mrt四组通道只有这一个中断服务函数

所以每个通道触发中断后都会进到这个函数里,因此在多通道的定时器下面我们第一件事就是判断哪个通道会触发的中断,官方为我们提供了这个函数,原型如下

 第一个参数是mrt0,都一样;第二个参数是通道,当该通道触发中断时,这个函数就会返回1,否则是0,这样一来我们就能判断到了。

然后是清除中断,比较简单,我就不多介绍了,大家看一眼就能明白的。

4.测试

我在程序里设置的是5ms翻转一次gpio

可以看到整个周期10ms,半个周期就是5ms,没有问题

5.结语

相较于ctimer,mrt更加接近我们常用的定时器,就是略有区别,但不大,大家应该都能掌握。好了,大家有什么问题还是老样子评论区见,那么我们下一篇文章再见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值