新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 2440裸機學習心得(上)

        2440裸機學習心得(上)

        作者: 時間:2016-11-29 來源:網絡 收藏
        哎,以前總想裸機加系統一齊學,學著學著發現好混亂,D驅動~~然后又重新齋跑2440的裸機。以下系少少心得,記錄下學習過程。
        里面有三個地方還沒弄好:1、 硬盤的文件系統 FAT部分(后面有空補補)
        2、 NORFLASH中的讀寫有點問題
        3、 USB主機中對U盤的UFI命令
        有什么問題歡迎一起交流。以下是部分心得:
        LED
        GPXCON中每兩位控制一個引腳:00輸入,01輸出,10特殊功能
        初始化 rGPBCON , rGPBUP ,rGPBDAT三個寄存器
        關于ADS配置的解釋:
        在Target Settings中的Post-linker中選擇ARM fromELF,因為我們需要把ELF文件格式轉化為下載到flash中所必須的二進制文件。
        在Language Settings中的所有語言的Target下的Architecture or Processor,選擇ARM920T,因為s3c2440是ARM920T內核。
        在ARM Linker中的Output中的RO Base填寫0x30000000,因為在開發板上SDRAM是從0x30000000地址開始。在Layout中的Object/Symbol中填寫2440init.o,它是啟動文件的目標文件,在Section中填寫Init,它是在啟動文件中我們所定義的入口代碼段的名稱。
        外部中斷
        我們要打開某一中斷的屏蔽,這樣才能響應該中斷,相對應的寄存器為INTMSK;
        還要設置外部中斷的觸發方式,如低電平、高電平、上升沿、下降沿等,相對應的寄存器為EXTINTn。
        另外由于EINT4到EINT7共用一個中斷向量,EINT8到EINT23也共用一個中斷向量,而INTMSK只負責總的中斷向量的屏蔽,要具體打開某一具體的中斷屏蔽,還需要設置EINTMASK。
        有一些中斷是共用一個中斷向量的,而一個中斷向量只能有一個中斷執行函數,因此具體是哪個外部中斷,還需要EINTPEND或rINTOFFSET來判斷
        使用__irq這個關鍵詞來定義中斷處理函數,這樣系統會為我們自動保存一些必要的變量,并能夠在中斷處理函數執行完后正確地返回
        這種形式:void __irq key(); pISR_EINT0=(int)key;
        定時器使用
        主要配置:外部時鐘源→通過寄存器MPLLCON得到FCLK→再通過寄存器CLKDIVN得到HCLK和PCLK->再得到定時器的工作頻率
        PWM定時器使用:
        蜂鳴器=GPB0=TOUT0=定時器0
        蜂鳴器高電平響,低電平不響
        關鍵是設置寄存器TCNTBn和TCMPBn,前者可以確定一個計數周期的時間長度,而后者可以確定方波的占空比
        定時器中斷使用:
        不需要配置TCMPBn,只需TCNTBn,TCNTBn*1/定時器的工作頻率=定時的時間
        但要記住中斷要:
        void __irq timer0_sever();
        pISR_TIMER0=(int)timer0_sever;
        rINTMSK =~BIT_TIMER0;
        Uart
        主要配置以下寄存器:
        UBRDIVn,UCONn,UTRSTATn
        收發寄存器: UTXHn,URXHn
        注意幾點:
        1.對于s3c2440來說,接收數據是被動的,發送數據是主動的,因此一般來說,接收數據用中斷方式,發送數據用查詢方式較好;
        2.在中斷方式下,當接收到數據時,盡管可能該數據無用,但也一定要讀取它,否則下次再接收數據時,不會再引起中斷,因為接收數據緩存器被上次接收到的數據所霸占,只要沒有讀取它,它就永遠在那里;
        3.由于UART中斷涉及到SUBSRCPND寄存器,因此在中斷處理程序中不僅要清SRCPND寄存器,還要清SUBSRCPND寄存器,它們的順序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否則就會引起一個中斷兩次響應的問題。因為是否中斷由SRCPND寄存器決定,而SRCPND寄存器的相關狀態位由SUBSRCPND寄存器決定
        簡單的串口控制臺:1.鍵盤輸入數據后在控制臺上進行回顯
        recv_data = uart_getc();
        return recv_data;
        2.讓接收的字符組成命令data_buf[i] = uart0_scanf();
        if(data_buf[i] == 主站蜘蛛池模板: 武鸣县| 安宁市| 陇南市| 博白县| 罗山县| 嘉鱼县| 桐乡市| 蒙阴县| 桦川县| 台山市| 新巴尔虎左旗| 东方市| 滨海县| 申扎县| 高碑店市| 桐城市| 宜丰县| 岳阳县| 蕉岭县| 黑水县| 保靖县| 阆中市| 平远县| 西峡县| 绍兴县| 德惠市| 普洱| 深水埗区| 岚皋县| 中牟县| 五常市| 江源县| 武山县| 东乌| 确山县| 岐山县| 瓦房店市| 安乡县| 乌鲁木齐县| 广水市| 湾仔区|