stm32 IO復用配置

2021-09-14 07:23:26 字數 1455 閱讀 5798

gpio_pinafconfig(gpioa,gpio_pinsource9,gpio_af_usart1); //gpioa9usart1
解析:

gpio為埠a的基址

gpio_pinsource9:為埠9

gpio_af_usart1:復用對映,巨集定義為:

#define gpio_af_usart1 ((uint8_t)0x07),見下圖,為不同外設的對映情況,uart1對應的是af7,因此這裡是0x07,同理af6,對映的是spi3,對應的巨集定義是0x06

void gpio_pinafconfig(gpio_typedef* gpiox, uint16_t gpio_pinsource, uint8_t gpio_af)

解析:

首先看下復用功能暫存器,復用功能暫存器分兩個,復位功能低位暫存器配置埠0-7和復位功能高位暫存器配置埠8-15,該暫存器32位,每4位表示乙個埠,因此乙個暫存器總共能配置8個埠,如下:

由上面暫存器定義,可發現兩個規律:

其一,若是復用af7,需要把相應的暫存器設定成為0111即0x7,這裡需要設定的數字7和復用對映號7一致,同樣發現,其他復用也是如此。

其二:每4位代表乙個埠,從低到高依次為埠0-7;對於高位埠8-15同樣,從低到高依次為8-15,若取低三位(8的二進位制1000-低三位0;9的二進位制1001-低三位是1),則是0-7。

從上面規律可知道,若想埠9復用usart1功能,埠9大於8,則對應高位暫存器,埠數字9取第三位為001,說明需要用配置高位暫存器的第二個4位的值。要想復用usart功能,則需設定成7即0111。

明白了以上規律,基本就清楚程式中式如何設定的了。接下來對分局對程式進行解析:

temp = ((uint32_t)(gpio_af) << ((uint32_t)((uint32_t)gpio_pinsource & (uint32_t)0x07) * 4)) ;

((uint32_t)((uint32_t)gpio_pinsource & (uint32_t)0x07) * 4))該句的意思就是判斷需要配置復用功能暫存器中那個埠,每個埠4位,因此乘以4,即獲得需要配置的位置。

gpio_af是復用的功能的值,左移的目的就是移動到需要配置的埠上去。

gpiox->afr[gpio_pinsource >> 0x03] &= ~((uint32_t)0xf << ((uint32_t)((uint32_t)gpio_pinsource & (uint32_t)0x07) * 4)) ;

這句話的意思,把需要設定的4位清零,其他地方保持不變。

temp_2 = gpiox->afr[gpio_pinsource >> 0x03] | temp;

這句話的意思,是改變需要配置的位置的值,其他位置保持不變

gpiox->afr[gpio_pinsource >> 0x03] = temp_2;

STM32 I O復用功能時鐘配置

為了優化64腳或100 腳封裝的外設數目,可以把一些復用功能重新對映到其他引腳上。設定復用 重對映和除錯i o 配置暫存器 afio mapr 實現引腳的重新對映。這時,復用功能不再對映到它 們的原始分配上。需要用到外設的重對映功能時才需要使能afio的時鐘 外部中斷 exti 中與afio有關的暫...

STM32IO埠相關配置

輸入浮空 輸入上拉 輸入下拉 模擬輸入 開漏輸出 推挽輸出 推挽輸出 推挽式復用輸出 開漏復用功能 i o level 標 ft 的就是 5v 電平相容的 2 個 32 位的埠配置暫存器 crl 和 crh 2 個 32 位的資料暫存器 idr 和 odr 1 個 32 位的置位 復位暫存器bsrr...

stm32 io 口配置和使用

對於stm32 gpio的配置種類有8種之多 1 gpio mode ain 模擬輸入 2 gpio mode in floating 浮空輸入 3 gpio mode ipd 下拉輸入 4 gpio mode ipu 上拉輸入 5 gpio mode out od 開漏輸出 6 gpio mode...