新聞中心

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

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

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

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

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

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

下面以S3C2440的I2C控制器為例來講解。下面的程序是基于中斷模式,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é)議的基本原理,編寫程序就水到渠成。

[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主機(jī)發(fā)送器發(fā)出S信號(hào)
  50. //Clearingthependingbitisntneededbecausethependingbithasbeencleared.
  51. while(_iicDataCount!=-1);//等待數(shù)據(jù)數(shù)據(jù)發(fā)送完畢
  52. //開始一次新的傳輸,不過只發(fā)送設(shè)備地址,等待應(yīng)答,以證明上次傳輸完成。而下次Wr24C080的時(shí)候會(huì)重新開始,這次的傳輸并沒有寫入數(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. }



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

評論


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

關(guān)閉