2440裸機(jī)學(xué)習(xí)心得(上)
里面有三個(gè)地方還沒弄好:1、 硬盤的文件系統(tǒng) FAT部分(后面有空補(bǔ)補(bǔ))
2、 NORFLASH中的讀寫有點(diǎn)問題
3、 USB主機(jī)中對U盤的UFI命令
有什么問題歡迎一起交流。以下是部分心得:
LED
GPXCON中每兩位控制一個(gè)引腳:00輸入,01輸出,10特殊功能
初始化 rGPBCON , rGPBUP ,rGPBDAT三個(gè)寄存器
關(guān)于ADS配置的解釋:
在Target Settings中的Post-linker中選擇ARM fromELF,因?yàn)槲覀冃枰袳LF文件格式轉(zhuǎn)化為下載到flash中所必須的二進(jìn)制文件。
在Language Settings中的所有語言的Target下的Architecture or Processor,選擇ARM920T,因?yàn)閟3c2440是ARM920T內(nèi)核。
在ARM Linker中的Output中的RO Base填寫0x30000000,因?yàn)樵陂_發(fā)板上SDRAM是從0x30000000地址開始。在Layout中的Object/Symbol中填寫2440init.o,它是啟動(dòng)文件的目標(biāo)文件,在Section中填寫Init,它是在啟動(dòng)文件中我們所定義的入口代碼段的名稱。
外部中斷
我們要打開某一中斷的屏蔽,這樣才能響應(yīng)該中斷,相對應(yīng)的寄存器為INTMSK;
還要設(shè)置外部中斷的觸發(fā)方式,如低電平、高電平、上升沿、下降沿等,相對應(yīng)的寄存器為EXTINTn。
另外由于EINT4到EINT7共用一個(gè)中斷向量,EINT8到EINT23也共用一個(gè)中斷向量,而INTMSK只負(fù)責(zé)總的中斷向量的屏蔽,要具體打開某一具體的中斷屏蔽,還需要設(shè)置EINTMASK。
有一些中斷是共用一個(gè)中斷向量的,而一個(gè)中斷向量只能有一個(gè)中斷執(zhí)行函數(shù),因此具體是哪個(gè)外部中斷,還需要EINTPEND或rINTOFFSET來判斷
使用__irq這個(gè)關(guān)鍵詞來定義中斷處理函數(shù),這樣系統(tǒng)會(huì)為我們自動(dòng)保存一些必要的變量,并能夠在中斷處理函數(shù)執(zhí)行完后正確地返回
這種形式:void __irq key(); pISR_EINT0=(int)key;
定時(shí)器使用
主要配置:外部時(shí)鐘源→通過寄存器MPLLCON得到FCLK→再通過寄存器CLKDIVN得到HCLK和PCLK->再得到定時(shí)器的工作頻率
PWM定時(shí)器使用:
蜂鳴器=GPB0=TOUT0=定時(shí)器0
蜂鳴器高電平響,低電平不響
關(guān)鍵是設(shè)置寄存器TCNTBn和TCMPBn,前者可以確定一個(gè)計(jì)數(shù)周期的時(shí)間長度,而后者可以確定方波的占空比
定時(shí)器中斷使用:
不需要配置TCMPBn,只需TCNTBn,TCNTBn*1/定時(shí)器的工作頻率=定時(shí)的時(shí)間
但要記住中斷要:
void __irq timer0_sever();
pISR_TIMER0=(int)timer0_sever;
rINTMSK =~BIT_TIMER0;
Uart
主要配置以下寄存器:
UBRDIVn,UCONn,UTRSTATn
收發(fā)寄存器: UTXHn,URXHn
注意幾點(diǎn):
1.對于s3c2440來說,接收數(shù)據(jù)是被動(dòng)的,發(fā)送數(shù)據(jù)是主動(dòng)的,因此一般來說,接收數(shù)據(jù)用中斷方式,發(fā)送數(shù)據(jù)用查詢方式較好;
2.在中斷方式下,當(dāng)接收到數(shù)據(jù)時(shí),盡管可能該數(shù)據(jù)無用,但也一定要讀取它,否則下次再接收數(shù)據(jù)時(shí),不會(huì)再引起中斷,因?yàn)榻邮諗?shù)據(jù)緩存器被上次接收到的數(shù)據(jù)所霸占,只要沒有讀取它,它就永遠(yuǎn)在那里;
3.由于UART中斷涉及到SUBSRCPND寄存器,因此在中斷處理程序中不僅要清SRCPND寄存器,還要清SUBSRCPND寄存器,它們的順序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否則就會(huì)引起一個(gè)中斷兩次響應(yīng)的問題。因?yàn)槭欠裰袛嘤蒘RCPND寄存器決定,而SRCPND寄存器的相關(guān)狀態(tài)位由SUBSRCPND寄存器決定
簡單的串口控制臺(tái):1.鍵盤輸入數(shù)據(jù)后在控制臺(tái)上進(jìn)行回顯
recv_data = uart_getc();
return recv_data;
2.讓接收的字符組成命令data_buf[i] = uart0_scanf();
if(data_buf[i] ==