本文引用地址:http://m.butianyuan.cn/article/201611/322893.htmif(HSEStartUpStatus==SUCCESS)//外部高速時鐘已經(jīng)準(zhǔn)別好
{
//開啟FLASH的預(yù)取功能
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//FLASH延遲2個周期
FLASH_SetLatency(FLASH_Latency_2);
//配置AHB(HCLK)時鐘=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//配置APB2(PCLK2)鐘=AHB時鐘
RCC_PCLK2Config(RCC_HCLK_Div1);
//配置APB1(PCLK1)鐘=AHB1/2時鐘
RCC_PCLK1Config(RCC_HCLK_Div2);
//配置PLL時鐘==外部高速晶體時鐘*9PLLCLK=8MHz*9=72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
//使能PLL時鐘
RCC_PLLCmd(ENABLE);
//等待PLL時鐘就緒
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
{
}
//配置系統(tǒng)時鐘=PLL時鐘
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//檢查PLL時鐘是否作為系統(tǒng)時鐘
while(RCC_GetSYSCLKSource()!=0x08)
{
}
}
//啟動GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
//啟動AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;//定義NVIC配置的結(jié)構(gòu)體變量
#ifdefVECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=RTC_IRQChannel;//指定是RTC全局中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;//定義配置GPIO的結(jié)構(gòu)體變量
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//改變指定管腳的映射
//第一個參數(shù)選擇重映射的管腳用以選擇用作事件輸出的GPIO端口在這里是SWJ完全失能詳見《STM32函數(shù)說明》P132
//第二個參數(shù)指定管腳重映射的新狀態(tài),可以是:ENABLE或DISABLE
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//選擇所有管腳
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//引腳頻率50M
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化PB
//????
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
voidRTC_Configuration(void)
{
//啟用PWR和BKP的時鐘(fromAPB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
//后備域解鎖
PWR_BackupAccessCmd(ENABLE);//使能后備寄存器訪問
//備份寄存器模塊復(fù)位
BKP_DeInit();//將BKP的全部寄存器重設(shè)為缺省值
RCC_LSEConfig(RCC_LSE_ON);//設(shè)置外部低速晶振(LSE)32.768K參數(shù)指定LSE的狀態(tài),可以是:RCC_LSE_ON:LSE晶振ON
//RCC_LSE_ON:LSE晶振OFF,RCC_LSE_Bypass:LSE晶振被外部時鐘旁路
//等待穩(wěn)定
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)
{}
//RTC時鐘源配置成LSE(外部32.768K)
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//設(shè)置RTC時鐘,參數(shù)指定RTC時鐘,可以是:RCC_RTCCLKSource_LSE:選擇LSE作為RTC時鐘
//RCC_RTCCLKSource_LSI:選擇LSI作為RTC時鐘,RCC_RTCCLKSource_HSE_Div128:選擇HSE時鐘128分頻作為RTC時鐘
//RTC開啟
RCC_RTCCLKCmd(ENABLE);
//開啟后需要等待APB1時鐘與RTC時鐘同步,才能讀寫寄存器
RTC_WaitForSynchro();
//每一次讀寫寄存器前,要確定上一個操作已經(jīng)結(jié)束
RTC_WaitForLastTask();//等待最近一次對RTC寄存器的寫操作完成
//使能秒中斷
RTC_ITConfig(RTC_IT_SEC,ENABLE);
//讀寫寄存器前,要確定上一個操作已經(jīng)結(jié)束
RTC_WaitForLastTask();
//設(shè)置RTC分頻器,使RTC時鐘為1Hz
//RTCperiod=RTCCLK/RTC_PR=(32.768KHz)/(32767+1)
RTC_SetPrescaler(32767);
//等待寄存器寫入完成
RTC_WaitForLastTask();
//等待寫入完成
RTC_WaitForLastTask();
}
voidTime_Adjust(void)//校準(zhǔn)時間函數(shù)
{
RTC_WaitForLastTask();
RTC_SetCounter(12*3600+2*60+0);//設(shè)置RTC計數(shù)器的值參數(shù)是新的RTC計數(shù)器的值
//在使用本函數(shù)前必須先調(diào)用函數(shù)RTC_WaitForLastTask(),等待標(biāo)志位RTOFF被設(shè)置
RTC_WaitForLastTask();
}
voidTime_Display(u32TimeVar)//把RTC計數(shù)器的值轉(zhuǎn)化為時,分,秒進制
{
THH=TimeVar/3600;
TMM=(TimeVar%3600)/60;
TSS=(TimeVar%3600)%60;
}
voidassert_failed(u8*file,u32line)
{
while(1)
{}
}
中斷服務(wù)程序在stm32f10x_it.c文件中,其中RTC中斷處理函數(shù)如下:
voidRTC_IRQHandler(void)//RTC的中斷服務(wù)程序
{
GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7)));//B7口取反
if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)
{
RTC_ClearITPendingBit(RTC_IT_SEC);//清除RTC的中斷待處理位
GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7)));
TimeDisplay=1;
RTC_WaitForLastTask();
if(RTC_GetCounter()==0x00015180)
{
RTC_SetCounter(0x0);
RTC_WaitForLastTask();
}
}
}
評論