<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/319966.htm

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

          下面以S3C2440的I2C控制器為例來講解。下面的程序是基于中斷模式,I2C協(xié)議的講解可以查看我以前的博客。I2C協(xié)議中規(guī)定:接收器接收到一個字節(jié)(地址或數(shù)據(jù))后,要發(fā)送一個ACK,發(fā)送器接收到ACK后可以接著發(fā)送數(shù)據(jù)或結(jié)束數(shù)據(jù)傳輸。接收器(這里我們是S3C2440的I2C控制器)收到ACK后會產(chǎn)生一個中斷,在中斷處理程序中可以繼續(xù)發(fā)送程序或者結(jié)束傳輸。理解了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è)置中斷處理函數(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ù)據(jù)數(shù)據(jù)發(fā)送完畢
          52. //開始一次新的傳輸,不過只發(fā)送設(shè)備地址,等待應(yīng)答,以證明上次傳輸完成。而下次Wr24C080的時候會重新開始,這次的傳輸并沒有寫入數(shù)據(jù)
          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ù)據(jù)數(shù)據(jù)發(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. }



          關(guān)鍵詞: S3C2440裸板程序無操作系

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();