你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求大神帮忙,stm32f030c8t6的RTC选择LSI,但OLED屏幕一直在0不动

[复制链接]
p13692166934 提问时间:2018-9-11 11:30 /
悬赏3ST金币已解决
主要用到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的程序少了什么操作,求大神帮忙

最佳答案

查看完整内容

我想问你这堆变量从哪来的?time_date.hour,time_date.min,time_date.sec 没见你定义过,只看到使用了。这些变量在哪里更新的?在主程序中只有一个显示程序,如果是中断中更新的变量,那么你的中断程序呢,中断初始化呢?
收藏 评论9 发布时间:2018-9-11 11:30

举报

9个回答
七哥 回答时间:2018-9-11 11:30:18
我想问你这堆变量从哪来的?time_date.hour,time_date.min,time_date.sec
没见你定义过,只看到使用了。这些变量在哪里更新的?在主程序中只有一个显示程序,如果是中断中更新的变量,那么你的中断程序呢,中断初始化呢?
wudianjun2001 回答时间:2018-9-11 12:25:37
我们用103会偶尔遇到外部32K晶振不起震的情况,二三十块板有一块的概率,而且也不是每次都不起震,遇到不起震的就换晶振,匹配电容

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

p13692166934 回答时间:2018-9-11 13:11:10
wudianjun2001 发表于 2018-9-11 12:25
我们用103会偶尔遇到外部32K晶振不起震的情况,二三十块板有一块的概率,而且也不是每次都不起震,遇到不起 ...

我是F030,而且用的也是LSI内部晶振,不是外部的,和电容没关系吧
p13692166934 回答时间:2018-9-11 14:33:29
toofree 发表于 2018-9-11 14:19
我想问你这堆变量从哪来的?time_date.hour,time_date.min,time_date.sec
没见你定义过,只看到使用了。这 ...

我后面看了下,之前那个F4好像是中断WakeUp唤醒,换成F0的,中断不一样要重新修改
p13692166934 回答时间:2018-9-11 14:36:49
void RTC_Set_WakeUp(u8 wksel,u16 cnt)
{
        //关闭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,只有这个
p13692166934 回答时间:2018-9-11 14:53:23
好了问题找到了,F0没有唤醒定时器,现在就是看用什么读秒了,有没有大佬写过
p13692166934 回答时间:2018-9-12 11:17:02
中断进不去,我是照着F0的改,有没有人知道那边有问题       
         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); //外部中断使能(系统中断没有这个使能)
p13692166934 回答时间:2018-9-13 13:31:16
好了,一开始没注意获取时间函数,后面注意了,原来只有打开电源,选择LSI,使能RTC,选择分频,RTC日历就会自己更新,只要把读取函数放在循环就好了
寻觅左岸 回答时间:2018-9-14 15:01:06
低速时钟,看看OLED规格书

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版