使用timer0中斷,將LED燈閃爍
Init.c
/*
* init.c: 進行一些初始化
*/
#include "s3c24xx.h"
void disable_watch_dog(void);
void clock_init(void);
void memsetup(void);
void copy_steppingstone_to_sdram(void);
void init_led(void);
void timer0_init(void);
void init_irq(void);
void delay(int n)
{
int i;
for(i=0;i } /* * 關閉WATCHDOG,否則CPU會不斷重啟 */ void disable_watch_dog(void) { // 關閉WATCHDOG很簡單,往WTCON寄存器寫0即可 WTCON = 0; } #define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00)) #define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02)) /* * 對于MPLLCON寄存器,[19:12]為MDIV,[9:4]為PDIV,[1:0]為SDIV * 有如下計算公式: * S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s) * S3C2410: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s) * 其中: m = MDIV + 8, p = PDIV + 2, s = SDIV * 對于本開發板,Fin = 12MHz * 設置CLKDIVN,令分頻比為:FCLK:HCLK:PCLK=1:2:4, * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ void clock_init(void) { // LOCKTIME = 0x00ffffff; // 使用默認值即可 CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1 /* 如果HDIVN非0,CPU的總線模式應該從“fast bus mode”變為“asynchronous bus mode” */ __asm__( "mrc p15, 0, r1, c1, c0, 0n" /* 讀出控制寄存器 */ "orr r1, r1, #0xc0000000n" /* 設置為“asynchronous bus mode” */ "mcr p15, 0, r1, c1, c0, 0n" /* 寫入控制寄存器 */ ); /* 判斷是S3C2410還是S3C2440 */ if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002)) { MPLLCON = S3C2410_MPLL_200MHZ; /* 現在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ } else { MPLLCON = S3C2440_MPLL_200MHZ; /* 現在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */ } } /* * 設置存儲控制器以使用SDRAM */ void memsetup(void) { volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE; /* 這個函數之所以這樣賦值,而不是像前面的實驗(比如mmu實驗)那樣將配置值 * 寫在數組中,是因為要生成”位置無關的代碼”,使得這個函數可以在被復制到 * SDRAM之前就可以在steppingstone中運行 ,steppingstone是在S3C2440 中,實際上是一塊4k大小的SRAM */ /* 存儲控制器13個寄存器的值 */ p[0] = 0x22011110; //BWSCON p[1] = 0x00000700; //BANKCON0 p[2] = 0x00000700; //BANKCON1 p[3] = 0x00000700; //BANKCON2 p[4] = 0x00000700; //BANKCON3 p[5] = 0x00000700; //BANKCON4 p[6] = 0x00000700; //BANKCON5 p[7] = 0x00018005; //BANKCON6 p[8] = 0x00018005; //BANKCON7 /* REFRESH, * HCLK=12MHz: 0x008C07A3, * HCLK=100MHz: 0x008C04F4 */ p[9] = 0x008C04F4; p[10] = 0x000000B1; //BANKSIZE p[11] = 0x00000030; //MRSRB6 p[12] = 0x00000030; //MRSRB7 } void copy_steppingstone_to_sdram(void) { unsigned int *pdwSrc = (unsigned int *)0; unsigned int *pdwDest = (unsigned int *)0x30000000; while (pdwSrc < (unsigned int *)4096) { *pdwDest = *pdwSrc; pdwDest++; pdwSrc++; } } #define GPFCON (*(volatile unsigned long *)0x56000050) #define GPF4_out (1<<(4*2)) #define GPF5_out (1<<(5*2)) #define GPF6_out (1<<(6*2)) /* * K1-K4對應GPG11、GPG3、GPF2、GPF3 */ #define GPG11_eint (2<<(11*2)) // K1,EINT19 #define GPG3_eint (2<<(3*2)) // K2,EINT11 #define GPF3_eint (2<<(3*2)) // K3,EINT3 #define GPF2_eint (2<<(2*2)) // K4,EINT2 void init_led(void) { GPFCON = GPF4_out|GPF5_out|GPF6_out; // 將LED1,2,4對應的GPF4/5/6三個引腳設為輸出 } /* * Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value} * {prescaler value} = 0~255 * {divider value} = 2, 4, 8, 16 * 本實驗的Timer0的時鐘頻率=100MHz/(99+1)/(16)=62500Hz * 設置Timer0 0.5秒鐘觸發一次中斷: */ void timer0_init(void) { // 預分頻器0 = 99 TCFG0 &= ~0xFF; TCFG0 |= 0x63; // 選擇16分頻 TCFG1 &= ~0x0F; TCFG1 |= 0x03; // 0.5秒鐘觸發一次中斷 TCNTB0 = 15625;//設定的計數 次數 遞減 TCMPB0 = 0;//比較,減到這個數 // 手動更新 TCON &= ~(1<<1); TCON |= 1<<1; // 自動加載,清“手動更新”位,啟動定時器0 //TCON &= ~0X03; //TCON |= 0x01; //TCON |= (3<<0); TCON &= ~(1<<1);//清“手動更新”位 TCON |=(1<<3);//自動加載 TCON |=(1<<0);//啟動定時器0 } /* * 定時器0中斷使能 */ void init_irq(void) { // 定時器0中斷使能,INTMSK INTMSK &= ~ (1<<10);//中斷屏蔽寄存器 } Interrupt.c #include "s3c24xx.h" int flag=0; void Timer0_Handle(void) { /* * 每次中斷令4個LED改變狀態 */ unsigned long oft = INTOFFSET;//讀取中斷偏移量 //成功的 if(oft==10)//根據偏移量,判斷是不是timer0中斷 { if(flag==0) { GPFDAT &= ~(1<<4|1<<5|1<<6);//亮燈 flag=1; } else { GPFDAT |= (1<<4|1<<5|1<<6);//關燈 flag=0; } SRCPND=SRCPND; INTPND=INTPND; //SRCPND &= ~(1<<10); //INTPND &= ~(1<<10); //SRCPND = 0; //INTPND = 0; } }
上一篇:存儲-SDRAM
下一篇:S3C2440開發板上BMP圖片的顯示之三
推薦閱讀
史海拾趣
近年來,隨著數字化和智能化的快速發展,Eurotechnique也加快了數字化轉型和智能化升級的步伐。公司投入大量資金和資源,引進先進的數字化生產線和智能化設備,提高生產效率和產品質量。同時,Eurotechnique還加強了與互聯網、大數據等新技術領域的合作,推動公司的數字化轉型和智能化升級。這些努力使得Eurotechnique在競爭激烈的電子行業中保持了領先地位。
隨著技術的不斷成熟和市場的逐步擴大,動運科技開始將目光投向國際市場。公司先后在深圳、上海、美國、日本和臺灣等地設立了研發或分公司與辦事處,形成了全球化的研發和銷售網絡。通過與全球知名企業的合作,動運科技的產品逐漸進入了智能手機、LED照明、物聯網等多個領域,并取得了顯著的業績。
為了進一步擴大市場份額,BETA Transformer Technology Corp公司開始實施國際化戰略。公司積極參加國際電子展覽,與國際同行進行深入交流與合作。同時,BETA公司還在海外設立了研發中心和生產基地,以便更好地服務全球客戶。通過不斷拓展國際市場,BETA公司的品牌影響力和市場競爭力得到了顯著提升。
隨著業務的不斷發展,Aten International開始積極拓展全球市場。通過與國際知名企業的合作,Aten International成功將其產品和服務推廣至全球各地。同時,公司還設立了多個海外分支機構和辦事處,以便更好地服務全球客戶。這一舉措不僅提升了Aten International的品牌影響力,也為公司的持續發展奠定了堅實基礎。
在全球能源危機和環保意識日益增強的背景下,綠色能源成為了電子行業的一大發展趨勢。Aten International積極響應環保號召,研發出了一系列綠色能源解決方案,包括智能型電源分配器和節能感測軟件等。這些產品不僅能夠有效降低能源消耗,還能提供實時的能源管理與效能指標,為企業實現綠色生產提供了有力支持。
1994年,AMOTECH在韓國創立,憑借創始人的遠見卓識和技術團隊的扎實能力,公司迅速在電子行業中嶄露頭角。經過兩年的努力,1996年,AMOTECH被政府通訊部評為“光明前途企業”,這是對其技術實力和市場潛力的肯定。隨后,公司不斷加大研發投入,終于在2000年獲得ISO9000認證,這標志著AMOTECH在產品質量管理上達到了國際標準。
尊敬的工程師們: 如何在設計中平衡功耗與性能?如何將設計變得更簡捷?如何幫助產品更快地投入市場?對工程師而言,這一切都是設計工作中實實在的難題。 &nbs ...… 查看全部問答∨ |
|
目前狀態:英文版環境運行正常; 問題定義:建立evc的中文虛擬編譯環境 做過的措施: 1.下載Chinese (Simplified) Emulation Images.msi包,并安裝; 2.project->setting->Resources:"中文"; 未果。 問題猜測:SDK漢化,或其 ...… 查看全部問答∨ |
|
我想使用ril.lib庫達到短信攔截的效果,但是在Notify函數被回調的時候,短信已經進入到了系統收件箱中,并且彈出了短信到達提示。請問有沒有辦法能在短信到達后刪掉該信息,不讓短信進入系統收件箱?(不使用MAPIRULE)謝謝… 查看全部問答∨ |
|
達人給講一下軟件加密的整體流程, 然后我最關心的是序列號是怎么產生的? 因為一般用軟件注冊的話,輸個序列號以及注冊碼(注冊碼一般由輸入的序列號以及硬件碼運算而得來的), 但問題是這個序列號是怎么得出來的,怎么驗證序列號的有效性,去 ...… 查看全部問答∨ |
|
WinCE下的ListView Control和WIN32相較,有個明顯的不同就是長按觸摸屏或長按鼠標左鍵,會繪制一個小圓圈.這個小圓圈比較有意思,微軟的explorer在實現時,圓圈消失即相當于win32的按下鼠標右鍵.這個方法很好的彌補了觸摸屏無法表示右鍵的缺陷,我看很多 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- TI教室全新導航讓查看更簡單!填問卷送好禮啦!
- MPS e-store清空購物車2020
- ADI有獎直播:儲能系統助力電動汽車快充站的建設 8月31日上午10:00-11:30 為您揭曉!
- 打卡英飛凌碳化硅MOSFET新品快閃店
- 【TI 教室】學電源,曬成績,挖樓有禮!
- PI HiperPFS-4系列功率因數校正IC,了解產品特色,答題享好禮!
- OMNIMATE® 4.0鼠籠式板載連接器
- 看是德科技汽車電子精彩專題,為你的出行安全打call, 下載贏好禮!
- 安全的革新,全新的驗證方式 下載富士通 《頻譜驗證解決方案 》白皮書 好禮送!
- 嵌入式工程師AI挑戰營(進階):基于RV1106部署InsightFace算法,實現多人的實時人臉識別