中级会员
 
- 积分
- 424
- 金钱
- 424
- 注册时间
- 2016-4-26
- 在线时间
- 84 小时
|
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)便不在显示
|
|