历时四天终于成功搞定rtc实时时钟在stm32显示屏上显示。
首先:
1:初始化rtc
RTC_HandleTypeDef RTC_Handler; //rtc句柄 要初始化的句柄,包含外设名字和设置rtc的寄存器的结构体函数等等
{
if(HAL_RTC_Init(&RTC_Handler)!=HAL_OK) return 1;
//********************HAL自带的初始化库函数,进去可以看到主要就是确定一些rtc-handlertypedef结构体成员的一些参数的范围:比如assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance));......成功初始化就返回一***************************//
if(HAL_RTCEx_BKUPRead(&rtc_handletypedef,RTC_BKP_DR1)!=0x5050)
{
RTC_Set(2015,3,24,4,12,10);
HAL_RTCEx_BKUPWrite(&rtc_handletypedef,RTC_BKP_DR1,0x5050);
}
//****************RTC是一个独立的定时器
//当程序下载进去时,如果先前没有系统复位过,那么此时备份区域(BKP)有0x5050,因为上一次复位之后再下载程序写入了0x5050 错
BKP 当系统在待机模式下被唤醒,或系统复位或 电源复位时,他们也不会被复位。
也即是说第一次下载程序后在设置时间必须得在这个if语句外调用
**********************************************//
__HAL_RTC_ALARM_ENABLE_IT(&rtc_handletypedef,RTC_IT_ALRA); //闹钟的中断使能
__HAL_RTC_ALARM_ENABLE_IT(&rtc_handletypedef,RTC_IT_SEC); //秒钟的中断使能
HAL_NVIC_SetPriority(RTC_IRQn,0x01,0x02); //抢占优先级1,子优先级2
HAL_NVIC_EnableIRQ(RTC_IRQn);//
}
注意,设置函数的入口参数要注意数据类型;
位数多的十六进制变量向位数低的16进制变量转换时要注意两个变量要一样类型,避免转换错误;
结构体里的数据的调用时也要注意他的数据类型
调试部分:
stlink调试时可以查看寄存器值和设置断点到你想要运行的那一步(不说了,说多了都是泪)。
总结:遇到的问题一定要写下来,记下来