GD32E230 GPIO 時鍾


GPIO內部結構

 

GPIO輸入模式

(1)浮空輸入模式

在這里插入圖片描述

圖中施密特觸發器是開啟的,IO口的狀態可以直接送到輸入寄存器中,CPU可以直接讀取輸入寄存器;
在上圖中,陰影的部分處於不工作狀態,尤其是下半部分的輸出電路,實際上是與端口處於隔離狀態。
黃色的高亮部分顯示了數據傳輸通道,外部的電平信號通過左邊編號1的IO端口進入STM32,經過編號2的施密特觸發器的整形送入編號3的輸入數據寄存器,在輸入數據寄存器的另一端編號4,CPU可以隨時讀出IO端口的電平狀態

(2)上拉輸入模式

在這里插入圖片描述

上圖是STM32的GPIO帶上拉輸入模式的配置。與前面的浮空輸入模式相比,僅僅是在數據通道上部,接入了一個上拉電阻,根據STM32的數據手冊,這個上拉電阻阻值介於30K~50K。
同樣,CPU可以隨時在輸入數據寄存器的另一端,讀出IO端口的電平狀態。

(3)下拉輸入模式

在這里插入圖片描述

(4)模擬輸入模式

在這里插入圖片描述

施密特觸發器是關閉的,信號直接到ADC輸入;
STM32的模擬輸入通道的配置則更加簡單,信號從左邊編號1的端口進入,從右邊編號2的一端直接進入ADC模塊。
這里我們看到所有的上拉、下拉電阻和施密特觸發器,均處於斷開狀態,因此輸入數據寄存器將不能反映端口上的電平狀態,也就是說,模擬輸入配置下,CPU不能在輸入數據寄存器上讀到有效的數據。

 

GPIO輸出模式

(1)開漏輸出模式  GPIO_OType_OD

在這里插入圖片描述

當CPU在編號1端通過“位設置/清楚寄存器”或“輸出數據寄存器”寫入數據后,該數據位通過編號2的輸出控制電路傳送到編號4的IO端口。
如果CPU寫入的是邏輯1,則編號3的N-MOS管將處於關閉狀態,此時IO端口的電平將由外部的上拉電阻決定,如果CPU寫入的是邏輯0,則編號3的N-MOS管將處於開啟狀態,此時IO端口的電平被編號3的N-MOS管拉到了VSS的零電位。
在上圖的上半部,施密特觸發器處於開啟狀態,這意味着CPU可以在“輸入數據寄存器”的另一端,隨時監控IO端口的狀態;通過這個特性,還實現了虛擬的IO端口雙向通信,只要CPU輸出邏輯1,由於編號3的N-MOS管處於關閉狀態,IO端口的電平將完全由外部電路決定,因此,CPU可以在“輸入數據寄存器”讀到外部電路的信號,而不是它自己輸出的邏輯1。
GPIO口的輸出模式下,有3種輸出速度可選(2MHz、10MHz和50MHz),這個速度是指GPIO口驅動電路的響應速度,而不是輸出信號的速度,輸出信號的速度與程序有關(芯片內部在IO口的輸出部分安排了多個響應速度不同的輸出驅動電路,用戶可以根據自己的需要選擇合適的驅動電路)。通過選擇速度來選擇不同的輸出驅動模塊,達到最佳的噪聲控制和降低功耗的目的。高頻的驅動電路,噪聲也高,當不需要高的輸出頻率時,請選用低頻驅動電路,這樣非常有利於提高系統的EMI性能。當然如果要輸出較高的頻率的信號,但卻選用了較低頻率的驅動模塊,很可能會得到失真的輸出信號。

 

開漏輸出:開漏輸出就是不輸出電壓,低電平時接地,高電平時不接地。如果外接上拉電阻,則在輸出高電平時電壓會拉到上拉電阻的電源電壓。這種方式適合在連接的外設電壓比單片機電壓低的時候。

 

a、只能輸出低電平,不能輸出高電平。如果要輸出高電平,則需要外接上拉。

b、開漏輸出具有“線與”功能,一個為低,全部為低,多用於I2C和SMBUS總線。

(2)開漏復用輸出模式

在這里插入圖片描述

(3)推挽輸出模式  GPIO_OType_PP

在這里插入圖片描述

 

推挽輸出:推挽輸出就是單片機引腳可以直接輸出高電平電壓。低電平時接地,高電平時輸出單片機電源電壓。這種方式可以不接上拉電阻。但如果輸出端可能會接地的話,這個時候輸出高電平可能引發單片機運行不穩定,甚至可能燒壞引腳。推挽方式的驅動力更大。

a、可以輸出高低電平,用於連接數字器件,高電平由VDD決定,低電平由VSS決定。

b、推挽結構指兩個三極管受兩路互補的信號控制,總是在一個導通的時候另外一個截止,優點開關效率效率高,電流大,驅動能力強。

c、輸出高電平時,電流輸出到負載,叫灌電流,可以理解成推,輸出低電平時,負載電流流向芯片,叫拉電流,即挽。

 

(4)推挽復用輸出模式

在這里插入圖片描述

 

 GPIO推挽復用輸出模式,編號2的輸出控制電路的輸入,與復用功能的輸出端相連,此時輸出數據寄存器被從輸出通道斷開了,並和片上外設的輸出信號連接。我們將GPIO配置成復用輸出功能后,如果外設沒有被激活,那么它的輸出將不確定,其它部分與前述模式一致,包括對“輸入數據寄存器”的讀取。

 


3、應用場合
①上拉輸入、下拉輸入可以用來檢測外部信號;例如,按鍵等;
②浮空輸入模式,由於輸入阻抗較大,一般把這種模式用於標准通信協議的I2C、USART的接收端;
③普通推挽輸出模式一般應用在輸出電平為0和3.3V的場合。而普通開漏輸出模式一般應用在電平不匹配的場合,如需要輸出5V的高電平,就需要在外部一個上拉電阻,電源為5V,把GPIO設置為開漏模式,當輸出高阻態時,由上拉電阻和電源向外輸出5V電平。
④對於相應的復用模式,則是根據GPIO的復用功能來選擇,如GPIO的引腳用作串口的輸出,則使用復用推挽輸出模式。如果用在IC、SMBUS這些需要線與功能的復用場合,就使用復用開漏模式。
⑤在使用任何一種開漏模式時,都需要接上拉電阻。

  

GPIO用到的函數

void gpio_deinit(uint32_t gpio_periph) // reset GPIO port
void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin) //set GPIO mode
void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin)//set GPIO output type and speed
void gpio_bit_set(uint32_t gpio_periph, uint32_t pin) //set GPIO pin bit
void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin) //reset GPIO pin bit
void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value) //write data to the specified GPIO pin
void gpio_port_write(uint32_t gpio_periph, uint16_t data)//write data to the specified GPIO port
FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin) //get GPIO pin input status
uint16_t gpio_input_port_get(uint32_t gpio_periph) //get GPIO all pins input status
FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin) //get GPIO pin output status
uint16_t gpio_output_port_get(uint32_t gpio_periph) //get GPIO all pins output status
void gpio_af_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin) //set GPIO alternate function
void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin) //lock GPIO pin bit
void gpio_bit_toggle(uint32_t gpio_periph, uint32_t pin) //toggle GPIO pin s
void gpio_port_toggle(uint32_t gpio_periph) //toggle GPIO port status

 

 

 時鍾樹

 

 

時鍾源

可以選擇

內部8MHz時鍾源(IRC8M)、外部4~32MHz高速時鍾源(HXTAL)、內部48MHz高速時鍾源(IRC48M),並且可以經過PLL進行倍頻。

CK_SYS(即系統時鍾)配置方法有三種,當SCS寄存器配置為00時,CK_SYS為8MHz(內部8MHz直連);當SCS寄存器配置為01時,CK_SYS為外部高速時鍾源的頻率,即與外部高速時鍾直連;當SCS寄存器配置為10時,CK_SYS為時鍾源經過PLL倍頻獲得的頻率值。

選擇時鍾源:void rcu_system_clock_source_config(uint32_t ck_sys)

configure the system clock source

ck_sys: system clock source select
only one parameter can be selected which is shown as below:
RCU_CKSYSSRC_IRC8M: select CK_IRC8M as the CK_SYS source
RCU_CKSYSSRC_HXTAL: select CK_HXTAL as the CK_SYS source
RCU_CKSYSSRC_PLL: select CK_PLL as the CK_SYS source



 

 AHB、APB1、APB2、PLL配置

void rcu_ahb_clock_config(uint32_t ck_ahb)

/*!
\brief configure the AHB clock prescaler selection
\param[in] ck_ahb: AHB clock prescaler selection
only one parameter can be selected which is shown as below:
\arg RCU_AHB_CKSYS_DIVx, x=1, 2, 4, 8, 16, 64, 128, 256, 512
\param[out] none
\retval none
*/

void rcu_apb1_clock_config(uint32_t ck_apb1)

/*!
\brief configure the APB1 clock prescaler selection
\param[in] ck_apb1: APB1 clock prescaler selection
only one parameter can be selected which is shown as below:
\arg RCU_APB1_CKAHB_DIV1: select CK_AHB as CK_APB1
\arg RCU_APB1_CKAHB_DIV2: select CK_AHB/2 as CK_APB1
\arg RCU_APB1_CKAHB_DIV4: select CK_AHB/4 as CK_APB1
\arg RCU_APB1_CKAHB_DIV8: select CK_AHB/8 as CK_APB1
\arg RCU_APB1_CKAHB_DIV16: select CK_AHB/16 as CK_APB1
\param[out] none
\retval none
*/

void rcu_apb2_clock_config(uint32_t ck_apb2)

/*!
\brief configure the APB2 clock prescaler selection
\param[in] ck_apb2: APB2 clock prescaler selection
only one parameter can be selected which is shown as below:
\arg RCU_APB2_CKAHB_DIV1: select CK_AHB as CK_APB2
\arg RCU_APB2_CKAHB_DIV2: select CK_AHB/2 as CK_APB2
\arg RCU_APB2_CKAHB_DIV4: select CK_AHB/4 as CK_APB2
\arg RCU_APB2_CKAHB_DIV8: select CK_AHB/8 as CK_APB2
\arg RCU_APB2_CKAHB_DIV16: select CK_AHB/16 as CK_APB2
\param[out] none
\retval none
*/

void rcu_pll_config(uint32_t pll_src, uint32_t pll_mul);

/*!
\brief configure the PLL clock source selection and PLL multiply factor
\param[in] pll_src: PLL clock source selection
only one parameter can be selected which is shown as below:
\arg RCU_PLLSRC_IRC8M_DIV2: select CK_IRC8M/2 as PLL source clock
\arg RCU_PLLSRC_HXTAL: select HXTAL as PLL source clock
\param[in] pll_mul: PLL multiply factor
only one parameter can be selected which is shown as below:
\arg RCU_PLL_MULx(x=2..32): PLL source clock * x
\param[out] none
\retval none
*/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM