4008|0

821

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【GD32L233C-START评测】七、TIMER [复制链接]

        使用TIMER2定时器产生1ms计时中断驱动板载LED4闪烁,同时也驱动PA6引脚产生同样的中断并利用逻辑分析仪采样验证。

一、实验资源
1、GD32L233C-START;
2、Keil V5.36.0.0;
3、逻辑分析仪 + Logic 2.3.45

 

二、知识准备

        GD32L233C的定时器资源分为通用L0级(TIMER1、TIMER2);通用L1级(TIMER8、TIMER11);基本级(TIMER5、TIMER6),均为16位计数器。其中通用L0级的两个定时器功能较多,基本级的两个定时器功能较少,可根据具体应用进行选择。

本次实验使用了通用L0级的TIMER2定时器,虽说是通用级的定时器但功能还是非常强大的,对于多数的应用完全没有问题。

对于定时器的使用绕不开计数时钟,实验中TIMER2的计数时钟选用内部时钟源“CK_TIMER”,下面来看看“CK_TIMER”的来源:

        从上面的时钟树可以看出,“CK_TIMER”来自可选的三个时钟内部16MHz、内部16MHz及外部4~32MHz时钟经“CK_PLL”处理后生成“CK_SYS”系统时钟,再经“AHB”分频后可生成高达64MHz的“CK_AHB”,这个时钟被系统分配至各个片上外设。这其中亦包括了经“TIMER”预分频后的"CK_TIMER"。

 

三、实验内容

1、硬件连接

        TIMER2的中断用以改变GPIO引脚电平变化,实验中选用了PA6、PA7。其中PA6用于连接逻辑分析仪;PA7则是用于驱动板载的LED1,用于观察工作状态。另外,PA6、PA7还是TIMER2的两个输出通道(TIMER2_CH0、TIMER2_CH1),这样也便于在此基础上进行相关实验。

2、程序实现

主要目的就是利用TIMER2对“CK_TIMER”时钟进行计数,产生1ms中断。

void TIMER_Config(void)
{
	GPIO_Config();
	
	timer_oc_parameter_struct timer_ocintpara;
	timer_parameter_struct timer_initpara;

	rcu_periph_clock_enable(RCU_TIMER2);
	timer_deinit(TIMER2);

	/*
		定时器时钟计数频率 = 64MHz/(prescaler+1) = 64MHz/(63+1)=1MHz
		定时时间 = 定时器时钟计数频率/(period+1) = 1HMz/(999+1) = 1KHz = 0.001s = 1ms
	*/
	timer_struct_para_init(&timer_initpara);
	timer_initpara.prescaler         = 63;								//时钟预分频系数
	timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;//边缘对齐
	timer_initpara.counterdirection  = TIMER_COUNTER_UP;	//向上计数
	timer_initpara.period            = 999;								//重载计数值
	timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;  
	timer_init(TIMER2, &timer_initpara);

	timer_auto_reload_shadow_enable(TIMER2);//使能TIMER2重装载
	timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);//清除TIMER2向上计数中断标志位
	timer_interrupt_enable(TIMER2, TIMER_INT_UP);//使能TIMER2向上计数中断
	nvic_irq_enable(TIMER2_IRQn, 0);//配置TIMER2中断
	timer_enable(TIMER2);//使能TIMER2
}

         程序中对计数时钟进行64分频后实际的计数时钟即为 :定时器时钟计数频率 = 64MHz/(prescaler+1) = 64MHz/(63+1)=1MHz;重载计数器被配置为“999”,定时时间 = 定时器时钟计数频率/(period+1) = 1HMz/(999+1) = 1KHz = 0.001s = 1ms。

TIMER2中断程序中把LED翻转时间调整为100ms便于观察LED1的工作状态:

void TIMER2_IRQHandler(void)
{
	static uint8_t num=0;
	
	if(SET == timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP)) 
	{
		timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);//清除向上计数中断标志位
		num++;
		if(num==100)
		{
			num=0;
			gpio_bit_toggle(LED1_PORT, LED1_PIN);//工作指示
			gpio_bit_toggle(GPIOA, GPIO_PIN_6);//逻辑分析仪测试探针
		}
	}
}

3、实验结果

四、附件

TIMER.rar (603.71 KB, 下载次数: 12)

此帖出自GD32 MCU论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表