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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM8S BUG的一點(diǎn)總結(jié)

          STM8S BUG的一點(diǎn)總結(jié)

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
          意法半導(dǎo)體STM8S 系列單片機(jī)價(jià)格很便宜,外圍資源很豐富,開(kāi)始就果斷選擇了這款單片機(jī)(STM8S103F3P)沒(méi)使用不知道,使用后心里各種不爽。主要就是它的I2C熱的禍。不知道是不是專(zhuān)利原因,意法的I2C做的很復(fù)雜,很別扭。官網(wǎng)上公布的Erratasheet就不搬過(guò)來(lái)了。針對(duì)I2C總線(xiàn)總是被鎖死的情況,我目前采取的辦法是(功能是主機(jī)向從機(jī)發(fā)送一個(gè)字節(jié)的數(shù)據(jù)):
          主機(jī):(STM32F103)
          1.開(kāi)啟事件中斷,關(guān)閉緩存中斷。
          2.通過(guò)BTF被置位引起的中斷來(lái)寫(xiě)下一字節(jié)的數(shù)據(jù)。
          中斷響應(yīng)函數(shù)中僅僅判斷三個(gè)點(diǎn):
          1.Start發(fā)送完后的SB置位,按手冊(cè)說(shuō)的寫(xiě)地址到DR寄存器后清除該事件;
          2.地址發(fā)送完后的ADDR位,按手冊(cè)說(shuō)的,讀SR2寄存器清除改事件;然后寫(xiě)第一字節(jié)的數(shù)據(jù)
          3.BTF觸發(fā)中斷,發(fā)送STOP
          4.關(guān)閉I2C外設(shè),防止干擾信號(hào)導(dǎo)致I2C鎖死。如果中斷處理函數(shù)中遇到其他情況就RESET下I2C。
          從機(jī):(STM8S103F3P)
          只開(kāi)事件中斷
          中斷響應(yīng)函數(shù):
          static u8 progress來(lái)記下當(dāng)前的進(jìn)程,用Switch語(yǔ)句,有點(diǎn)類(lèi)似于Verilog HDL里寫(xiě)狀態(tài)機(jī)的那個(gè),讓進(jìn)程只能按照switch里的順序執(zhí)行,如果有問(wèn)題就RESET,看下面的。
          uchar dat;
          static uchar progress;
          EXIT_PD_DISABLE
          switch(progress)
          {
          case 0:
          if(I2C_SR1_ADDR==1) //地址匹配
          {
          if(I2C_SR3_TRA==1) //發(fā)送
          progress=1;
          else
          progress=2;
          }
          else //ERROR
          {
          Reset();
          progress=0;
          }
          break;
          case 1://發(fā)送模式
          Reset();
          progress=0;
          break;
          case 2://接收模式
          dat=I2C_DR;
          if(dat>0xa0) dat=0xa0;
          Reset();
          progress=0;
          break;
          }
          除了I2C本身的BUG 據(jù)我目前所知,I2C和外部中斷也有沖突,具體是I2C和GPIOA的外部中斷,這個(gè)在Erratasheet里也有提到。當(dāng)這兩個(gè)中斷同事要響應(yīng)時(shí)GPIOA的中斷不會(huì)被響應(yīng),而是等I2C的中斷結(jié)束一段時(shí)間后,才開(kāi)始響應(yīng)。
          另外還有一個(gè),就是如果I2C的中斷被打開(kāi)后GPIOD如果有設(shè)置為輸入口的,GPIOD的外部中斷會(huì)自動(dòng)被打開(kāi),即使GPIOD的CR2寄存器全為0 不知道怎么回事,目前還沒(méi)更加具體的去查找是什么原因。但是這個(gè)在Erraratasheet里面沒(méi)有提及。
          總之,得出了一個(gè)結(jié)論
          //1、用STM8S 盡量不要去碰硬件I2C,好多麻煩,STM32還可以。
          2、以后再做什么東西,要先下載那個(gè)單片機(jī)的Erratasheet,大致翻下心里有個(gè)數(shù),這樣至少不會(huì)讓自己一直陷入一個(gè)死胡同,最后卻發(fā)現(xiàn)是硬件BUG的原因。
          3、看英文原版的DataSheet,英文要練好啊,什么東西讓人翻譯過(guò)來(lái)反而更加難理解。甚至我用的STM8S里的寄存器手冊(cè)里還有致命的翻譯所悟,弄得我搞了半天沒(méi)搞好。


          關(guān)鍵詞: STM8SBU

          評(píng)論


          技術(shù)專(zhuān)區(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); })();