jinglixixi 发表于 2022-12-17 20:02

【ATSAMD51EVK测评报告】+基于RTC的电子时钟

在厂家的例程中,提供了RTC的使用示例,但它还是有改进的地方,输出的速度太快且大部分数据无实际意义。经改进,才能输出如下的效果,见图1所示。图1 秒间隔时间显示 为了实现电子时钟的功能,在例程的基础上通过添加OLED屏,并进行适当的调整即可。由于OLED屏的驱动要用到us级的延时,因此在definitions.h文件中要添加#include"peripheral/systick/plib_systick.h"。在文件initialization.c中要添加语句SYSTICK_TimerInitialize(),修改后的内容如下:void SYS_Initialize ( void* data )
{
    NVMCTRL_Initialize( );
    STDIO_BufferModeSet();
    PORT_Initialize();
    CLOCK_Initialize();
    SERCOM2_USART_Initialize();
    RTC_Initialize();
    NVIC_Initialize();
    SYSTICK_TimerInitialize();
}

此外,还要添加文件plib_systick.c和plib_systick.h。 为了获得us级延时,需添加在us级的延时文件中相应的延时函数,其内容如下:void SYSTICK_Delayus ( uint32_t delay)
{
        uint32_t tickStart, delayTicks;
        if( (SysTick->CTRL & (SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk)) == (SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk))
        {
                tickStart=systick.tickCounter;
                delayTicks=delay/SYSTICK_INTERRUPT_PERIOD_IN_US;
          while((systick.tickCounter-tickStart)<delayTicks)
                {
                }
        }
}

此外,在文件plib_systick.h中也要添加void SYSTICK_Delayus ( uint32_t delay)。实现图2所示效果的主程序为:int main ( void )
{
    int p;
    SYS_Initialize ( NULL );
    struct tm sys_time;
    struct tm alarm_time;
    alarm_triggered = false;
    alarm_time.tm_hour = 12;
    alarm_time.tm_sec = 20;
    alarm_time.tm_min = 00;
    alarm_time.tm_mon = 11;
    alarm_time.tm_year = 122;
    alarm_time.tm_mday = 16;
    alarm_time.tm_wday = 5;
    PORT_REGS->GROUP.PORT_DIRSET = 1<<18;
    PORT_REGS->GROUP.PORT_DIRSET = 1<<20;
    PORT_REGS->GROUP.PORT_DIRSET = 1<<21;
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(20,0,"ATSAMD51 EVK",16);
    OLED_ShowString(20,2,"RTC test",16);
    OLED_ShowString(20,5,"jinglixixi",16);
    SYSTICK_DelayMs(800);
    RTC_RTCCCallbackRegister(RTC_Callback, (uintptr_t) NULL);
    RTC_RTCCTimeSet(&sys_time);
    RTC_RTCCAlarm0Set(&alarm_time, RTC_ALARM_MASK_HHMMSS);
    RTC_RTCCTimeGet(&sys_time);
    p=sys_time.tm_sec;
    OLED_ShowString(20,5,"::    ",16);
    while ( true )
    {
      RTC_RTCCTimeGet(&sys_time);
      if(p!=sys_time.tm_sec)
      {
            OLED_ShowNum(20,5,sys_time.tm_hour,2,16);
            OLED_ShowNum(44,5,sys_time.tm_min,2,16);
            OLED_ShowNum(68,5,sys_time.tm_sec,2,16);
            p=sys_time.tm_sec;
            if(p%2==0) PORT_REGS->GROUP.PORT_OUT |= 1<<18;
            else PORT_REGS->GROUP.PORT_OUT &= ~(1<<18);
      }
      if(alarm_triggered == true)
      {
            printf("\n\rAlarm Triggered !!!!!!!!\n\r");
            alarm_triggered = false;
      }
    }
    return ( EXIT_FAILURE );
}

图2计时效果
视频演示:https://www.bilibili.com/video/BV1984y1x7iu/?vd_source=f302fc0cc3a0425328db53a3b92082ca

1988020566 发表于 2022-12-22 20:22

屏幕的演示效果不错。            

mollylawrence 发表于 2022-12-24 20:10

ATSAMD51EVK板载资源针对很丰富。

zerorobert 发表于 2022-12-24 20:30

自带RTC的精度怎么样            

updownq 发表于 2022-12-24 21:19

怎么才能保障数据及时更新的情况下,又不会影响屏幕的操作?

jtracy3 发表于 2022-12-24 21:49

这个比DS1302强吗?            

jinglixixi 发表于 2022-12-25 10:27

jtracy3 发表于 2022-12-24 21:49
这个比DS1302强吗?

需要有精确仪器比较,应该差别不大。

jinglixixi 发表于 2022-12-25 10:28

updownq 发表于 2022-12-24 21:19
怎么才能保障数据及时更新的情况下,又不会影响屏幕的操作?

使用中断

jinglixixi 发表于 2022-12-25 10:29

zerorobert 发表于 2022-12-24 20:30
自带RTC的精度怎么样

日常使用没问题

plsbackup 发表于 2023-1-5 13:57

这个可以设置秒中断吗?            

earlmax 发表于 2023-1-9 09:43

ATSAMD51EVK的性能怎么样

10299823 发表于 2023-1-9 10:50

可以实现ms的应用吗?            

jinglixixi 发表于 2023-1-9 15:57

10299823 发表于 2023-1-9 10:50
可以实现ms的应用吗?

没问题

hudi008 发表于 2023-1-9 16:28

systick也有了吗?            

jinglixixi 发表于 2023-1-10 00:18

hudi008 发表于 2023-1-9 16:28
systick也有了吗?

usysm 发表于 2023-1-10 21:00

这个最大的中断时间是多少?            

xiaoyaodz 发表于 2023-1-12 14:54

这个芯片自带的RTC?            

jinglixixi 发表于 2023-1-12 16:36

xiaoyaodz 发表于 2023-1-12 14:54
这个芯片自带的RTC?

claretttt 发表于 2023-1-12 17:23

使用中断了吗?            

wangdezhi 发表于 2023-1-12 18:55

怎么利用RTC实现多个闹钟呢?            
页: [1] 2
查看完整版本: 【ATSAMD51EVK测评报告】+基于RTC的电子时钟