打印
[AT32L021]

【AT-START-L021测评】04+使用AT32 Work Bench调试TIME6

[复制链接]
302|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 聪聪哥哥 于 2024-12-31 19:04 编辑

今天和大家分享一下AT公司的AT32 work bench图形化配置工具,生成定时器的底层驱动
一:定时器知识分享:
AT32L021系列产品包含最多1个高级定时器、5个通用定时器和1个基本定时器、以及1个系统滴答定时器。
下表比较了高级定时器、通用定时器和基本定时器的功能:


高级定时器1:
一个高级定时器(TMR1)可以被看成是分配到6个通道的三相PWM发生器,具有带可编程死区插入的互补PWM输出,还可以被当成完整的通用定时器。四个独立的通道可以用于:
输入捕获
输出比较
产生PWM(边缘或中心对齐模式)
单周期输出
配置为16位通用定时器时,它与TMRx定时器具有相同的功能。配置为16位PWM发生器时,它具有全调制能力(0~100%)。
在调试模式下,计数器可以被冻结,同时PWM输出被禁止,从而切断由这些输出所控制的开关。高级定时器很多功能都与通用的定时器相同,内部结构也相同,因此高级定时器可以通过定时器链接功能与通用定时器协同操作,提供同步或事件链接功能。
通用定时器(TMR3,TMR14,TMR15,TMR16,和TMR17)
AT32L021系列产品中,内置了多达5个可同步运行的通用定时器。
TMR3TMR3是基于一个16位自动加载递增/递减计数器和一个16位的预分频器。这个定时器在最大的封装可提供4个独立的通道,每个通道都可用于输入捕获、输出比较、PWM和单周期模式输出。
TMR3还能通过定时器链接功能与高级定时器共同工作,提供同步或事件链接功能。在调试模式下,计数器可以被冻结。TMR3能用于产生PWM输出。TMR3有独立的DMA请求机制。TMR3还能够处理增量编码器的信号,也能处理1至3个霍尔传感器的数字输出。
TMR14
该定时器基于一个16位的自动加载递增计数器、一个16位的预分频器和1个独立的通道,每个通道都可用于输入捕获、输出比较、PWM和单周期模式输出,可以与全功能通用定时器同步,也可以用作简单的定时器。在调试模式下,计数器可以被冻结,
TMR15,TMR16,和TMR17
这三个通用定时器具有16位自动加载递增计数器和16位预分频器。TMR15具有2个通道和1个互补通道,TMR16和TMR17具有1个通道和1个互补通道。所有通道都可用于输入捕获/输出比较,PWM或单周期模式输出。
这些定时器可通过定时器链接功能协同工作,提供同步或事件链接功能。
在调试模式下,计数器可以被冻结。这些定时器有独立的DMA请求生成机制。
基本定时器(TMR6)
这个定时器是当成通用的16位时基计数器。
二:图形化配置软件的学习
用户自行去官方下载即可,发现中文的图形化配置工具还是蛮好用的,相比友商的图形化配置工具,工具里面的注释也是比较详细的,注释里面会有比较详细的介绍,告知用户需要增加的底层,不过下次软件在升级的话,可以增加定时器是否输出功能按键;
2.1 查看一下,软件的系统时钟配置

这里我所使用的是系统默认的时钟,由于只是简单的定时器6的学习和了解,这里并未作改动,
2.2定时器6的配置如下所示:

如上图所示,可以清晰的看到定时器6在配置完成后的触发频率,很直观,而且会有代码预览功能,
这里我们将生成的代码移植到,OLED显示代码中如下所示:
void wk_tmr6_init(void)
{
  /* add user code begin tmr6_init 0 */
  /* enable tmr1 clock */
  crm_periph_clock_enable(CRM_TMR6_PERIPH_CLOCK, TRUE);
  /* add user code end tmr6_init 0 */

  /* add user code begin tmr6_init 1 */

  /* add user code end tmr6_init 1 */
  /* configure counter settings */
  tmr_base_init(TMR6, 9999, 799);
  tmr_cnt_dir_set(TMR6, TMR_COUNT_UP);
  tmr_period_buffer_enable(TMR6, FALSE);
  /* configure primary mode settings */
  tmr_primary_mode_select(TMR6, TMR_PRIMARY_SEL_RESET);
  tmr_counter_enable(TMR6, TRUE);
  /**
   * Users need to configure TMR6 interrupt functions according to the actual application.
   * 1. Call the below function to enable the corresponding TMR6 interrupt.
   *     --tmr_interrupt_enable(...)
   * 2. Add the user's interrupt handler code into the below function in the at32l021_int.c file.
   *     --void TMR6_GLOBAL_IRQHandler(void)
   */
  /* add user code begin tmr6_init 2 */
  /* overflow interrupt enable */
  tmr_interrupt_enable(TMR6, TMR_OVF_INT, TRUE);
  /* tmr1 overflow interrupt nvic init */
  nvic_irq_enable(TMR6_GLOBAL_IRQn, 0, 0);
  /* add user code end tmr6_init 2 */
}
可以看到生成的代码区,有详细的注释,用户需要自行的添加部分代码
定时器6的中断函数如下所示:
void TMR6_GLOBAL_IRQHandler(void)
{
  if(tmr_interrupt_flag_get(TMR6, TMR_OVF_FLAG) != RESET)
  {
    /* add user code... */
    at32_led_toggle(LED3);
    tmr_flag_clear(TMR6, TMR_OVF_FLAG);
  }
}
实物测试图片如下:LED灯的闪烁频率为100MS 一次。

用户体验:由于自己平时在工作的过程中,使用某厂商的32位比较多,也是经常使用的其配置函数,和AT公司对比发现,AT32的优点是:软件自动配置调试口,这点比手动开启,起码用户不会忘记,再者就是代码预览功能和定时器配置后,中断更新的频率,给初学者带来很大的便利,再者就是生产底层驱动代码里面的注释,对用户来说也是很方便,可以告知用户如何添加代码。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

112

帖子

0

粉丝