GD32F30X单片机开发 --- 定时器中断

GD32F30X单片机开发 — 定时器中断

配置

开启定时器2(通用定时器),1s产生一次中断

1. 初始化

  1. 使能TIMER2时钟
  2. TIMER2去初始化
  3. 初始化TIMER相关结构体默认值参数(非必要)
  4. 设置:周期值,预分频系数,计数模式,对齐模式,采样分频
  5. 使能TIMER2
  6. 中断设置TIMER2_IRQn
  7. 使能更新中断

定时周期 = 系统主频 / 预分频系数 / 周期值 / 采样分频
例如:72MHz (72000000) / 7200 / 10000 / 1 = 1Hz = 1s

2. 定时器中断服务函数

  1. 判断中断标志是否置位
  2. 清除中断标志位

代码

void TIM_Init(void)
{
	rcu_periph_clock_enable(RCU_TIMER2);						/* 使能定时器2时钟 */

	timer_deinit(TIMER2);										/* 定时器2去初始化配置 */

	timer_parameter_struct timer_initpara;
	timer_struct_para_init(&timer_initpara);					/* 初始化TIMER相关结构体默认值参数 */
									      
	timer_initpara.period            = 10000;					/* 自动重装载寄存器周期的值(计数值) */
	/* 
		定时周期 = 系统主频  / 预分频系数 / 周期值 / 采样分频
		例如:72MHz (72000000) / 7200 / 10000 / 1 = 1Hz = 1s
	*/
	timer_initpara.alignedmode 	     = TIMER_COUNTER_EDGE;		/* 对齐模式 */
	timer_initpara.prescaler         = (7200 - 1);				/* 时钟预分频数 */
	timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;		/* 采样分频 */
	timer_initpara.counterdirection  = TIMER_COUNTER_UP;		/* 向上计数模式 */
	timer_init(TIMER2,&timer_initpara);

	timer_enable(TIMER2);										/* 使能定时器2 */

	nvic_irq_enable(TIMER2_IRQn, 1, 3);			    			/* TIMER中断设置,抢占优先级0,子优先级3 */
	timer_interrupt_enable(TIMER2,TIMER_INT_UP);				/* 使能更新中断 */ 
}

/* 定时器2中断服务函数 */
void TIMER2_IRQHandler(void)
{
	static INT16U cnt = 0;
    if(timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP)!=RESET)       
	{   
		timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);
		DEBUG("cnt value = %u\n", cnt++);
    }
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值