主要用到oled显示时间,用的是最小系统版本,主要是时间不跟新,但LSI和RTC初始化模式都进去了,用的是F4的程序,对了一编,只改了分频,其他RCC,RTC寄存器都没区别没去动 程序: uint8_t RTC_init(void) { //TIME_DATE_TYPEDEF dateAndTime ={16,10,14,5,9,8,55,0}; RCC->APB1ENR |= 1<<28; //使能电源接口时钟 PWR->CR |= 1<<8; //后备区域访问使能(RTC+SRAM) DBP置1 RCC->CSR|= 1<<0; //LSI 开启 while ( (RCC->CSR & (0x01<<1)) == 0 ) { ;//等待LSI就绪 } RCC->BDCR &= ~(3<<8); RCC->BDCR |= 2<<8; //选择LSI,作为RTC的时钟 RCC->BDCR |= 1<<15; //使能RTC时钟 //关闭RTC寄存器写保护 RTC->WPR = 0xCA; RTC->WPR = 0x53; if (RTC_initMode()) { return 1;//进入RTC初始化模式 } RTC->PRER|=0x63; //RTC异步分频系数(1~0X7F) RTC->PRER=0x18F; //RTC同步分频系数(0~7FFF),必须先设置同步分频,再设置异步分频 RTC->CR &= ~(1<<6); //RTC设置为,24小时格式 RTC->ISR &= ~(1<<7); //退出RTC初始化模式 RTC->WPR = 0xFF; //写入错误值,激活RTC寄存器写保护 RTC_setDate(18,6,20,3); //设置年月日星期 RTC_setTime(15,44,40,0);//设置时分秒上午下午 RTC_Write_BKR(0,0X5050); //标记已经初始化过了 return 0; } uint8_t RTC_setTime(uint8_t hour,uint8_t min,uint8_t sec,uint8_t ampm) { uint32_t temp=0; //关闭RTC寄存器写保护 RTC->WPR=0xCA; RTC->WPR=0x53; if(RTC_initMode())return 1;//进入RTC初始化模式失败 temp=(((uint32_t)ampm&0X01)<<22) |((uint32_t)RTC_DEC2BCD(hour)<<16) |((uint32_t)RTC_DEC2BCD(min)<<8) |(RTC_DEC2BCD(sec)); RTC->TR=temp; RTC->ISR&=~(1<<7); //退出RTC初始化模式 return 0; } void display_time(void) //时间日历 { sprintf((char*)tbuf,"Time:%02d:%02d:%02d ",time_date.hour,time_date.min,time_date.sec); OLED_showString(0,1,tbuf,10,0); sprintf((char*)tbuf,"Date:20%02d-%02d-%02d",time_date.year,time_date.month,time_date.date); OLED_showString(0,3,tbuf,10,0); sprintf((char*)tbuf,"Week:%d",time_date.week); OLED_showString(0,5,tbuf,10,0); sprintf( (char*)tbuf,"T:%.2f",f_temp); OLED_showString(0,7,tbuf,10,1); } int main { RTC_initMode(); while() { display_time(); } } uint8_t RTC_Wait_Synchro(void) { uint32_t retry=0XFFFFF; //关闭RTC寄存器写保护 RTC->WPR=0xCA; RTC->WPR=0x53; RTC->ISR&=~(1<<5); //清除RSF位 while(retry&&((RTC->ISR&(1<<5))==0x00))//等待影子寄存器同步 { retry--; } if(retry==0)return 1; //同步失败 RTC->WPR=0xFF; //使能RTC寄存器写保护 return 0; } 大致函数就这样,但显示的都是0,是不是使用F4的程序少了什么操作,求大神帮忙 |
没见你定义过,只看到使用了。这些变量在哪里更新的?在主程序中只有一个显示程序,如果是中断中更新的变量,那么你的中断程序呢,中断初始化呢?
评分
查看全部评分
我是F030,而且用的也是LSI内部晶振,不是外部的,和电容没关系吧
我后面看了下,之前那个F4好像是中断WakeUp唤醒,换成F0的,中断不一样要重新修改
{
//关闭RTC寄存器写保护
RTC->WPR=0xCA;
RTC->WPR=0x53;
RTC->CR&=~(1<<10); //关闭WAKE UP
while((RTC->ISR&0X04)==0); //等待WAKE UP修改允许
RTC->CR&=~(7<<0); //清除原来的设置
RTC->CR|=wksel&0X07; //设置新的值
RTC->WUTR=cnt; //设置WAKE UP自动重装载寄存器值
RTC->ISR&=~(1<<10); //清除RTC WAKE UP的标志
RTC->CR|=1<<14; //开启WAKE UP 定时器中断
RTC->CR|=1<<10; //开启WAKE UP 定时器
RTC->WPR=0XFF; //禁止修改RTC寄存器
EXTI->PR=1<<22; //清除LINE22上的中断标志位
EXTI->IMR|=1<<22; //开启line22上的中断
EXTI->RTSR|=1<<22; //line22上事件上升降沿触发
NVIC_SetPriority(RTC_WKUP_IRQn,NVIC_EncodePriority(7-2,2,3)); //设置优先级
NVIC_EnableIRQ(RTC_WKUP_IRQn); //外部中断使能(系统中断没有这个使能)
}
//RTC WAKE UP中断服务函数
void RTC_WKUP_IRQHandler(void)
{
EXTI->PR|=1<<22; //清除中断线22的中断标志
if(RTC->ISR&(1<<10))//WK_UP中断?
{
RTC->ISR&=~(1<<10); //清除中断标志
RTC_Get_Time(&time_date);
RTC_Get_Date(&time_date);
}
}
现在要修改的地方是这2出,F0的RTC中断变成RTC_IRQn,只有这个
RTC ->CR &=~(0X01<<8); //Alarm A 禁用
while((RTC->ISR&0X04)==0); //等待alarm允许修改
RTC->CR&=~(7<<0); //清除原来的设置
RTC->CR|=4&0X07; //设置新的值
RTC->ALRMAR =0;
RTC->ISR&=~(1<<8); //清除RTC alarm的标志
RTC->CR|=1<<12; //开启alarm 定时器中断
RTC ->CR|=0X01<<8; //开启alarm 定时器
RTC->WPR=0XFF; //禁止修改RTC寄存器
EXTI->PR=1<<17; //清除LINE22上的中断标志位
EXTI->IMR|=1<<17; //开启line22上的中断
EXTI->RTSR|=1<<17; //line22上事件上升降沿触发
NVIC_SetPriority(RTC_IRQn ,0); //设置优先级
NVIC_EnableIRQ(RTC_IRQn); //外部中断使能(系统中断没有这个使能)