久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10773|回復: 3
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:98618 發表于 2016-6-4 17:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一年多前寫過一篇《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 )

{

CLK_DeInit(); //寄存器復位

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

CLK_HSIPrescalerConfig( ); //分頻

GPIO_initialzation();

uart_initialzation();

PWM1_initialzation();

PWM2_initialzation();

TIM4_initialzation(); //TIM4初始化

enableInterrupts();//* 開啟總中斷 */

Ts_cnt = 1000;

Ls_cnt = 500;

while(1)

{

PLED_flash(499); //LED 閃爍

relay_control(); //繼電器控制

CCT_calculate();//獲取相關AD值

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

if(Flag_rec)

{

。。。。。。【略】

}

}

}

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

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

但事實又的確顯示出TIM4的中斷跟UART-RX接收有關系。


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

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的中斷服務程序里出現了好幾個全局變量,看看這些全局變量哪些函數會用到。因為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)

{

if(Ts_cnt> 1000)

{

Ts_cnt = 0;

T_ad = Get_ADCCH_Value(Ts_channel);

T_degree = cal_temp(T_ad)-11;

。。。。。。【略】

}

}

如果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失敗的情況。

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

相關話題鏈接:【點擊閱讀】

1.STM8S芯片GPIO復用AD功能后無法回到GPIO狀態問題

2.STM8 MCU管腳的識讀與AFR功能簡介

3.從STM8S轉到STM8L開發時要注意的幾個問題

4.STM8S10x系列 與 STM8S00x系列MCU之比較

5.STM8 cosmic C編譯器無代碼限制免費版面世

6.STM8系列MCU開發應用過程中的常見問題

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:83761 發表于 2016-6-23 15:06 | 只看該作者
最近可能會用到,先收藏
回復

使用道具 舉報

板凳
ID:47634 發表于 2018-2-17 21:44 | 只看該作者
這個很好,以后要好好注意這個問題
回復

使用道具 舉報

地板
ID:339020 發表于 2019-3-26 11:14 | 只看該作者
謝謝您
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久色激情 | 在线不卡av| 深夜爽视频 | 久久久精品一区 | 青青99| 欧美九九九 | 拍戏被cao翻了h承欢 | 午夜三级网站 | 国产98色在线 | 日韩 | 免费人成在线观看网站 | 精品免费国产视频 | 日日夜夜天天 | 粉嫩一区二区三区国产精品 | 亚洲成人国产精品 | 男女爱爱网站 | 97精品超碰一区二区三区 | 亚洲激情综合 | 日韩中文在线视频 | 91在线网站 | 日本免费小视频 | 久久国产精品免费一区二区三区 | www97影院| 亚洲国产精品福利 | 在线免费观看成人 | 午夜免费视频 | 亚州激情| 久久精品久久久久久 | 日韩在线精品强乱中文字幕 | 91看片官网| 国产乱码精品一品二品 | 成人久久久 | 欧美日韩专区 | 精国产品一区二区三区四季综 | 国产女人精品视频 | 91精品国产91久久久久久密臀 | 亚洲成人精品免费 | 久久久久久黄 | 伊人精品在线视频 | 日韩在线免费播放 | 国产一区二区三区视频 | 久久四虎 |