OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3249|回复: 4

关于RTC向串口调试发送时间,初次上电显示,往后不显示

[复制链接]

8

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2016-4-26
在线时间
84 小时
发表于 2016-5-2 21:19:06 | 显示全部楼层 |阅读模式
5金钱
#include "stm32f10x.h"
#include <stdio.h>


int fputc(int ch, FILE *f)    //重新定向这个C库(stdio)printf函数 文件流 到 串口中去
{
       
          while( USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET );
                USART_SendData(USART1,ch);  
          return(ch);
}

u32 tim_bz;

void rccinit(void);
void GPIOusartnvic_Configuration(void);
void RTC_Configuration(void);
void RTC_CheckAndConfig(void);

int main(void)
{               
         
         u32 chuzhi = 0,shi,fen,miao;
         
         tim_bz=0;
         
         rccinit();
         GPIOusartnvic_Configuration();
   RTC_CheckAndConfig();

         while(1)
         {
                 if(tim_bz == 1)
                 {
                         tim_bz=0;
                  chuzhi = RTC_GetCounter();
                         
                        shi =  chuzhi/3600;
                         fen = (chuzhi%3600)/60;
                         miao = chuzhi%60;         
                         
                         printf("时间: %0.2d:%0.2d:%0.2d\r\n",shi,fen,miao);
                 }
         }
                         

}

void GPIOusartnvic_Configuration(void)
{
       
       
         NVIC_InitTypeDef NVIC_InitStructure;
         GPIO_InitTypeDef GPIO_InitStruct;
         USART_InitTypeDef USART_InitStruct;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
         
         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_Init(GPIOA,&GPIO_InitStruct);
         
          GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_Init(GPIOA,&GPIO_InitStruct);

         USART_InitStruct.USART_BaudRate = 115200;
         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
         USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
         USART_InitStruct.USART_Parity = USART_Parity_No;
         USART_InitStruct.USART_StopBits = USART_StopBits_1;
         USART_InitStruct.USART_WordLength = USART_WordLength_8b;
         USART_Init(USART1,&USART_InitStruct);
         
         USART_Cmd(USART1,ENABLE);     // USART使能外设
       
        /* 选择优先级分组1 */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
       
        /* 使能 RTC 中断 */
        NVIC_InitStructure.NVIC_IRQChannel =  RTC_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn ;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
         
}

void RTC_Configuration(void)
{       
        /* 使能 RTC 和后备寄存器访问 */
        PWR_BackupAccessCmd(ENABLE);
        /* 复位备份寄存器设置 */
        BKP_DeInit();
        /* 开启 LSE */
//        RCC_LSEConfig(RCC_LSE_ON);
        RCC_LSICmd(ENABLE);
        /* 等待LSE起振 */
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
        /* 选择 LSE 为 RTC 时钟源 */
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
        /* 使能 RTC 时钟 */
        RCC_RTCCLKCmd(ENABLE);
        /* 等待 RTC 寄存器同步完成 */
        RTC_WaitForSynchro();
        /* 等待最近一次对 RTC 寄存器的写操作完成 */
        RTC_WaitForLastTask();
        /* 使能RTC秒中断 */  
        RTC_ITConfig(RTC_IT_SEC, ENABLE);
        /* 等待最近一次对 RTC 寄存器的写操作完成 */
        RTC_WaitForLastTask();
        /* 设置RTC时钟分频值为32767,则计数频率 = (32.768 KHz)/(32767+1) = 1Hz(~1s)*/
        RTC_SetPrescaler(32767);
        /* 等待最近一次对 RTC 寄存器的写操作完成 */
        RTC_WaitForLastTask();
}

void rccinit(void)
{
    /* 定义枚举类型变量 HSEStartUpStatus */
    ErrorStatus HSEStartUpStatus;

    /* 复位系统时钟设置*/
    RCC_DeInit();
    /* 开启HSE*/
    RCC_HSEConfig(RCC_HSE_ON);
    /* 等待HSE起振并稳定*/
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    /* 判断HSE起是否振成功,是则进入if()内部 */
    if(HSEStartUpStatus == SUCCESS)
    {
            /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
            RCC_HCLKConfig(RCC_SYSCLK_Div1);
            /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
            RCC_PCLK2Config(RCC_HCLK_Div1);
            /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
            RCC_PCLK1Config(RCC_HCLK_Div2);
            /* 设置FLASH延时周期数为2 */
            FLASH_SetLatency(FLASH_Latency_2);
            /* 使能FLASH预取缓存 */
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
            /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
            /* 使能PLL */
            RCC_PLLCmd(ENABLE);
            /* 等待PLL输出稳定 */
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
            /* 选择SYSCLK时钟源为PLL */
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
            /* 等待PLL成为SYSCLK时钟源 */
            while(RCC_GetSYSCLKSource() != 0x08);
    }

    /* 打开APB2总线上的GPIOA时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
}

void RTC_CheckAndConfig(void)
{
            
        if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)    //在启动时检查备份寄存器BKP_DR1,如果内容不是0xA5A5,
        {
                 RTC_Configuration();
               
                RTC_WaitForLastTask();

                RTC_SetCounter(0x10ed2);
               
                RTC_WaitForLastTask();
               
                BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
        }
       
        else
        {
                                
                /*等待寄存器同步*/
                RTC_WaitForSynchro();
               
                /*等待上次RTC寄存器写操作完成*/
                RTC_WaitForLastTask();
                /*允许RTC秒中断*/
                RTC_ITConfig(RTC_IT_SEC, ENABLE);
               
                /*等待上次RTC寄存器写操作完成*/
                RTC_WaitForLastTask();
               
        }
               
                RCC_ClearFlag();  //清除复位标志
}

void RTC_IRQHandler(void)
{
       
        if( RTC_GetITStatus(RTC_IT_SEC) != RESET )
        {
                RTC_ClearITPendingBit(RTC_IT_SEC);
               
                tim_bz=1;
        }
       
}


只能
    if (BKP_ReadBackupRegister(BKP_DR1) == 0xA5A5) 串口助手显示初始时间,改成 if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)便不在显示



最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2016-5-2 21:19:07 | 显示全部楼层
回复

使用道具 举报

8

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2016-4-26
在线时间
84 小时
 楼主| 发表于 2016-5-3 07:10:07 | 显示全部楼层
顶一下
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2012-8-17
在线时间
16 小时
发表于 2016-5-3 08:35:37 | 显示全部楼层
RTC_WaitForSynchro();这个函数死了,我也是这个问题,还没找到解决办法。
回复

使用道具 举报

8

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
424
金钱
424
注册时间
2016-4-26
在线时间
84 小时
 楼主| 发表于 2016-5-3 11:55:50 | 显示全部楼层
顶一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 01:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表