对于FR3068似乎并没有像常规MCU那样提供RTC计时器,要实现电子时钟功能只能借助相应的定时器。
在例程中提供了一个多定时器定时功能的示例,其中time3的定时功能被定时为1秒钟,其测试结果如图1所示。
为此,要实现电子时钟的计时功能可借助它来实现。
图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所示,说明设计功能正确。
图2 电子时钟效果