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

          新聞中心

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

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

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

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

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

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

          下面以S3C2440的I2C控制器為例來(lái)講解。下面的程序是基于中斷模式,I2C協(xié)議的講解可以查看我以前的博客。I2C協(xié)議中規(guī)定:接收器接收到一個(gè)字節(jié)(地址或數(shù)據(jù))后,要發(fā)送一個(gè)ACK,發(fā)送器接收到ACK后可以接著發(fā)送數(shù)據(jù)或結(jié)束數(shù)據(jù)傳輸。接收器(這里我們是S3C2440的I2C控制器)收到ACK后會(huì)產(chǎn)生一個(gè)中斷,在中斷處理程序中可以繼續(xù)發(fā)送程序或者結(jié)束傳輸。理解了I2C協(xié)議的基本原理,編寫(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);//打開(kāi)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主機(jī)發(fā)送器發(fā)出S信號(hào)
          50. //Clearingthependingbitisntneededbecausethependingbithasbeencleared.
          51. while(_iicDataCount!=-1);//等待數(shù)據(jù)數(shù)據(jù)發(fā)送完畢
          52. //開(kāi)始一次新的傳輸,不過(guò)只發(fā)送設(shè)備地址,等待應(yīng)答,以證明上次傳輸完成。而下次Wr24C080的時(shí)候會(huì)重新開(kāi)始,這次的傳輸并沒(méi)有寫(xiě)入數(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信號(hào))
          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. }



          評(píng)論


          技術(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); })();