久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4048|回復(fù): 0
收起左側(cè)

STM32學(xué)習(xí)手記⑨-RTC實(shí)時(shí)時(shí)鐘

[復(fù)制鏈接]
ID:71259 發(fā)表于 2014-12-30 00:45 | 顯示全部樓層 |閱讀模式
#include "stm32f10x_lib.h"
#include"stdio.h"
vu32 TimeDisplay = 0;
void RCC_Configuration()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE);   //打開APB2外設(shè)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);     //使能電源時(shí)鐘和備份區(qū)時(shí)鐘
}
void NVIC_Configuration( )
{
  NVIC_InitTypeDef NVIC_InitStructure;                           //定義一個(gè)中斷結(jié)構(gòu)體
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   //無(wú)搶占式優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //響應(yīng)優(yōu)先級(jí)為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;      //定義GPIO初始化結(jié)構(gòu)體
//--------USART1 TX 配置為復(fù)用推挽輸出 AF_PP---------------------//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;  //管腳位置定義,標(biāo)號(hào)可以是NONE、ALL015
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;  //輸出速度2MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //推挽輸出模式 Out_PP
GPIO_Init(GPIOA,&GPIO_InitStructure);  //EGPIO初始化
//--------USART1 RX 配置為浮空輸入 IN_FLOATING---------------------//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;  //管腳位置定義
//輸入模式下配置輸出速度無(wú)意義
//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;  //輸出速度2MHz  
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;  //浮空輸入 IN_FLOATING  
GPIO_Init(GPIOA,&GPIO_InitStructure);   //CGPIO初始化
}
void USART1_Configuration( )   
{
USART_InitTypeDef USART_InitStructure;               //串口設(shè)置恢復(fù)默認(rèn)參數(shù)
USART_ClockInitTypeDef  USART_ClockInitStructure;
USART_InitStructure.USART_BaudRate = 115200;       //波特率115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //字長(zhǎng)8
USART_InitStructure.USART_StopBits = USART_StopBits_1;  //1位停止字節(jié)
USART_InitStructure.USART_Parity = USART_Parity_No;   //無(wú)奇偶校驗(yàn)
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無(wú)流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //打開Rx接收和Tx發(fā)送功能
USART_Init(USART1, &USART_InitStructure);   //初始化
USART_Cmd(USART1, ENABLE); //啟動(dòng)串口
//-----如下語(yǔ)句解決第1個(gè)字節(jié)無(wú)法正確發(fā)送出去的問(wèn)題-----//
USART_ClearFlag(USART1, USART_FLAG_TC);     // 清標(biāo)志
}
void RTC_Configuration(void)
{
     PWR_BackupAccessCmd(ENABLE);    //取消備份區(qū)寫保護(hù)(寫保護(hù)在每次硬件復(fù)位后被使能)
BKP_DeInit();   //備份區(qū)恢復(fù)默認(rèn)
RCC_LSEConfig(RCC_LSE_ON); //LSE(外部低速振蕩時(shí)鐘)打開
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);  //等待LSE準(zhǔn)備就緒
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);    //LSE作為RTC時(shí)鐘
RCC_RTCCLKCmd(ENABLE);   //RTC時(shí)鐘打開
RTC_WaitForSynchro();  //等待RTC寄存器同步
RTC_WaitForLastTask();  //對(duì)RTC任何寄存器的操作,都必須在前一次寫操作完成后執(zhí)行
RTC_ITConfig(RTC_IT_SEC, ENABLE);    //使能 秒中斷
RTC_WaitForLastTask();   //對(duì)RTC任何寄存器的操作,都必須在前一次寫操作完成后執(zhí)行
RTC_SetPrescaler(32767);   //對(duì)RTC時(shí)鐘分頻  32.768K/(32767+1)=1Hz
RTC_WaitForLastTask();     //對(duì)RTC任何寄存器的操作,都必須在前一次寫操作完成后執(zhí)行
}
u8 USART_Scanf(u32 value)   
{
  u32 index = 0;
  u32 tmp[2] = {0, 0};      
  while(index < 2)
  {
    /* Loop until RXNE = 1 */
    while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    tmp[index++] = (USART_ReceiveData(USART1));
    if((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39))
    {
      printf("\n\rPlease enter valid number between 0 and 9");
      index--;
    }
  }
  /* Calculate the Corresponding value */
  index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10);
  /* Checks */
  if(index > value)
  {
    printf("\n\rPlease enter valid number between 0 and %d", value);
    return 0xFF;
  }
  return index;
}
u32 Time_Regulate(void)
{
  u32 Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;
  printf("\r\n==============Time Settings=====================================");
  printf("\r\n  Please Set Hours");
  while(Tmp_HH == 0xFF)
  {
    Tmp_HH = USART_Scanf(23);
  }
  printf(":  %d", Tmp_HH);
  printf("\r\n  Please Set Minutes");
  while(Tmp_MM == 0xFF)
  {
    Tmp_MM = USART_Scanf(59);
  }
  printf(":  %d", Tmp_MM);
  printf("\r\n  Please Set Seconds");
  while(Tmp_SS == 0xFF)
  {
    Tmp_SS = USART_Scanf(59);
  }
  printf(":  %d", Tmp_SS);
  /* Return the value to store in RTC counter register */
  return((Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS));
}
void Time_Adjust(void)
{   
  RTC_WaitForLastTask();    //對(duì)RTC任何寄存器的操作,都必須在前一次寫操作完成后執(zhí)行   
  RTC_SetCounter(Time_Regulate());  //設(shè)置計(jì)數(shù)值
  RTC_WaitForLastTask();      //對(duì)RTC任何寄存器的操作,都必須在前一次寫操作完成后執(zhí)行   
}
void Time_Display(u32 TimeVar)
{
  u32 THH = 0, TMM = 0, TSS = 0;
  THH = TimeVar/3600; //計(jì)算小時(shí)
  TMM = (TimeVar % 3600)/60;//計(jì)算分
  TSS = (TimeVar % 3600)% 60; //計(jì)算秒
  printf("Time: %0.2d:%0.2d:%0.2d\r\n",THH, TMM, TSS);
}
void Time_Show(void)
{
  while(1)  //infinite loop
  {
    if(TimeDisplay == 1)  //if 1s has passed
    {   
      Time_Display(RTC_GetCounter()); //display current time
      TimeDisplay = 0;
    }
  }
}
int fputc(int ch, FILE *f)    //在源代碼中添加fputc函數(shù),可以用printf函數(shù)做為調(diào)試輸出
{
  /* Printf內(nèi)容發(fā)往串口 */
  USART_SendData(USART1, (u8) ch);   
  /* 循環(huán),直到傳送完成 */
  while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  return ch;
}
int main()
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration( );
USART1_Configuration();
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5){   //檢查是否第一次配置RTC
printf("\r\n\n RTC not yet configured....");
  RTC_Configuration();
  printf("\r\n RTC configured....");
  Time_Adjust();
  BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
}
else{
if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)   //檢查是否是上電復(fù)位
{
printf("\r\n\n Power On Reset occurred....");
}
else if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)  //檢查是否是復(fù)位腳復(fù)位
{
printf("\r\n\n External Reset occurred....");
}
printf("\r\n No need to configure RTC....");
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
}
RCC_ClearFlag();   //清除復(fù)位標(biāo)志
Time_Show();
}
//秒中斷函數(shù) ,在  stm32f10x_it.c
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC) != RESET)    //判斷是否是秒中斷
   {
     RTC_ClearITPendingBit(RTC_IT_SEC); //清除RTC秒中斷標(biāo)志
     TimeDisplay = 1; //將標(biāo)志位置1,代表1s過(guò)去
     RTC_WaitForLastTask();        //wait until last write operation on RTC regisiters has finished
     if(RTC_GetCounter() == 0x00015180) //reset RTC counter when time is 23:59:59
     {
       RTC_SetCounter(0x0);     
       RTC_WaitForLastTask();  //wait until last write operation on RTC regisiters has finished
     }
   }
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 69精品久久久久久 | 国产视频久久久 | 鸳鸯谱在线观看高清 | 国产精品久久久久久久久久久久冷 | 日韩中文一区二区三区 | 久久精品一区二区三区四区 | 精品国产18久久久久久二百 | 国产精品免费一区二区三区四区 | 久久久成人免费一区二区 | 亚洲国产精品久久久久婷婷老年 | 欧美激情精品久久久久久 | 久久er99热精品一区二区 | 中文字幕亚洲欧美日韩在线不卡 | 免费看色| 91亚洲国产成人久久精品网站 | 国产精品1 | 欧美成人一区二区 | 日韩精品免费视频 | 91久久伊人 | 午夜影院网站 | 国产91精品在线 | 婷婷激情综合 | 九九导航 | 日韩国产一区 | 一a级片 | 日韩欧美国产精品一区二区 | 成人在线免费视频 | 妖精视频一区二区三区 | 97久久精品午夜一区二区 | 亚洲精品福利在线 | 亚洲精品一区二区 | 国产一区二区三区色淫影院 | 亚洲自拍偷拍免费视频 | 一级大片| 国精品一区二区 | 国产精品96久久久久久 | 日本亚洲欧美 | 日韩在线观看网站 | 久久黄色网 | 成人免费网视频 | 日韩精品在线网站 |