对于FR3068似乎并没有像常规MCU那样提供RTC计时器,要实现电子时钟功能只能借助相应的定时器。

在例程中提供了一个多定时器定时功能的示例,其中time3的定时功能被定时为1秒钟,其测试结果如图1所示。

为此,要实现电子时钟的计时功能可借助它来实现。

image.png

图1 计时效果


对time3初始化函数为:

<pre>void timer_init(void)
  • {
  • __SYSTEM_TIMER3_CLK_ENABLE();
  • printf("timer23 clock:%d\r\n", system_get_peripheral_clock(PER_CLK_TIMER23));</pre><pre>NVIC_ClearPendingIRQ(TIMER3_IRQn);
  • NVIC_EnableIRQ(TIMER3_IRQn);
  • timer_init(Timer3, 24000/3*3000);
  • timer_int_enable(Timer3);
  • timer_start(Timer3);
  • while(1);
  • }
  • </pre>
  • 复制代码

    实现中断计时处理的函数为:

    <pre>void timer3_irq(void)
  • {
  • static uint8_t  hh=12,mm=30,ss=0;
  • timer_int_clear(Timer3);
  • printf("%d:%d:%d\r\n", hh,mm,ss);
  • if(ss>58)
  • {
  • ss=0;
  • if(mm>58)
  • {
  • mm=0;
  • hh=(hh+1)%24;
  • }
  • else
  • {
  • mm=mm+1;
  • }
  • }
  • else
  • {
  • ss=ss+1;
  • }
  • }</pre>
  • 复制代码


    实现电子时钟计时效果的主程序为:

    <pre>int main(void)
  • {
  • GPIO_InitTypeDef    GPIO_Handle;
  • pmu_init();   
  • system_clock_config();
  • GPIO_Handle.Pin       = GPIO_PIN_4|GPIO_PIN_5;
  • GPIO_Handle.Mode      = GPIO_MODE_AF_PP;
  • GPIO_Handle.Pull      = GPIO_PULLUP;
  • GPIO_Handle.Alternate = GPIO_FUNCTION_1;
  • gpio_init(GPIOB, &GPIO_Handle);
  • __SYSTEM_UART_CLK_SELECT_COREH(); </pre><pre>Uart3_handle.UARTx = UART3;
  • Uart3_handle.Init.BaudRate   = 115200;
  • Uart3_handle.Init.DataLength = UART_DATA_LENGTH_8BIT;
  • Uart3_handle.Init.StopBits   = UART_STOPBITS_1;
  • Uart3_handle.Init.Parity     = UART_PARITY_NONE;
  • Uart3_handle.Init.FIFO_Mode  = UART_FIFO_ENABLE;
  • uart_init(&Uart3_handle);
  • printf("SystemCoreClock:%d\r\n", system_get_CoreClock());
  • printf("SystemDSPClock:%d\r\n", system_get_DSPClock());
  • printf("System_CORE_HSCLK:%d\r\n", system_get_CORE_HSCLK());
  • printf("System_SPLLCLK:%d\r\n", system_get_SPLLCLK());
  • printf("System_AUPLLCLK:%d\r\n", system_get_AUPLLCLK());
  • timer_init();   
  • while(1);
  • }</pre>
  • 复制代码

    经程序的编译和下载,其测试效果如图2所示,说明设计功能正确。

    image.png

    图2 电子时钟效果