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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、用M.北京航空航天大學(xué)出版社,2008.3 王永紅、徐煒、赫立平.STM32系列ARM Cortex-M3微控制器原理與實(shí)踐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)先級(jí)為1,次優(yōu)先級(jí)為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 * 輸入 :無 * 輸出 :無 * 調(diào)用 :外

11、部調(diào)用 */void GPIO_Configuration(void)/*定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體*/GPIO_InitTypeDef GPIO_InitStructure;/*開啟GPIOC的外設(shè)時(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_InitStructure

12、.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)用 */void RTC_Co

13、nfiguration(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 ready */ wh

14、ile (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 registers has finis

15、hed */ 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); /* RTC per

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

17、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); printf(: %d, Tmp_MM); printf(rn Please Set Seconds); while

18、(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 * 描述 :時(shí)間調(diào)節(jié) * 輸入 :無 * 輸出 :無 * 調(diào)用 :外部調(diào)用 */void Time_Adjust(void) /uint32_t AAAA; /* Wait until last write operation on R

19、TC 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 on RTC registers has finished */ RTC_WaitForLastTask();/* * 函數(shù)名:Time_Display * 描述 :顯示當(dāng)前時(shí)間值 * 輸入 :

20、-TimeVar RTC計(jì)數(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) / 60; /* Compute seconds */ TSS = (TimeVar % 3600) % 60; printf( Time: %0.2d:%0.2d:%0.2dr, THH, TM

21、M, TSS);/* * 函數(shù)名:Time_Show * 描述 :在超級(jí)終端中顯示當(dāng)前時(shí)間值 * 輸入 :無 * 輸出 :無 * 調(diào)用 :外部調(diào)用 */ void Time_Show(void) printf(nr); /* Infinite loop */ while (1) /* If 1s has paased */ if (TimeDisplay = 1) /* Display current time */ Time_Display(RTC_GetCounter(); TimeDisplay = 0; /* * 函數(shù)名:USART_Scanf * 描述 :串口從超級(jí)終端中獲取數(shù)值 *

22、 輸入 :- value 用戶在超級(jí)終端中輸入的數(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 (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) = RESET) tmpindex+ = (USART_ReceiveData(USART1);/ 從串口終端里面輸進(jìn)去的數(shù)是ASCII碼值 if (tmpi

23、ndex - 1 0x39) printf(nrPlease enter valid number between 0 and 9); index-; /* Calculate the Corresponding value */ index = (tmp1 - 0x30) + (tmp0 - 0x30) * 10); /* Checks */ if (index value) printf(nrPlease enter valid number between 0 and %d, value); return 0xFF; return index;/*/* STM32F10x Periphe

24、rals Interrupt Handlers */* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */* available peripheral interrupt handlers name please refer to the startup */* file (startup_stm32f10x_xx.s). */*/* * brief This function handles RTC global interrupt request. * param None * retval

25、 : None */void RTC_IRQHandler(void) if (RTC_GetITStatus(RTC_IT_SEC) != RESET) /* Clear the RTC Second interrupt */ 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

26、update */ TimeDisplay = 1; /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* 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_WaitForL

27、astTask(); if(RTC_GetITStatus(RTC_IT_ALR)!=RESET) RTC_ClearITPendingBit(RTC_IT_ALR); printf(rn RTC alarm 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) * 描述 :微秒級(jí)延時(shí)n

28、32767 * 輸入 :無 * 輸出 :無 */void Delay_nus(u16 n)u16 j;while(n-)j=8;while(j-);/*/* * 函數(shù)名:Delay_nms(int16) * 描述 :毫秒級(jí)延時(shí)n32767 * 輸入 :無 * 輸出 :無 */void Delay_nms(u16 n)while(n-)Delay_nus(1100);/*嵌入式系統(tǒng)課程設(shè)計(jì)報(bào)告 * 文件名 :main.c* 描述 :利用STM32的RTC實(shí)現(xiàn)一個(gè)簡易的電子時(shí)鐘。在串口助手中顯示時(shí)間值。* 顯示格式為 Time: XX:XX:XX(時(shí):分:秒),當(dāng)時(shí)間* 計(jì)數(shù)為:23:59:59

29、時(shí)將刷新為:00:00:00。 * 另外還能設(shè)置鬧鐘*基于ARM的時(shí)鐘系統(tǒng)*/int main(void) /* config the sysclock to 72M */ SystemInit(); /* USART1 config */USART1_Config();/* 配置RTC秒中斷優(yōu)先級(jí) */NVIC_Configuration(); printf( rn This is a RTC demo. rn );GPIO_Configuration();if (BKP_ReadBackupRegister(BKP_DR1) != 0x5A5A) /* Backup data regist

30、er value is not correct or not yet programmed (when the first time the program 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_POR

溫馨提示

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

評(píng)論

0/150

提交評(píng)論