使用定时器实现RTC,在LCD屏幕上显示。
一、定时器
CW32F030x6/x8 微控制器内部集成多达四个通用定时器、三个基本定时器和一个高级控制定时器。
各个不同定时器的功能差异如下表所示:
这个测试使用基本定时器1实现。
二、代码部分
2.1、tim.c
#include "main.h"
#include "led.h"
uint8_t rtc_temp[10]={'0','0','.','0','0','.','0','0',' '};
uint8_t lcd_disp_flag=0;
uint8_t hour=0;
uint8_t min=0;
uint8_t sec=0;
uint16_t tim_cnt1=0;
void init_btim(void)
{
BTIM_TimeBaseInitTypeDef BTIM_InitStruct;
__RCC_BTIM_CLK_ENABLE();
__disable_irq();
NVIC_EnableIRQ(BTIM1_IRQn);
__enable_irq();
BTIM_InitStruct.BTIM_Mode = BTIM_Mode_TIMER;
BTIM_InitStruct.BTIM_OPMode = BTIM_OPMode_Repetitive;
BTIM_InitStruct.BTIM_Period = 8000;
BTIM_InitStruct.BTIM_Prescaler = BTIM_PRS_DIV8;
BTIM_TimeBaseInit(CW_BTIM1, &BTIM_InitStruct);
BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE);
BTIM_Cmd(CW_BTIM1, ENABLE);
}
void BTIM1_IRQHandler(void)
{
if(BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
{
BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);
tim_cnt1++;
if(tim_cnt1>99)
{
tim_cnt1=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)
{
hour=0;
}
}
}
rtc_temp[0]=(hour/10)+0x30;
rtc_temp[1]=(hour%10)+0x30;
rtc_temp[3]=(min/10)+0x30;
rtc_temp[4]=(min%10)+0x30;
rtc_temp[6]=(sec/10)+0x30;
rtc_temp[7]=(sec%10)+0x30;
led2_tog();
lcd_disp_flag=1;
}
}
}
2.2、main.c
int32_t main(void)
{
rcc_config();
delay_init();
uart_init(115200);
init_led();
init_adc();
init_btim();
Lcd_Init();
Lcd_Clear(GRAY0);
Gui_DrawFont_GBK16(0,5,BLACK,GRAY0,"HELLO CW32F030");
Gui_DrawLine(21, 50,100, 50,GRAY0);
Gui_DrawFont_GBK16(0,22,RED,GRAY0,"TEST TIM RTC");
Gui_DrawFont_GBK16(0,39,RED,GRAY0,rtc_temp);
printf("\r\nCW32F030 tim test\r\n");
while (1)
{
if(lcd_disp_flag==1)
{
lcd_disp_flag=0;
Gui_DrawFont_GBK16(0,39,RED,GRAY0,rtc_temp);
}
}
}
三、程序运行