SYD8011关于ARM_M0部分的学习笔记(待整理版本)——硬件定时器(1)

官方SDK的下载地址:gittee下载地址
配套代码的地址为

SYD8811SDK-master\SYD8811SDK-master\Source Code\SYD8811_peripheral\timer

零、友情提醒

只是使用这种形式的定时器的最基本功能(也就是所谓的时基),或许会有亿点点需要知道的,但作为入坑玩家,只需要记住三点——使能、失能和回调函数。下面我会以timer0为例。

一、使能函数

该函数位于timer.c,可以直接使用官方的这个定时器库。

/*
定时器1 配置函数
参数: 
	uint32_t interval  定时器是递减计数器 interval就是计数器初值
	void *  p_callback 定时器中断的回调函数
	定时器时钟: 32.768KHz
*/
void timer_1_enable(uint32_t interval, void *  p_callback)
{
	if(TIMER_CTRL->TIMER_1_EN== 1)
	{
		TIMER_CTRL->TIMER_1_EN = 0; 
		delay_us(50);
	}
	
	TIMER_CTRL->TIMER_1_VAL= interval;
	TIMER_CTRL->TIMER_1_RGLR= 1;
	TIMER_CTRL->TIMER_1_INT_MASK = 0;
	timer_callback[1] = ((void (*)(void))p_callback);

	TIMER_CTRL->TIMER_1_INT_CLR = 1; 
	NVIC_EnableIRQ(TIMER1_IRQn);

	TIMER_CTRL->TIMER_1_EN = 1;
}

官方还是非常够意思的说的很明白了,第一个参数是装载初值,第二个就是回调函数

(1)已知我需要定时的时间,装载初值怎么算

晶振频率 * 需要定时的时间(秒)

假设我需要100ms中断一次,也就是32768 * 0.1 = 32768 / 10 即可。

(2)回调函数问题

我个人觉得这里其实是可以自定义的,没必要还跟STM32写一个回调函数得规规矩矩的。具体理由下文有提及

(3)使用示例

timer_1_enable(32768/2,  Timer_1_callback);//500ms

二、失能函数

/*
定时器1 失能函数  关闭定时器1的中断
*/
void timer_1_disable(void)
{
	TIMER_CTRL->TIMER_1_EN = 0;
	NVIC_DisableIRQ(TIMER1_IRQn);
	TIMER_CTRL->TIMER_1_INT_CLR = 1; 
}

失能没啥好说的,不需要就直接调用 timer_1_disable(void) 就好了。

三、回调函数

首先我们知道中断后是直接进行中断服务的。

定时器1 中断服务函数  这里调用了回调函数
*/
void TIMER1_IRQHandler(void)
{		 
	if(TIMER_CTRL->TIMER_1_INT_STATUS == 1)
	{
		TIMER_CTRL->TIMER_1_INT_CLR = 1; 

		if(timer_callback[1] != 0)
			(*timer_callback[1])();
	}  
}

所谓的回调函数其实就是因为在中断服务中通过指针指向进行了调用的。具体指向还得重新回头看一下使能里面有一行代码

timer_callback[1] = ((void (*)(void))p_callback);

这个就是我们调用使能函数的时候必须写入的参数最后就实现了在中断里执行如下的回调函数。

static void Timer_1_callback(void)
{
	GPIO_Pin_Turn(U32BIT(LED2));
	dbg_printf("Timer_1_callback\r\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值