乙個STM8S ADC腳與其它功能復用時的話題

2021-08-03 22:08:05 字數 2663 閱讀 1171

一年多前寫過一篇《stm8s晶元gpio腳復用ad功能後無法回到gpio狀態問題》的小文,介紹stm8s晶元的adc應用時相關施密特觸發器未適時開關而導致的問題。

大致內容就是某一gpio口被復用為ad輸入腳做相關ad檢測。之後,把該腳ad功能禁用掉,再配置切換為帶下降沿觸發的外部中斷觸發腳,讓其作為晶元休眠喚醒腳。

奇怪的是,那樣設定後根本沒法喚醒。即使不做休眠,做好切換配置後,直接檢視該腳的idr位的電平,不管外部輸入如何,發現對應idr位始終提示為0.

後來找到原因是跟那個施密特觸發器的配置有關。可能有人覺得該問題是

鑽牛角尖,其實,也不盡然。畢竟應用需求是五花八門的,遇到的問題往往也是五彩繽紛,問題不論大小折磨起人來也是不分男女老少的。

這裡再次分享個類似話題 ,希望能讓見到本文的人有所啟示。工程師反饋基本情況如下:

使用stm8s晶元開發。因為tim1/2都用做pwm了,所以用tim4來做基本定時。

tim4

正常中斷,uart1串列埠傳送正常,就是串列埠接收中斷進不去。

但只要把 tim4_initialzation();遮蔽掉,串列埠馬上正常中斷接收,一旦開啟tim4,串列埠就接收不了,其它功能都正常。

上面是該工程師對症狀的基本描述和初步判斷。【當然,除錯遇到麻煩時候的判斷難免有偏差,偏差大小因人因景不同,有時甚至完全誤判。】

下面是他的主迴圈**【為了排版和閱讀,做了些刪減】。

int main( void ) }

} 現在的情況是當注釋掉上面的 tim4_initialzation();語句後,uart-rx接收中斷就正常。

tim4

只是做基本時鐘,不涉及外面其它硬體,最大可能是二者中斷優先順序有衝突導致uart-rx的正常接收。但當把uart-rx中斷優先順序調高於tim4的更新中斷時問題並無好轉。

但事實又的確顯示出tim4的中斷跟uart-rx接收有關係。

tim4

、uart1初始化**只是些各種相關基本配置,不跟別的外設有關聯。不妨看看tim4、uart1中斷服務程式裡能否找到些蛛絲馬跡。

interrupt_handler(tim4_upd_ovf_irqhandler,23) }

interrupt_handler(uart1_rx_irqhandler,18) }

else }

從tim4的中斷服務程式裡出現了好幾個全域性變數,看看這些全域性變數哪些函式會用到。因為tim4的主要功能就是計數定時,下面幾個計時變數肯定是給別人用的。

ms_cnt++;//led flash

ts_cnt++; //ad sample

ls_cnt++; //relay control

uart_cnt++;//send information

問題到這裡,繼續往下查就需要耐心了。

客戶**不複雜,用到的外設模組也不多,主迴圈裡也就下面幾個函式,乙個個函式模組進行排查。

pled_flash(499); //led

閃爍 relay_control(); //

繼電器控制

cct_calculate();//

做ad轉換

send_information();//

輸出提示資訊

後來發現tim4保持工作的同時遮蔽cct_calculate();,uart-rx能正常接收。看來tim4並非是影響uart接收的元凶。不過cct_calculate()的執行還是跟tim4中斷有關,有個變數ts_cnt是

在tim4中斷裡進行累加的。

看看下面cct_calculate()的**,裡面有個條件判斷,即if(ts_cnt > 1000)的判斷。

voidcct_calculate(void) }

如果tim4被遮蔽不工作,ts_cnt就不會得到累加而大於1000然後往下執行get_adcch_value();函式。該get_adcch_value();函式對adc做初始化之後執行ad轉換並獲取相關ad值。

正是在adc初始化**裡有對相關adc通道對應腳的施密特觸發器做了禁用配置。

而且該adc通道腳跟uart-rx腳又是復用的,麻煩就此產生了。

在stm8mcu的gpio 的各io模組裡有個施密特觸發器,通過暫存器adc_tdr控制其開和關。預設情況下是開啟的,io腳的訊號可以自由通過它進到輸入暫存器或其它外設模組。

如果某管腳做ad模擬輸入時,建議通過adc_tdr將相應的施密特觸發器關閉,目的是為了降低gpio的功耗。如下圖所示,當施密特觸發器被關閉後,不管外部引腳電平如何變化,它的輸出恆定為0。

結合到本案例中的問題,因為他在ad轉換函式中初始化ad時關閉了該施密特觸發器,該腳又復用為uart-rx,此時rx訊號根本進不到uart接收模組中,不能產生uart接收中斷也就自然而然了。

後來當它開啟施密特觸發器後,urat-rx接收也就正常了。

顯然,客戶最先認為的tim4影響uart-rx是個錯覺。因為它是每隔一定時間才去做ad轉換,同時做些ad初始化配置。如果tim4關閉了,相應的時間條件不成立也就不去做ad轉換,也就不會禁用施密特觸發器,進而就不會發生uart-rx失敗的情況。

談到這裡,就此打住,目的想讓大家通過類似案例分享而有所收穫。

**:

實戰二 LoadRunner建立乙個測試指令碼

問題一 執行指令碼瀏覽器不能自動啟動?原因 loadrunner11只支援ie9以下瀏覽器和火狐低版本瀏覽器 解決辦法 1 ie瀏覽器取消勾選 啟用第三方瀏覽器擴充套件 啟動ie,從 工具 進入 internet選項 切到高階,去掉 啟用第三方瀏覽器擴充套件 需要重啟動 的勾選,然後再次執行vuge...

編寫乙個程式 8

計算器程式 對於計算的優先順序問題,如何從輸入讀取包括數字和操作符在內的表示式的方法,並以一種合理的方式進行儲存?分詞 tokenize 讀取輸入字元並組合成單詞 token 單詞可以看做乙個單元的乙個字串行,例如數字或者運算子。利用 kind,value 的形式來表示單詞,其中kind表示單詞是乙...

python一腳乙個坑 venv的使用

當使用pycharm建立工程的時候,會預設建立乙個venv的資料夾,且預設interpret也是該目錄,而不是系統環境 以前不知道這個是用來幹什麼的,後來搜尋了一下了解到這是乙個虛擬環境 也就是說比如有個工程a,用到了某些特殊的包,即除了該工程,別的工程大概率是用不到的,這種情況,我們就沒有必要單獨...