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

下載本文檔

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

文檔簡(jiǎn)介

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語(yǔ)言進(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ù)器,可用于長(zhǎng)程時(shí)間段的測(cè)量。(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è)專門(mén)的可屏蔽中斷:鬧鐘中斷,用來(lái)產(chǎn)生一個(gè)軟件可編程的鬧鐘中斷。秒中斷,用來(lái)產(chǎn)生一個(gè)可編程的周期性中斷信號(hào)(最長(zhǎng)可達(dá)1s)。溢出中斷,檢測(cè)內(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ì)的鬧鐘提醒電路沒(méi)有采用蜂鳴器,為了調(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ì)通過(guò)這次時(shí)鐘的設(shè)計(jì),使我對(duì)arm有了更深的理解。剛開(kāi)始拿到題提目,我先是查找相關(guān)資料,從圖書(shū)館和網(wǎng)上找到相關(guān)的課題,參考借鑒別

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

11、部調(diào)用 */void gpio_configuration(void)/*定義一個(gè)gpio_inittypedef類型的結(jié)構(gòu)體*/gpio_inittypedef gpio_initstructure;/*開(kāi)啟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)用庫(kù)函數(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 * 輸入 :無(wú) * 輸出 :無(wú) * 調(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ù)寄存器中。 * 輸入 :無(wú) * 輸出 :用戶在超級(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é) * 輸入 :無(wú) * 輸出 :無(wú) * 調(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 * 輸出 :無(wú) * 調(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í)間值 * 輸入 :無(wú) * 輸出 :無(wú) * 調(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ù)值 * 輸出 :無(wú) * 調(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) 待添加的隱藏文字內(nèi)容2 /* 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); /*

26、enable time 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 */

27、rtc_waitforlasttask(); 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)

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

29、數(shù)為:23:59:59 時(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

30、 data register 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_

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論