打印
[活动专区]

【AT-START-F425测评】AT32F425定时器点灯

[复制链接]
430|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51xlf|  楼主 | 2022-3-5 22:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, ar, AI, TI
这里利用定时器产生内部的时钟信号,不再使用延时的函数代码。用计数器判断时间差值,在main函数中做相应的操作。arduino里面常用的就是这种方法。

程序中的systick已经用作内部延时函数的代码了,所以这里使用定时器1作为内部计数器。
官网的例程给出一个定时器1产生1s周期的代码。这就修改一下定时器就行了
在at32f425_board.c定义一个初始化定时器1的代码,系统给出的是120Mhz的主频,用串口输出这个数据是96Mhz的,所以
这需要修改一下。
crm_clocks_freq_type crm_clocks_freq_struct = {0};
void at32_time1_init()
{
          /* get system clock */
  crm_clocks_freq_get(&crm_clocks_freq_struct);
        printf("crm_clocks_freq is %d \rn",crm_clocks_freq_struct.ahb_freq);
       
       
          /* enable tmr1 clock */
  crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
         /* tmr1 configuration */
  /* time base configuration */
  /* systemclock/96/1000 = 1khz */
  tmr_base_init(TMR1, 1000-1, (crm_clocks_freq_struct.ahb_freq / 1000000) - 1);
  tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
  /* overflow interrupt enable */
  tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);
  /* tmr1 overflow interrupt nvic init */
  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  nvic_irq_enable(TMR1_BRK_OVF_TRG_HALL_IRQn, 0, 0);

  /* enable tmr1 */
  tmr_counter_enable(TMR1, TRUE);
}
在main.c中定义一个计数的变量
uint32_t sys_cnt=0;// 系统内部计时变量

uint32_t now(void)
{
        return sys_cnt;       
}
还需要在定时器中断中驱动这个变量自增加

void TMR1_BRK_OVF_TRG_HALL_IRQHandler(void)
{
  if(tmr_flag_get(TMR1, TMR_OVF_FLAG) != RESET)
  {
    /* add user code... */
    sys_cnt++;
    tmr_flag_clear(TMR1, TMR_OVF_FLAG);
  }
}
剩下的就是在代码中实现led显示了
  if(now()-lst_t>1000)//每一秒钟执行一次
                {
                        lst_t=now();
                        at32_led_toggle(LED2);
                        at32_led_toggle(LED3);
                        at32_led_toggle(LED4);
                }
上电下载程序就能看到代码了,这里就不再上图演示了。
附上代码
AT32F425.rar (3.12 MB)

使用特权

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

本版积分规则

534

主题

9374

帖子

20

粉丝