基于ARM的時鐘+鬧鐘設(shè)計_第1頁
基于ARM的時鐘+鬧鐘設(shè)計_第2頁
基于ARM的時鐘+鬧鐘設(shè)計_第3頁
基于ARM的時鐘+鬧鐘設(shè)計_第4頁
基于ARM的時鐘+鬧鐘設(shè)計_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、嵌入式系統(tǒng)課程設(shè)計報告 基于ARM的時鐘系統(tǒng)院 系: 學(xué)生姓名: 專 業(yè): 應(yīng)用電子技術(shù) 班 級: 指導(dǎo)教師: 完成時間: 目 錄1 引言12 STM32單片機RTC介紹13 總體設(shè)計框圖24 硬件電路24.1 STM32芯片管腳介紹24.2 STM32復(fù)位和時鐘電路設(shè)計34.3鬧鐘提醒電路45 程序流程圖45.1 主程序流程圖45.2 中斷程序流程圖66 總結(jié)與體會6參考文獻:7附錄:8基于ARM的時鐘系統(tǒng)摘要:本設(shè)計選擇STM32為核心控制元件,設(shè)計了用RTC定時器實現(xiàn)時鐘的控制與設(shè)計,本設(shè)計能作為普通時鐘用,而且能設(shè)置鬧鐘。程序使用C語言進行編程,能動態(tài)顯示當前時間,包括時、分、秒,并且

2、用串口助手顯示。關(guān)鍵詞:STM32 ARM 時鐘 鬧鐘1 引言 隨著科技的發(fā)展,嵌入式系統(tǒng)廣泛應(yīng)用于工業(yè)控制和商業(yè)管理領(lǐng)域,在多媒體手機、袖珍電腦,掌上電腦,車載導(dǎo)航器等方面的應(yīng)用,更是極大地促進了嵌入式技術(shù)深入到生活和工作各個方面。嵌入式系統(tǒng)主要由嵌入式處理器、相關(guān)支撐硬件及嵌入式軟件系統(tǒng)組成。本文介紹基于STM32F103R6T6的嵌入式微處理器的電子時鐘設(shè)計,并且在液晶上顯示。2 STM32單片機RTC介紹STM32的實時時鐘(RTC)是一個獨立的定時器。RTC模塊擁有一組連續(xù)計數(shù)的計數(shù)器,在相應(yīng)軟件配置下,可以提供時鐘日歷的功能,修改計數(shù)器的值可以重新設(shè)置系統(tǒng)當前的時間和日期。STM3

3、2F10x系列微控制器片上內(nèi)置的RTC模塊,主要特性如下:(1) 可編程的預(yù)分頻系數(shù),分頻系數(shù)最高位220。(2) 32位的可編程計數(shù)器,可用于長程時間段的測量。(3) 兩個單獨的時鐘:用于APB1接口的PLCK1和RTC時鐘(此時RTC時鐘的頻率必須小于PCLK1時鐘的四分之一以上)。(4) 可以選擇一下三種RTC的時鐘源: HSE(high speed external)時鐘除以128,即高速外部時鐘,接石英/陶瓷諧振器,或者接外部時鐘源,頻率范圍為416MHz。 LSI(low speed internal)振蕩器時鐘,即低速內(nèi)部時鐘,頻率為40kHz。 LSE(low speed ex

4、ternal)振蕩器時鐘,即低速外部時鐘,接石英晶體,頻率為32.768kHz。(5)2鐘獨立的復(fù)位類型: APB1接口由系統(tǒng)復(fù)位。 RTC核(預(yù)分頻器、鬧鐘、計數(shù)器和分頻器)只能由備份域復(fù)位。(6)3個專門的可屏蔽中斷:鬧鐘中斷,用來產(chǎn)生一個軟件可編程的鬧鐘中斷。秒中斷,用來產(chǎn)生一個可編程的周期性中斷信號(最長可達1s)。溢出中斷,檢測內(nèi)部可編程計數(shù)器溢出并回轉(zhuǎn)為0的狀態(tài)。3 總體設(shè)計框圖 本電路主要由3大部分電路組成:ARM最小系統(tǒng)電路、時鐘顯示電路和鬧鐘警報電路(本設(shè)計用LED燈指示)。其中ATM最小系統(tǒng)主要由復(fù)位電路和時鐘電路組成。在該設(shè)計中,鬧鐘提醒由LED燈代替,當鬧鐘時間到的話,

5、LED燈亮,延時設(shè)定的時間后自動關(guān)閉。總體設(shè)計方框圖,如圖1所示。STM32液晶顯示電路 復(fù)位電路 鬧鈴提醒電路 時鐘電路圖1總體設(shè)計方框圖4 硬件電路 該設(shè)計分為軟件設(shè)計和硬件設(shè)計兩大模塊,硬件電路由ARM最小系統(tǒng)電路、時鐘顯示電路和鬧鐘提醒電路組成。4.1 STM32芯片管腳介紹STM32F103R6T6管腳示意圖,如圖2所示。圖2 STM32F103R6T6管腳示意圖4.2 STM32復(fù)位和時鐘電路設(shè)計 此電路主要是復(fù)位電路和時鐘電路兩部分,其中復(fù)位電路采用按鍵手動復(fù)位和上電自動復(fù)位組合,電路如圖2(右)所示:其中7腳為STM32的復(fù)位端。時鐘電路如圖2(左)所示:晶振采用的是8MHz和

6、32.786KHz,8MKz分別接STM32的5腳和6腳,32.786KHz分別接STM32的3腳和4腳。圖3 STM32復(fù)位和時鐘電路4.3 鬧鐘提醒電路本設(shè)計的鬧鐘提醒電路沒有采用蜂鳴器,為了調(diào)試方便用實驗板上的發(fā)光二極管LED1LED4指示,其與實驗板對應(yīng)接口為PC0PC3。電路如圖4所示。圖4 鬧鐘提醒電路5 程序流程圖5.1主程序流程圖 主程序流程圖,如圖5所示。圖5主程序流程圖5.2中斷程序流程圖 中斷程序流程圖,如圖6所示。圖6中斷程序流程圖6 總結(jié)與體會通過這次時鐘的設(shè)計,使我對ARM有了更深的理解。剛開始拿到題提目,我先是查找相關(guān)資料,從圖書館和網(wǎng)上找到相關(guān)的課題,參考借鑒別

7、人的設(shè)計,從而理清我們設(shè)計的思路。此次作業(yè)設(shè)計大致可以分為兩部分,電路圖部分和程序編程部分,其中最有難度的是程序的編寫與調(diào)試。在編寫程序的過程中,我遇到了各種各樣的問題,工程之間的結(jié)合,對于其中的錯誤怎樣解決,需要配置什么,更改哪里等等。對于ARM我學(xué)的很淺,編程遇到問題不知道如何解決,我知道這個是我的弱點,但在這兩周的課程設(shè)計中,用Keil uVision4在ARM開發(fā)板上進行程序調(diào)試,遇到問題解決問題,在這個過程中我收獲了不少。參考文獻1 彭剛、秦志強等.基于ARM Cortex-M3的STM32系列嵌入式微控制器應(yīng)用實踐M.北京:電子工業(yè)出版社2 李寧.基于MDK的STM32處理器開發(fā)應(yīng)

8、用M.北京航空航天大學(xué)出版社,2008.3 王永紅、徐煒、赫立平.STM32系列ARM Cortex-M3微控制器原理與實踐M.北京航空航天大學(xué)出版社,2008.4 ARM Limited.Cortex-M3 Technical Reference Manual(r2p0). ARM DDI 0037G 2008.5 附錄1 總體電路圖2 串口助手演示效果3 源程序/* * 函數(shù)名:NVIC_Configuration * 描述 :配置RTC秒中斷的主中斷優(yōu)先級為1,次優(yōu)先級為0 * 輸入 :無 * 輸出 :無 * 調(diào)用 :外部調(diào)用 */void NVIC_Configuration(void

9、) NVIC_InitTypeDef NVIC_InitStructure; /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the RTC Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQCh

10、annelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority =0 ; NVIC_Init(&NVIC_InitStructure);/* * 函數(shù)名:GPIO_Configuration * 描述 :配置GPIO * 輸入 :無 * 輸出 :無

11、 * 調(diào)用 :外部調(diào)用 */void GPIO_Configuration(void)/*定義一個GPIO_InitTypeDef類型的結(jié)構(gòu)體*/GPIO_InitTypeDef GPIO_InitStructure;/*開啟GPIOC的外設(shè)時鐘*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE); /*選擇要控制的GPIOC引腳*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;/*設(shè)置引腳模式為通用推挽輸出*/ GPIO_InitS

12、tructure.GPIO_Mode = GPIO_Mode_Out_PP; /*設(shè)置引腳速率為50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*調(diào)用庫函數(shù),初始化GPIOC*/ GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); /* * 函數(shù)名:RTC_Configuration * 描述 :配置RTC * 輸入 :無 * 輸出 :無 * 調(diào)用 :外部調(diào)用 *

13、/void RTC_Configuration(void) /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is

14、 ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) = RESET) /* Select LSE as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registe

15、rs has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_ITConfig(RTC_IT_ALR, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767)

16、; /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask();/* * 函數(shù)名:Time_Regulate * 描述 :返回用戶在超級終端中輸入的時間值,并將值儲存在 * RTC 計數(shù)寄存器中。 * 輸入 :無 * 輸出 :用戶在超級終端中輸入的時間值,單位為 s * 調(diào)用 :內(nèi)部調(diào)用 */uint32_t Time_Regulate(void) uint32

17、_t Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF; printf("rn=Time Settings="); printf("rn Please Set Hours"); while (Tmp_HH = 0xFF) Tmp_HH = USART_Scanf(23); printf(": %d", Tmp_HH); printf("rn Please Set Minutes"); while (Tmp_MM = 0xFF) Tmp_MM = USART_Scanf(59);

18、 printf(": %d", Tmp_MM); printf("rn 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);/* * 函數(shù)名:Time_Adjust * 描述 :時間調(diào)節(jié) * 輸入 :無 * 輸

19、出 :無 * 調(diào)用 :外部調(diào)用 */void Time_Adjust(void) /uint32_t AAAA; /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /AAAA=Time_Regulate(); /* Change the current time */ RTC_SetCounter(Time_Regulate(); RTC_SetAlarm( Time_Regulate(); /* Wait until last write operation o

20、n RTC registers has finished */ RTC_WaitForLastTask();/* * 函數(shù)名:Time_Display * 描述 :顯示當前時間值 * 輸入 :-TimeVar RTC計數(shù)值,單位為 s * 輸出 :無 * 調(diào)用 :內(nèi)部調(diào)用 */void Time_Display(uint32_t TimeVar) uint32_t THH = 0, TMM = 0, TSS = 0; /* Compute hours */ THH = TimeVar / 3600; /* Compute minutes */ TMM = (TimeVar % 3600) /

21、60; /* Compute seconds */ TSS = (TimeVar % 3600) % 60; printf(" Time: %0.2d:%0.2d:%0.2dr", THH, TMM, TSS);/* * 函數(shù)名:Time_Show * 描述 :在超級終端中顯示當前時間值 * 輸入 :無 * 輸出 :無 * 調(diào)用 :外部調(diào)用 */ void Time_Show(void) printf("nr"); /* Infinite loop */ while (1) /* If 1s has paased */ if (TimeDisplay =

22、 1) /* Display current time */ Time_Display(RTC_GetCounter(); TimeDisplay = 0; /* * 函數(shù)名:USART_Scanf * 描述 :串口從超級終端中獲取數(shù)值 * 輸入 :- value 用戶在超級終端中輸入的數(shù)值 * 輸出 :無 * 調(diào)用 :內(nèi)部調(diào)用 */ uint8_t USART_Scanf(uint32_t value) uint32_t index = 0; uint32_t tmp2 = 0, 0; while (index < 2) /* Loop until RXNE = 1 */ while

23、(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) = RESET) tmpindex+ = (USART_ReceiveData(USART1);/ 從串口終端里面輸進去的數(shù)是ASCII碼值 if (tmpindex - 1 < 0x30) | (tmpindex - 1 > 0x39) printf("nrPlease enter valid number between 0 and 9"); index-; /* Calculate the Corresponding value */ index = (tmp1 -

24、 0x30) + (tmp0 - 0x30) * 10); /* Checks */ if (index > value) printf("nrPlease enter valid number between 0 and %d", value); return 0xFF; return index;/*/* STM32F10x Peripherals Interrupt Handlers */* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */* available

25、 peripheral interrupt handler's name please refer to the startup */* file (startup_stm32f10x_xx.s). */*/* * brief This function handles RTC global interrupt request. * param None * retval : None */void RTC_IRQHandler(void) if (RTC_GetITStatus(RTC_IT_SEC) != RESET) /* Clear the RTC Second interru

26、pt */ RTC_ClearITPendingBit(RTC_IT_SEC); /* Toggle GPIO_LED pin 6 each 1s */ /GPIO_WriteBit(GPIO_LED, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIO_LED, GPIO_Pin_6); /* Enable time update */ TimeDisplay = 1; /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLas

27、tTask(); /* Reset RTC Counter when Time is 23:59:59 */ if (RTC_GetCounter() = 0x00015180) RTC_SetCounter(0x0); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); if(RTC_GetITStatus(RTC_IT_ALR)!=RESET) RTC_ClearITPendingBit(RTC_IT_ALR); printf("rn RTC alar

28、m begin!"); GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); Delay_nms(3000);GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); /* * 函數(shù)名:Delay_nus(int16) * 描述 :微秒級延時n<32767 * 輸入 :無 * 輸出 :無 */void Delay_nus(u16 n)u16 j;while(n-)j=8;while(j-);/*/* * 函數(shù)名:Delay_nm

29、s(int16) * 描述 :毫秒級延時n<32767 * 輸入 :無 * 輸出 :無 */void Delay_nms(u16 n)while(n-)Delay_nus(1100);/*嵌入式系統(tǒng)課程設(shè)計報告 * 文件名 :main.c* 描述 :利用STM32的RTC實現(xiàn)一個簡易的電子時鐘。在串口助手中顯示時間值。* 顯示格式為 Time: XX:XX:XX(時:分:秒),當時間* 計數(shù)為:23:59:59 時將刷新為:00:00:00。 * 另外還能設(shè)置鬧鐘*基于ARM的時鐘系統(tǒng)*/int main(void) /* config the sysclock to 72M */ Sy

30、stemInit(); /* USART1 config */USART1_Config();/* 配置RTC秒中斷優(yōu)先級 */NVIC_Configuration(); printf( "rn This is a RTC demo. rn" );GPIO_Configuration();if (BKP_ReadBackupRegister(BKP_DR1) != 0x5A5A) /* Backup data register value is not correct or not yet programmed (when the first time the progra

31、m is executed) */printf("rnThis is a RTC demo!rn"); printf("rnn RTC not yet configured."); /* RTC Configuration */ RTC_Configuration(); printf("rn RTC configured."); /* Adjust time by values entred by the user on the hyperterminal */ Time_Adjust(); BKP_WriteBackupRegister(BKP_DR1, 0x5A5A); else /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) !=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論