一、前言
本人工作中經常會使用STC單片機做完成一些簡單工作,但是在使用過程中會遇到一些意想不到的東西。本文的名字是“那些年使用STC單片機踩過的坑”,目的去記錄一些使用STC單片機需要注意的點,有些是在官方渠道中有解釋的點,有些則是坑人不眨眼,連官方都沒有解釋的點。
二、STC15系列與引腳相關的模式配置寄存器必須初始化
指的是PaMb系列寄存器,a為[0:7],b為[0:1],這些寄存器是用來配置引腳模式的,以P0為例,如下圖:
我一直以為這些寄存器的初始值為都0,實際並非如此,這16個寄存器中有5個初始值不是0。其實也沒必要去記哪些寄存器的初始值不是0,只要在使用某個引腳的時候記得要修改對應的引腳配置即可。
三、IAP15F4K32S4單片機內部時鍾頻率無法改變
寫了一個簡單的串口程序,就是以9600的波特率,發送0x55,用的是外部11.0592MHz的晶振,用邏輯分析儀采樣得出的結果如下:
可見一個脈沖的寬度為104.5us,實際上9600波特率的脈沖寬度應該為1000000/9600≈104.17us,算上邏輯分析儀的采樣精度,這個結果是沒問題的。
當我把時鍾改為內部時鍾,然后再下載運行程序后,得到的結果如下圖:
很顯然,這個結果比預期值差太遠了。
PS:程序下載完成后,有這樣的提示:
內部/外部時鍾源切換,目標芯片需要重新上電后才有效 !
若是由外部時鍾切換到內部時鍾,需重新下載一次才可正確調節頻率 !
本次測試是遵循了這個規則的,而且是不斷的下載、斷電、斷電,得到的結果非常一致,都是48us。
有人可能會說會不會是晶振頻率選的不對,這點我確信是對的,而且程序下載成功后會將真實頻率顯示出來,如下圖:
如果是這樣的話,那實際頻率比預想中的快2倍多,這屬實有點離譜。
為了進一步驗證問題所在,我在STC-ISP軟件中將內部時鍾改成不同的值,結果竟然是:無論我將時鍾頻率調到多少,得到的結果是一樣的。
這意味着有可能是我使用的芯片有問題,有可能是STC-ISP軟件有問題。
在網上搜了一圈,還真發現有類似的問題,並且在官方的說明網站中找到了這個:
我使用的芯片型號為IAP15W4K61S4,但是這個網站里並沒有找到類似信息,我下了一個6.36版本的軟件,發現這個版本的軟件還不支持IAP15W4K61S4的下載。然后我又測試了6.88L和6.88K,都沒解決問題。(我寫這篇文章時最新版是6.88L)
於是乎,我直接去百度搜“IAP15W4K61S4時鍾不准”,好家伙,2015年就有人遇到過這個問題了:https://www.amobbs.com/thread-5629386-1-1.html
但是這個帖子並沒有給出解決辦法,在別的地方也沒找到解決辦法,現在已經放假了,所以想等上班以后問問STC的工程師吧。
經過驗證,IAP15W4K61S4這個“不能改變的頻率”是24M,所以我寫的程序按照24MHz的頻率寫就沒問題了(向黑惡勢力低頭)。
四、使用外部晶振讀不到bandgap的值
我們知道,使用AD轉換芯片去測量某個電壓時,得到的值並不是電壓值,而是基於某個電壓的參考值,那么AD轉換結果的可靠性就和這個參考值的可靠性相關了。
STC單片機聲稱具有一個非常准確的參考電壓,就是bandgap電壓,不會隨芯片的工作電壓的改變而變化,如果能把這個功能用上的話,那相當於可以節省一個外部的參考電壓源,這個功能無疑是非常好的。
但是有一個前提,就是必須使用片內時鍾。否則無法正確的讀出bandgap電壓。這個問題和上個問題把我坑的不要不要的。
再提一嘴,如果要獲取bandgap電壓,在下載程序時除了要選用內部時鍾以外,還要勾選“在程序區的結束處添加重要測試參數”,如下圖:
並且在程序內要根據芯片型號選擇正確的ID_ADDR_ROM值。在官方例程里有從1K ROM到60K ROM的定義,IAP15W4K61S4是61K ROM,要自己寫上去,值為0xF3F7。
五、IAP系列單片機每次下載都會整片擦除EEPROM
我使用的單片機型號為:IAP15W4K61S4,下載時的硬件選項中:“下次下載用戶程序時擦除用戶EEPROM區”這個選項是強制不能勾選的,如下圖:
但是從我的實驗現象中發現,每次重新下載都會整片擦除。
查看芯片手冊發現這樣的描述:
有些系列程序存儲空間和用戶的存儲空間是分開的,而我選的這個系列程序存儲空間和用戶存儲空間是不分開的,所以下載程序時就不區分,直接全部擦除?這只是我的猜想。