天天看點

1 io口 stm32_跟着小白學STM32,啰嗦的序列槽程式是這樣的

序列槽是一種通信方式,這個我不陌生。STM32的序列槽配置也算是比較簡單的,但我為了代碼的通用,自己采用了一種比較啰嗦的方式。原因我總結一下:

1. STM32有個IO口的重映射功能,正常情況下序列槽的IO口是PA9和PA10,特殊情況下可以映射為 PB6和PB7,這就出現一個問題,你第一個項目序列槽初始化的是PA9和PA10,另一個項目可能 進行了重映射,需要配置PB6和PB7,你這個序列槽初始化函數就要改,當然改一下也不麻煩,但 對于強迫症的我仍然不想去改函數,是以我定義了兩個幾個額外的參數,通過預編譯的方式讓 其自動判斷是否進行了重映射。如下

1 io口 stm32_跟着小白學STM32,啰嗦的序列槽程式是這樣的

設定為0代表沒有重映射,設定為1代表有重映射。緊接着看圖:

1 io口 stm32_跟着小白學STM32,啰嗦的序列槽程式是這樣的

根據RU_USART1_Remap這個常量的值進行預編譯,然後你就會看到初始化函數裡面根據常量 RU_USART1_Remap的值不同而開啟響應的時鐘:

1 io口 stm32_跟着小白學STM32,啰嗦的序列槽程式是這樣的

GPIO初始化也根據常量RU_USART1_Remap值的不同自動的替換了IO口:

1 io口 stm32_跟着小白學STM32,啰嗦的序列槽程式是這樣的

2. 序列槽初始化的時候有時需要用到序列槽中斷,有時不需要,這裡如果想要統一,也要用到上面的 同樣的預編譯的方法,隻需定義一個常量EN_USART1_RX

1 io口 stm32_跟着小白學STM32,啰嗦的序列槽程式是這樣的

接下來就簡單了,跟上面如出一轍

1 io口 stm32_跟着小白學STM32,啰嗦的序列槽程式是這樣的

一個#if語句解決問題。

當然了,以上這些可能壓根兒就不合理,隻是我自己的一點點嘗試,權當作複習一下C語言了 (不過我翻看了一下庫函數源碼,裡面用到預編譯的地方特别多,讀源碼對C語言的了解有幫 助)