中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 對S3C2440裸板程序設計(無操作系統(tǒng))的抽象

        對S3C2440裸板程序設計(無操作系統(tǒng))的抽象

        作者: 時間:2016-11-22 來源:網絡 收藏
        嵌入式領域中,幾乎所有的設備控制和各種協(xié)議控制都在同一個嵌入式CPU當中,非常有利于對CPU Core和設備進行抽象。如果能對CPU Core和設備的各種控制進行抽象,人們在移植OS或者開發(fā)驅動程序時就沒有必要對CPU進行非常深入的了解,不必要了解某個寄存器的某個位是控制什么的,也沒有必要了解怎樣初始化某個控制寄存器等等。

        在利用控制器編寫裸板應用程序時,編程人員只需要了解該控制器的初始化順序以及初始化的內容而不需要了解初始化的具體細節(jié)就能完成應用程序。顯然可以大大的提高工作效率,并且對于硬件的具體細節(jié)設置是在應用程序中最容易出錯的地方,而利用控制器則可以大大的減少出錯的可能性。
        ARM是功能更加強大的單片機,在學習裸機程序設計的過程中,發(fā)現(xiàn)ARM比一般的單片機集成了更多的外設(一般的單片機只集成了串口,還有四組IO端口),包含更多的GPIO,有更多的寄存器,通過寄存器的設置和啟用來控制相關引腳,從而控制相關設備。S3C2440內部集成了硬件控制器,各種驅動協(xié)議用硬件控制器產生,我們只需配置對應硬件控制器的寄存器即可產生相應的驅動時序。 高端ARM學習以軟件編程為主(即理解為主),其資源豐富,很少需要需要擴展外設,學習重點在于如何配置寄存器以及如何編寫應用程序。

        本文引用地址:http://www.antipu.com.cn/article/201611/319966.htm

        設置相應的控制寄存器,讀寫相應的數(shù)據寄存器就可以。學習裸板程序開發(fā)的重點是理解各種接口協(xié)議的原理,這樣就可以很好的理解控制器的初始化順序以及初始化的內容。

        下面以S3C2440的I2C控制器為例來講解。下面的程序是基于中斷模式,I2C協(xié)議的講解可以查看我以前的博客。I2C協(xié)議中規(guī)定:接收器接收到一個字節(jié)(地址或數(shù)據)后,要發(fā)送一個ACK,發(fā)送器接收到ACK后可以接著發(fā)送數(shù)據或結束數(shù)據傳輸。接收器(這里我們是S3C2440的I2C控制器)收到ACK后會產生一個中斷,在中斷處理程序中可以繼續(xù)發(fā)送程序或者結束傳輸。理解了I2C協(xié)議的基本原理,編寫程序就水到渠成。

        [cpp]view plaincopy
        print?
        1. //===================================================================
        2. //SMDK2440IICconfiguration
        3. //GPE15=IICSDA,GPE14=IICSCL
        4. //"Interruptmode"forIICblock
        5. //===================================================================
        6. //******************[Test_Iic]**************************************
        7. voidTest_Iic(void)
        8. {
        9. unsignedinti,j,save_E,save_PE;
        10. staticU8data[256];
        11. Uart_Printf("nIICTest(Interrupt)usingAT24C08n");
        12. save_E=rGPECON;//保存以前的值
        13. rGPECON|=0xa00000;//GPE15:IICSDA,GPE14:IICSCL
        14. pISR_IIC=(unsigned)IicInt;//設置中斷處理函數(shù)
        15. rINTMSK&=~(BIT_IIC);//打開IIC中斷
        16. //EnableACK,PrescalerIICCLK=PCLK/16,Enableinterrupt,TransmitclockvalueTxclock=IICCLK/16
        17. //IfPCLK50.7MHz,IICCLK=3.17MHz,TxClock=0.198MHz
        18. rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);//第四位為1,SCL線被拉低,傳輸被中斷
        19. rIICADD=0x10;//2440slaveaddress=[7:1]
        20. rIICSTAT=0x10;//IICbusdataoutputenable(Rx/Tx)使能接收/發(fā)送功能
        21. rIICLC=(1<<2)|(1);//Filterenable,15clocksSDAoutputdelayaddedbyjunon
        22. Uart_Printf("WritetestdataintoAT24C08n");
        23. for(i=0;i<256;i++)
        24. Wr24C080(0xa0,(U8)i,i);
        25. for(i=0;i<256;i++)
        26. data[i]=0;
        27. Uart_Printf("ReadtestdatafromAT24C08n");
        28. for(i=0;i<256;i++)
        29. Rd24C080(0xa0,(U8)i,&(data[i]));
        30. //Linechanged0~f
        31. for(i=0;i<16;i++)
        32. {
        33. for(j=0;j<16;j++)
        34. Uart_Printf("%2x",data[i*16+j]);
        35. Uart_Printf("n");
        36. }
        37. rINTMSK|=BIT_IIC;
        38. rGPECON=save_E;
        39. }
        40. //*************************[Wr24C080]****************************
        41. voidWr24C080(U32slvAddr,U32addr,U8data)
        42. {
        43. _iicMode=WRDATA;
        44. _iicPt=0;
        45. _iicData[0]=(U8)addr;
        46. _iicData[1]=data;
        47. _iicDataCount=2;
        48. rIICDS=slvAddr;//0xa0
        49. rIICSTAT=0xf0;//MasTx,Start主機發(fā)送器發(fā)出S信號
        50. //Clearingthependingbitisntneededbecausethependingbithasbeencleared.
        51. while(_iicDataCount!=-1);//等待數(shù)據數(shù)據發(fā)送完畢
        52. //開始一次新的傳輸,不過只發(fā)送設備地址,等待應答,以證明上次傳輸完成。而下次Wr24C080的時候會重新開始,這次的傳輸并沒有寫入數(shù)據
        53. _iicMode=POLLACK;
        54. while(1)
        55. {
        56. rIICDS=slvAddr;
        57. _iicStatus=0x100;
        58. rIICSTAT=0xf0;//MasTx,Start
        59. rIICCON=0xaf;//ResumesIICoperation.
        60. while(_iicStatus==0x100);//等待數(shù)據數(shù)據發(fā)送完畢,狀態(tài)寄存器改變了就可以了
        61. if(!(_iicStatus&0x1))//接收到的最后一位為0(接收到ACK信號)
        62. break;//WhenACKisreceived判斷最后一位的狀態(tài)
        63. }
        64. rIICSTAT=0xd0;//StopMasTxcondition
        65. rIICCON=0xaf;//ResumesIICoperation.
        66. Delay(1);//Waituntilstopcondtionisineffect.
        67. //Writeiscompleted.
        68. }
        69. //**********************[Rd24C080]***********************************
        70. voidRd24C080(U32slvAddr,U32addr,U8*data)
        71. {
        72. _iicMode=SETRDADDR;
        73. _iicPt=0;
        74. _iicData[0]=(U8)addr;
        75. _iicDataCount=1;
        76. rIICDS=slvAddr;
        77. rIICSTAT=0xf0;//MasTx,Start
        78. //Clearingthependingbitisntneededbecausethependingbithasbeencleared.
        79. while(_iicDataCount!=-1);
        80. _iicMode=RDDATA;
        81. _iicPt=0;
        82. _iicDataCount=1;
        83. rIICDS=slvAddr;
        84. rIICSTAT=0xb0;//MasRx,Start
        85. rIICCON=0xaf;//ResumesIICoperation.
        86. while(_iicDataCount!=-1);
        87. *data=_iicData[1];
        88. }
        89. //-------------------------------------------------------------------------
        90. void__irqIicInt(void)
        91. {
        92. U32iicSt,i;
        93. rSRCPND=BIT_IIC;//Clearpendingbit
        94. rINTPND=BIT_IIC;
        95. iicSt=rIICSTAT;
        96. if(iicSt&0x8){}//Whenbusarbitrationisfailed.
        97. if(iicSt&0x4){}//WhenaslaveaddressismatchedwithIICADD
        98. if(iicSt&0x2){}//Whenaslaveaddressis0000000b
        99. if(iicSt&0x1){}//WhenACKisntreceived
        100. switch(_iicMode)
        101. {
        102. casePOLLACK:
        103. _iicStatus=iicSt;
        104. break;
        105. caseRDDATA:
        106. if((_iicDataCount--)==0)
        107. {
        108. _iicData[_iicPt++]=rIICDS;
        109. rIICSTAT=0x90;//StopMasRxcondition
        110. rIICCON=0xaf;//ResumesIICoperation.
        111. Delay(1);//Waituntilstopcondtionisineffect.
        112. //Toolongtime...
        113. //Thependingbitwillnotbesetafterissuingstopcondition.
        114. break;
        115. }
        116. _iicData[_iicPt++]=rIICDS;//Thelastdatahastobereadwithnoack.
        117. if((_iicDataCount)==0)
        118. rIICCON=0x2f;//ResumesIICoperationwithNOACK.
        119. else
        120. rIICCON=0xaf;//ResumesIICoperationwithACK
        121. break;
        122. caseWRDATA:
        123. if((_iicDataCount--)==0)
        124. {
        125. rIICSTAT=0xd0;//StopMasTxcondition
        126. rIICCON=0xaf;//ResumesIICoperation.
        127. Delay(1);//Waituntilstopcondtionisineffect.
        128. //Thependingbitwillnotbesetafterissuingstopcondition.
        129. break;
        130. }
        131. rIICDS=_iicData[_iicPt++];//_iicData[0]hasdummy.
        132. for(i=0;i<10;i++);//forsetuptimeuntilrisingedgeofIICSCL
        133. rIICCON=0xaf;//resumesIICoperation.
        134. break;
        135. caseSETRDADDR:
        136. //Uart_Printf("[S%d]",_iicDataCount);
        137. if((_iicDataCount--)==0)
        138. break;//IICoperationisstoppedbecauseofIICCON[4]
        139. rIICDS=_iicData[_iicPt++];
        140. for(i=0;i<10;i++);//ForsetuptimeuntilrisingedgeofIICSCL
        141. rIICCON=0xaf;//ResumesIICoperation.
        142. break;
        143. default:
        144. break;
        145. }
        146. }



        評論


        技術專區(qū)

        關閉