a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

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

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

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

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

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

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

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

[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;//設置中斷處理函數
  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)使能接收/發送功能
  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主機發送器發出S信號
  50. //Clearingthependingbitisntneededbecausethependingbithasbeencleared.
  51. while(_iicDataCount!=-1);//等待數據數據發送完畢
  52. //開始一次新的傳輸,不過只發送設備地址,等待應答,以證明上次傳輸完成。而下次Wr24C080的時候會重新開始,這次的傳輸并沒有寫入數據
  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);//等待數據數據發送完畢,狀態寄存器改變了就可以了
  61. if(!(_iicStatus&0x1))//接收到的最后一位為0(接收到ACK信號)
  62. break;//WhenACKisreceived判斷最后一位的狀態
  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. }



評論


技術專區

關閉