我們知道 STM32 有很多寄存器,看起來特別費勁,當然如果通過前面的直接查看寄存器值的方法確實可以觀察數據,但在這里我要介紹一個特別方便的查看方式。
KEIL 集成的外設窗口(注意這個外設串口對 STM32F4 系列支持效果并不理想,但對 STM32F1 的支持特別好)。
首先介紹比較一般的查看方式。
進入 Debug 模式后,你應該能看到這個:
System Viewer 是關于片上外設的,也就是說不同的芯片具有不同的外設。
通過這個簡單看看 GPIO 吧(效果和 Watch 查看沒多大不同):
芯片的選擇是通過這個確定的:
而另一個 Core Peripherals 就是關于 CM3 內核的了,只要你的芯片內核是這個,基本都一樣的,比如 STM32F103RET6 和 STM32F103ZET6,都是 CM3 內核:
通過它看看 System Tick Timer 好了:
看到沒有,這個界面和普通的寄存器查看就不同了,如果你想知道你的滴答定時器有沒有開啟,直接看 ENABLE 就可以了,根本不需要知道在哪個位。事實上用來查看中斷寄存器更能顯示它的不同:
你的中斷設置的優先級是多少,是否開啟了,是否掛起了,是否處于活動狀態,在這里一目了然。當然這里只是簡單介紹,其它更多內容自己去看咯,比如你設置的中斷分組情況,中斷向量表偏移等內容都可以在這里查看。
再偷偷告訴你一個點,如何讓程序盡快進入中斷程序運行呢?試試勾選這個吧:
這樣在你的程序運行后馬上就能到你的中斷處理函數中執行了呢,是不是很方便。
通常以上窗口就是一般都能看到的,還有一些窗口如果設置不當是不能出現的,具體設置可以看 【Peripherals顯示空白】這個小節內容。現在假設你已經擁有如下窗口了:
這些窗口有什么好處呢?
我們知道,CM3 處理器的時鐘這一塊還是很復雜的,分頻、倍頻的都不知道到底最后時鐘是多少,但有了下面這個窗口就不一樣了:
圖片內容太多了,我們來截取一個點好了,就從最后部分介紹:
看到沒有,當時鐘為 8 M 的時候,HCLK、PCLK1、PCLK2 等這些時鐘頻率就根據你的配置正確顯示好了(前提是你的代碼已經將時鐘配置這部分內容運行完了)。那么 KEIL 是怎么知道你的外部時鐘是多少呢,通過修改這個:
事實上你可以直接修改這個:
但是這是臨時修改,下次進入 Debug 模式時讀取的還會是 8 M,所以最好修改上面那個。
可能你會說,時鐘頻率什么的我不關心,只要程序能運行就行,但是在器件通信的時候你可不能不關心時鐘頻率,因為有的器件的通信頻率是有要求的,比如 SPI 的通信速度要求是多少,你就得是多少,否則超出后肯定通信錯誤。那么如何查看呢?
比如 SPI1 的通信頻率(這里要說明一點是 SPI3 好像無法顯示出來,只能通過常規方法查看寄存器變量咯):
這里的時鐘分頻系數為 2,但是顯示的波特率為 72M,這是為什么呢?還記得之前我把 8 M 改成 16 M 了嗎?所以這里才會顯示 72M,所以你要注意一點的是,如果你使用的是外部時鐘,必須按前面的方法設置正確,這樣SPI這里的波特率顯示才正確。不過前面說了,Clock Disable,即時鐘關閉了,所以這個值是沒有意義的,因為沒有 SPI 時鐘你是無法工作的呀。
說完這個,再說說常用的外設 GPIO 好了,以 GPIOA 為例說明:
看窗口,是不是相當不錯呢。因為程序還沒開始運行,所以所有的 IO 口都是默認設置,即都是浮空輸入。我想暫時改為輸出怎么樣,直接修改就行了:
但是你會發現改完了也沒用,因為你的時鐘是關閉的呀:
所以如果你發現你的 IO 口沒工作,看看你的時鐘有沒有打開吧。
現在看看有意思的 IO 輸入輸出狀態:
這個 IDR 表示輸入寄存器(不可像 ODR 一樣修改),如果這個 IO 口設置為輸入了,那么這個可以實時顯示你的 IO 口狀態的(另外魚鷹偷偷告訴你,如果在沒有萬用表的情況想知道輸入 IO 口是高電平還是低電平,看這個就可以了,即使程序不運行也可以觀察哦)。
而 ODR 表示輸出寄存器,勾選了代表輸出為高電平,沒勾選就是低電平(前提是你的這個 IO 口已經設置為輸出了),如果你想讓 IO 暫時輸出一個電平,那么改這個就行了,比如你想看這個 PA0 是否設置正確或者是否損壞了,結合萬用表就可以知道這個引腳是否能被你控制了。
LCKR 這個是引腳的鎖定寄存器,一般不怎么使用。而 Pins 這個選項是在軟件仿真情況下才會出現的,這個其實和用你的萬用表測量是一樣的道理,只不過因為是軟件仿真的緣故,所以不存在損壞的問題,如果不能控制,就說明是程序配置問題了:
比如當你配置為 10M 輸出的情況下,如果勾選 PA0 的 ODR,那么這個引腳的 IDR 和 Pins 自動就會勾選了。而如果你在 Pins 里勾選,就類似于你在給這個引腳直接輸入一個高電平,而這個引腳本來是輸出的,所以會被禁止:
但是如果這個引腳是輸入的,勾選 Pins 就沒有問題了,并且 IDR 寄存器還能反映引腳狀態呢:
看完這些功能是不是感覺特別好用啊,所以說掌握了開發平臺的調試手段對你的開發是非常有必要的,磨刀不誤砍柴工,說的就是這個了。
另外再說一點,因為窗口太多了,只是拿其中部分窗口說明的,其他的就靠你自己去嘗試了。
PWM 輸出是否正常?變量的變化如何通過 KEIL 以波形的方式展現出來?