s3c6410裸机程序(1)
嘿嘿,今天在博客園注冊了新用戶,來記錄我的嵌入式學習流程,把自己的心得體會,教訓經驗,全部寫出來,一來可以加深自己的印象,二來寫出來讓博客園中的高手看到,也可以給我批評指正哦 。@_@
以前實際上算的上是基本沒有接觸過嵌入式方面的東西,只是在以前學習過8位的單片機,可簡單的東西哦!然后學過8086,80386的匯編語言編程和c語言以及windows的圖形界面程序,所以這個飛凌的ok6410開發板拿到手以后真的覺得很陌生呢!都不知道怎么下手??戳丝措S板附帶的視頻和工具,大致有了一個了解。自己用一鍵燒寫工具燒寫了wince,linux,android系統,總算是有了一點點成就感了。當然了,不能停留在這個上面啦,本來安裝了linux系統以后就可以用交叉編譯工具編寫c語言程序了,但是覺得沒有意思啊,那樣不是和pc機上寫c語言大同小異了嗎?于是我決定還是先寫寫裸機程序,熟悉一下ARM匯編語言和硬件吧!
第一個程序當然要挑選簡單的寫哦,熟悉了一下GPIO,會了簡單的輸入輸出,就可以寫一個流水燈了呢!那么GPIO是個什么東東呢?記得在pc機上,
cpu是不能直接連接外設的喲,要通過相應的設備控制器,為什么要設備控制器呢?設備控制器就是cpu和外設通訊的接口,充當的是翻譯員的工作哦,接口上有接口寄存器,cpu通過操作寄存器就可以操作外設了,就可以不用直接向外設的引腳寫1和0了,簡化了編程的難度哦!GPIO就是ARM上的一個設備控制器,諸如LED、BUZZER、KEYPAD都是連接在GPIO上面的呢!我的第一個程序,就是通過GPIO實現按鍵驅動LED燈和蜂鳴器。
操作GPIO必須要查看s3c6410的用戶手冊哦,沒有這個可是不行的呢!當然筆者的英語也很差,能看懂的不到50%,但是對于現在來說,能看懂50%就夠了哦,以后用到的東西,以后再說吧!@_@
GPIO一共187ge引腳,分為17組,每組的引腳數并不是相同的,LED燈連接在GPM0到GPM3這四個引腳上,這是從哪里看來的呢?是從電路圖上哦,而且從電路圖上可以看出這個LED燈是低電平亮哦!蜂鳴器呢?它是接在GPF15上哦,而且是高電平響哦,至于KeyPad,六個鍵分別占用了GPN0到GPN5,地點平有效。
? ? ?
現在我知道了我要操作的設備連在GPIO的哪個引腳上,那么我怎么來操作這些引腳呢?當然是用寄存器啦!去s3c6410的cpu手冊中查看GPIO這一章節,就可以知道GPM,GPN,GPF分別的寄存器地址。我用到的寄存器有GPxCON和GPxDAT,首先要用GPxCON來配置引腳的功能,是用作輸入、或者是輸出。我把GPM0到GPM4配置為輸出,把GPF15配置為輸出,把GPN0到GPN5配置為輸入,現在,就可以開始我們的主流程了喲!
那么還要解決一個很重要的問題,那就是程序的基本結構。到底這個程序怎樣組織呢?這里,我用了最簡單的方法,那就是cpu反復查詢的方法,在一個whie死循環中,cpu不斷的檢查是否有按鍵,然后去設置LED燈或者是蜂鳴器。其實這是不可取的呢!因為這樣會非常耗費cpu的,那么用什么最好呢?當然是中斷啦!可是,第一個程序嘛!就先來個簡單的啦!O(∩_∩)O~
首先是一段匯編:
?? ???? IMPORT?? ?main
?? ??? ?
?? ??? ?AREA?? ?Init, CODE, READONLY
?? ??? ?CODE32
?? ??? ?ENTRY
start
?? ??? ?b?? ??? ?main
?? ??? ?
?? ??? ?END
為什么首先要有一段匯編呢?因為c編譯器編出的程序是有一段頭部的,在沒有操作系統的情況下是不能正常運行的,所以一段匯編,直接跳到main函數處,這樣就可以正常運行了哦!
然后是c語言程序啦!
#define rGPMCON (*(volatile unsigned int *)(0x7F008820))
#define rGPMDAT (*(volatile unsigned int *)(0x7F008824))
#define rGPMPUD (*(volatile unsigned int *)(0x7F008828))
#define rGPFCON?? ?(*(volatile unsigned int *)(0x7F0080A0))
#define rGPFDAT?? ?(*(volatile unsigned int *)(0x7F0080A4))
#define rGPFPUD?? ?(*(volatile unsigned int *)(0x7F0080A8))
#define rGPNCON?? ?(*(volatile unsigned int *)(0x7F008830))
#define rGPNDAT?? ?(*(volatile unsigned int *)(0x7F008834))
#define rGPNPUD?? ?(*(volatile unsigned int *)(0x7F008838))
void GPIO_Init(void);
void TestPad(void);
int main(void)
{
?? ?GPIO_Init();
?? ?TestPad();?? ?
}
void GPIO_Init(void)
{
?? ?unsigned int tmp;
?? ?
?? ?/* Init Led regs */
?? ?tmp &= ~(0xFFFF);
?? ?tmp |= 0x1111;
?? ?rGPMCON = tmp;
?? ?rGPMPUD &= ~0xFF;
?? ?rGPMDAT |= 0xF;
?? ?/* Init Buzzer regs */
?? ?rGPFCON &= ~(0x1 << 31);
?? ?rGPFCON |= 0x1 << 30;
?? ?rGPFPUD &= ~(0x3 << 30);
?? ?rGPFDAT &= ~(0x1 << 15);
?? ?/* Init Keypad regs */
?? ?rGPNCON &= ~0xFFF;
?? ?rGPNPUD &= ~0xFFF;
}
void TestPad(void)
{
?? ?unsigned int KeyInput;
?? ?
?? ?while (1)
?? ?{
?? ??? ?KeyInput = 0;
?? ??? ?KeyInput = rGPNDAT;
?? ??? ?KeyInput &= 0x3F;
?? ??? ?
?? ??? ?if ( (KeyInput & 1) == 0)?? /* == 比 & 的優先級要高 */
?? ??? ?{
?? ??? ??? ?rGPMDAT |= 0xF;
?? ??? ??? ?rGPMDAT &= ~0x1;
?? ??? ?}
?? ??? ??? ??? ?
?? ??? ?else if ( (KeyInput & 2) == 0)
?? ??? ?{
?? ??? ??? ?rGPMDAT |= 0xF;
?? ??? ??? ?rGPMDAT &= ~0x2;
?? ??? ?}
?? ??? ?else if ( (KeyInput & 4) == 0)?? ?
?? ??? ?{
?? ??? ??? ?rGPMDAT |= 0xF;
?? ??? ??? ?rGPMDAT &= ~0x4;
?? ??? ?}
?? ??? ?else if ( (KeyInput & 8) == 0)
?? ??? ?{
?? ??? ??? ?rGPMDAT |= 0xF;
?? ??? ??? ?rGPMDAT &= ~0x8;
?? ??? ?}
?? ??? ??? ??? ?
?? ??? ?else if ( (KeyInput & 16) == 0)
?? ??? ?{
?? ??? ??? ?rGPFDAT |= (0x1 << 15);
?? ??? ?}
?? ??? ??? ?
?? ??? ?else if ( (KeyInput & 32) == 0)
?? ??? ?{
?? ??? ??? ?rGPFDAT &= ~(0x1 << 15);
?? ??? ?}
?? ?}
}
好了,寫完了,現在可以通過dnw軟件和usb OTG接口將程序下載到RAM中運行了,我用的是JLINK下載,因為這樣可以單步調試哦!
今天就到此為止了,等把中斷寫好了在更新博客。
?
?
?
?
轉載于:https://www.cnblogs.com/ydyhhgxx/archive/2012/03/12/2392594.html
總結
以上是生活随笔為你收集整理的s3c6410裸机程序(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算任意两个数之间1出现的次数的思维过程
- 下一篇: 3月上旬我国域名增长平稳 新增92059