<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > 關(guān)于STM8S ADC腳與其它功能復用時(shí)的問(wèn)題

關(guān)于STM8S ADC腳與其它功能復用時(shí)的問(wèn)題

作者: 時(shí)間:2016-09-21 來(lái)源:網(wǎng)絡(luò ) 收藏

  之前寫(xiě)過(guò)一篇關(guān)于芯片GPIO腳復用AD功能后無(wú)法回到GPIO狀態(tài)的小文,介紹芯片的應用時(shí)相關(guān)施密特觸發(fā)器未適時(shí)開(kāi)關(guān)而導致的問(wèn)題。

本文引用地址:http://dyxdggzs.com/article/201609/310076.htm

  大致內容就是某一GPIO口被復用為AD輸入腳做相關(guān)AD檢測。之后,把該腳AD功能禁用掉,再配置切換為帶下降沿觸發(fā)的外部中斷觸發(fā)腳,讓其作為芯片休眠喚醒腳。

  奇怪的是,那樣設置后根本沒(méi)法喚醒。即使不做休眠,做好切換配置后,直接查看該腳的IDR位的電平,不管外部輸入如何,發(fā)現對應IDR位始終提示為0.

  后來(lái)找到原因是跟那個(gè)施密特觸發(fā)器的配置有關(guān)??赡苡腥擞X(jué)得該問(wèn)題是鉆牛角尖,其實(shí),也不盡然。畢竟應用需求是五花八門(mén)的,遇到的問(wèn)題往往也是五彩繽紛,問(wèn)題不論大小折磨起人來(lái)也是不分男女老少的。

  這里再次分享個(gè)類(lèi)似話(huà)題 ,希望能讓見(jiàn)到本文的人有所啟示。工程師反饋基本情況如下:

  使用芯片開(kāi)發(fā)。因為T(mén)IM1/2都用做PWM了,所以用TIM4來(lái)做基本定時(shí)。TIM4正常中斷,UART1串口發(fā)送正常,就是串口接收中斷進(jìn)不去。但只要把 TIM4_initialzation();屏蔽掉,串口馬上正常中斷接收,一旦打開(kāi)TIM4,串口就接收不了,其它功能都正常。

  上面是該工程師對癥狀的基本描述和初步判斷?!井斎?,調試遇到麻煩時(shí)候的判斷難免有偏差,偏差大小因人因景不同,有時(shí)甚至完全誤判?!?/p>

  下面是他的主循環(huán)代碼【為了排版和閱讀,做了些刪減】。

  int main( void )

  {

  CLK_DeInit(); //寄存器復位

  CLK_HSICmd(ENABLE); //內部高速時(shí)鐘使能

  CLK_HSIPrescalerConfig( ); //分頻

  GPIO_initialzation();

  uart_initialzation();

  PWM1_initialzation();

  PWM2_initialzation();

  TIM4_initialzation(); //TIM4初始化

  enableInterrupts();//* 開(kāi)啟總中斷 */

  Ts_cnt = 1000;

  Ls_cnt = 500;

  while(1)

  {

  PLED_flash(499); //LED 閃爍

  relay_control(); //繼電器控制

  CCT_calculate();//獲取相關(guān)AD值

  send_information();//輸出提示信息

  if(Flag_rec)

  {

  。。。。。?!韭浴?/p>

  }

  }

  }

  現在的情況是當注釋掉上面的 TIM4_initialzation();語(yǔ)句后,UART-RX接收中斷就正常。

  TIM4只是做基本時(shí)鐘,不涉及外面其它硬件,最大可能是二者中斷優(yōu)先級有沖突導致UART-RX的正常接收。但當把UART-RX中斷優(yōu)先級調高于TIM4的更新中斷時(shí)問(wèn)題并無(wú)好轉。

  但事實(shí)又的確顯示出TIM4的中斷跟UART-RX接收有關(guān)系。

  TIM4、UART1初始化代碼只是些各種相關(guān)基本配置,不跟別的外設有關(guān)聯(lián)。不妨看看TIM4、UART1中斷服務(wù)程序里能否找到些蛛絲馬跡。

  INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler,23)

  {

  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

  ms_cnt++;//LED FLASH

  Ts_cnt++; //AD sample

  Ls_cnt++; //relay control

  uart_cnt++;//send information

  PWM2_duty_setting(Ts_cnt);

  pwm1_correct_cnt++;

  if(pwm1_correct_cnt > 100)

  {

  pwm1_correct_cnt = 0;

  if(pwm1_cnt > CCT_target)

  pwm1_cnt--;

  else

  pwm1_cnt++;

  PWM1_duty_setting(pwm1_cnt);

  }

  }

  INTERRUPT_HANDLER(UART1_RX_IRQHandler,18)

  {

  static uint8_t index = 0;

  UART1_ClearITPendingBit(UART1_IT_RXNE);

  recived_data[index] = UART1_ReceiveData8(); //讀數據

  if(recived_data[0] == 0x41)

  {

  index++;

  if((index > 7)&&(recived_data[7] == 0x0d))

  {

  index = 0;

  Flag_rec = 1;

  }

  }

  else

  {

  index = 0;

  recived_data[0] = 0;

  }

  }

  從TIM4的中斷服務(wù)程序里出現了好幾個(gè)全局變量,看看這些全局變量哪些函數會(huì )用到。因為T(mén)IM4的主要功能就是計數定時(shí),下面幾個(gè)計時(shí)變量肯定是給別人用的。

  ms_cnt++;//LED FLASH

  Ts_cnt++; //AD sample

  Ls_cnt++; //relay control

  uart_cnt++;//send information

  問(wèn)題到這里,繼續往下查就需要耐心了??蛻?hù)代碼不復雜,用到的外設模塊也不多,主循環(huán)里也就下面幾個(gè)函數,一個(gè)個(gè)函數模塊進(jìn)行排查。

  PLED_flash(499); //LED閃爍

  relay_control(); //繼電器控制

  CCT_calculate();//做AD轉換

  send_information();//輸出提示信息

  后來(lái)發(fā)現TIM4保持工作的同時(shí)屏蔽CCT_calculate();,UART-RX能正常接收??磥?lái)TIM4并非是影響UART接收的元兇。不過(guò)CCT_calculate()的運行還是跟TIM4中斷有關(guān),有個(gè)變量TS_CNT是在TIM4中斷里進(jìn)行累加的。

  看看下面CCT_calculate()的代碼,里面有個(gè)條件判斷,即if(Ts_cnt > 1000)的判斷。

  voidCCT_calculate(void)

  {

  if(Ts_cnt> 1000)

  {

  Ts_cnt = 0;

  T_ad = Get_CH_Value(Ts_channel);

  T_degree = cal_temp(T_ad)-11;

  。。。。。

  }

  }

  如果TIM4被屏蔽不工作,TS_CNT就不會(huì )得到累加而大于1000然后往下執行Get_CH_Value();函數。該Get_ADCCH_Value();函數對ADC做初始化之后執行AD轉換并獲取相關(guān)AD值。

  正是在A(yíng)DC初始化代碼里有對相關(guān)ADC通道對應腳的施密特觸發(fā)器做了禁用配置。而且該ADC通道腳跟UART-RX腳又是復用的,麻煩就此產(chǎn)生了。

  

 

  在STM8MCU的GPIO 的各IO模塊里有個(gè)施密特觸發(fā)器,通過(guò)寄存器ADC_TDR控制其開(kāi)和關(guān)。默認情況下是打開(kāi)的,IO腳的信號可以自由通過(guò)它進(jìn)到輸入寄存器或其它外設模塊。

  如果某管腳做AD模擬輸入時(shí),建議通過(guò)ADC_TDR將相應的施密特觸發(fā)器關(guān)閉,目的是為了降低GPIO的功耗。如下圖所示,當施密特觸發(fā)器被關(guān)閉后,不管外部引腳電平如何變化,它的輸出恒定為0。

  

 

  結合到本案例中的問(wèn)題,因為他在A(yíng)D轉換函數中初始化AD時(shí)關(guān)閉了該施密特觸發(fā)器,該腳又復用為UART-RX,此時(shí)RX信號根本進(jìn)不到UART接收模塊中,不能產(chǎn)生UART接收中斷也就自然而然了。

  后來(lái)當它打開(kāi)施密特觸發(fā)器后,URAT-RX接收也就正常了。

  顯然,客戶(hù)最先認為的TIM4影響UART-RX是個(gè)錯覺(jué)。因為它是每隔一定時(shí)間才去做AD轉換,同時(shí)做些AD初始化配置。如果TIM4關(guān)閉了,相應的時(shí)間條件不成立也就不去做AD轉換,也就不會(huì )禁用施密特觸發(fā)器,進(jìn)而就不會(huì )發(fā)生UART-RX失敗的情況。



關(guān)鍵詞: STM8S ADC

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>