STM32 關於GPIO的問題集錦

原文地址:STM32關於GPIO的問題集錦

STM32 關於GPIO的問題集錦

1、關於GPIO


問:STM32的IO口初始化爲輸入浮空,那管腳是高電平還是低電平呢?


答:既不是高電平也不是低電平,懸空的意思是沒有使用的狀態。


2、有關stm32f103 端口複用的問題?


問:在學習GPIO時,遇到到端口複用問題一直不能明白,我舉個例子:
PB6 PB7默認情況下是做普通IO使用的,當我想用I2C1是,我開啓RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
當我要使用I2C1的重定義時,我要打開,
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
這樣理解對不對?


有的人說當用的芯片自帶的外設時都要打開 AFIO 時鐘,但我用到usart1時沒有打開AFIO 時鐘,照樣能用usart,這是爲什麼?
總之問這個問題的根本原因是AFIO的時鐘要在什麼情況下打開?


答:1、串口必須要打開AFIO時鐘,不然不能工作。可能你的初始化函數、RCC配置中有開啓的地方。 2、AFIO在你需要使用某一模塊時,比如你想使用GPIOC,這個時候要打開GPIOC模塊的時鐘。 3、關閉I2C而不是關閉I2C模塊的總線,如果你想使用普通模式,就要把I2C模塊關閉以後,重新配置GPIOB模塊,就可以正常使用了。




3、AFIO重映射的操作步驟是什麼?


答:使能被重新映射到的I/O端口時鐘使能被重新映射的外設時鐘使能AFIO功能的時鐘 (勿忘!) 進行重映射
 
 
4、配置IO口的頻率問題
 
問:配置IO口的頻率時,爲什麼只給一個IO口配置?
答:GPIO_InitStructure.GPIO_Speed 這個結構體的成員始終爲GPIO_Speed_50MHz 配置其他io口時也默認用50MHz 。
 
 
 
5、請問怎樣開始STM32W108CBU64芯片的PB5引腳外設輸入中斷?
 
問:有沒有這麼一個例程,有開啓外設中斷和中斷函數的? 
最佳答案:看了下datasheet,PB5複用的功能爲PB5, ADC0, TIM2CLK, TIM1MSK,相關的中斷應該有,就看你配置爲什麼外設了。
 
6、STM32F101 Tamper Pin 使用問題
 
問:請教各位大蝦:STM32F101 BKP當中的Tamper Pin該如何初始化!?
答:當TPAL=0時:如果在啓動侵入檢測TAMPER引腳前(通過設置TPE位)該引腳已經爲高電平,一旦啓動侵入檢測功能,則會產生一個額外的侵入事件(儘管在TPE位置’1’後並沒有出現上升沿)。 ● 當TPAL=1時:如果在啓動侵入檢測引腳TAMPER前(通過設置TPE位)該引腳已經爲低電平,一旦啓動侵入檢測功能,則會產生一個額外的侵入事件(儘管在TPE位置’1’後並沒有出現下降沿)。 設置BKP_CSR寄存器的TPIE位爲’1’,當檢測到侵入事件時就會產生一箇中斷。 詳見:BKP_CSR
 
7、有關stm32f103 端口複用的問題?
問:
在學習GPIO時,遇到到端口複用問題一直不能明白,我舉個例子: 
PB6 PB7默認情況下是做普通IO使用的,當我想用I2C1是,我開啓RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 
當我要使用I2C1的重定義時,我要打開, 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
這樣理解對不對? 
有的人說當用的芯片自帶的外設時都要打開 AFIO 時鐘,但我用到usart1時沒有打開AFIO 時鐘,照樣能用usart,這是爲什麼? 
總之問這個問題的根本原因是AFIO的時鐘要在什麼情況下打開? 
答:
1、串口必須要打開AFIO時鐘,不然不能工作。可能你的初始化函數、RCC配置中有開啓的地方。 2、AFIO在你需要使用某一模塊時,比如你想使用GPIOC,這個時候要打開GPIOC模塊的時鐘。 3、關閉I2C而不是關閉I2C模塊的總線,如果你想使用普通模式,就要把I2C模塊關閉以後,重新配置GPIOB模塊,就可以正常使用了。
7、STM32裏面,設置GPIO_Mode_IPU 有什麼用
問:中斷的配置裏面有:GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);                            GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
GPIO口設置裏面有: GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
                       GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
                       GPIO_Init(GPIOB, &GPIO_InitStructure); 
我想問的是,這兩組設置必須同時存在嗎?
答:GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);  
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
STM32中這兩句話的意思是PB口的8、9管腳作爲外部中斷的觸發信號,所以Pin_8和Pin_9就要設置成輸入的模式,而GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;中IPU是指IO口的工作模式是帶上拉輸入,這個和具體的電路有關,總之如果選擇某個IO口作爲外部中斷的觸發信號,就必須配置這個IO口爲輸入模式,不然無法觸發中斷
 
8、stm32中GPIO口的最大輸出速度如何理解?

問:stm32中GPIO口的最大輸出速度如何理解?
答:1、是這樣的,2M、10M和50M是指GPIO口的採樣頻率。不知這樣理解對不對,我就是這樣做的。
         2、我通過PB6採集80KBPS/S的方波,通過中斷計採集,完全勝任。


9、STM32 GPIO 弱上拉能做輸入輸出嗎
問:STM32 GPIO 弱上拉能做輸入輸出嗎?
答:32只有上拉輸入,用在外部連接的是下路輸出的,這樣才能正確讀取。輸出的話一般用推輓和開漏,推輓用於一般的驅動,開漏一般加上拉電阻像三極管集電極那樣驅動較大電流。


10、STM32語句:GPIO->ODR^=0X02 是怎麼執行的?實現什麼功能?
問:是GPIO端口的數據存在ODR寄存器,該數據與0x02異或再存在ODR中嗎?
答:ODR是stm32的IO端口輸出數據寄存器,該寄存器31-16位始終讀爲0,15-0位輸出數據。GPIO->ODR^=0X02 是輸出數據與0x02異或,即輸出數據的第二位如果與1相同,該位置0,反之出1,因此實現取反,輸出數據保存在ODR,每執行一次輸出數據的第二位取反一次。
10、GPIO配置速度
問:stm32中的GPIO如果設置成了輸入模式,還需要配置GPIO_Speed麼?
答:輸入模式可以不用配置速度,但是輸出模式必須確定最大輸出頻率。


11、stm32 GPIO輸入電平檢測
問:GPIO兩個引腳,模式都初始化爲輸入弱上拉,給其中一個引腳接4.7V的電壓,IDR對應的值爲1;給另一個引腳接5.13V的電壓,IDR對應的值卻爲0;
答:檢查一下是否使能了相應GPIO的時鐘,是否有這樣一句RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);有它就使能了,否則讀出的值不可預測。
12、關於STM32中GPIO寄存器IDR和ODR數據
問:STM32中GPIO寄存器IDR和ODR數據是不是同步的?爲什麼我用GPIO_SetBits函數設置管腳的時候,IDR和ODR同時改變,怎麼使得只改變ODR的數據,而不改變IDR的數據?謝謝!
答:IDR寄存器的數據時實時反映IO口的狀態,當然設置ODR,IO的狀態也跟着改變,除非強制人爲地設置。比如,ODR設置爲1,而強制將對應的IO口接地,這時IDR就和ODR不一致;或者將ODR設置0,而強制降對應IO口接VCC,這時也不一致。


13、用STM32,有六個GPIO口(不在同一組)要相同信號輸出,請問怎麼設置?
問:例如GPIOE的pin10重映射到TIM1,設置好TIM1的PWM信號輸出;其他的IO口如GPIOA的pin5、GPIOA的pin6、GPIOB的pin5、GPIOB的pin6、GPIOC的pin5也要輸出與GPIOE的pin10相同的信號,請問大俠怎麼設置?
答:用定時器中斷吧,把PWM的脈寬配置成定時中斷,把GPIO引腳都配置好,相應時鐘都使能,然後到定時器中斷函數中做相同的處理。


14、關於GPIO_WriteBit與GPIO_SetBits
問:GPIO_WriteBit與GPIO_SetBits有什麼區別
答:可以用man命令查看區別
man ioctl :
NAME
       ioctl - control device
man write :
NAME
       write - write to a file descriptor


15、關於GPIO_InitTypeDef GPIO_InitStructure
問:這句話什麼意思?
答:聲明一個結構體,名字是GPIO_InitStructure,結構體原型由GPIO_InitTypeDef 確定,stm32裏面初始化GPIO用的吧。。設置完了GPIO_InitStructure裏面的內容後在GPIO_Init (GPIO_TypeDef 。
*GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)裏面調用,比如初始化pa口,就是GPIO_Init (GPIOA, &GPIO_InitStructure),括號裏後面那個就是你問題裏面聲明的那個結構體。


16、關於 STM32的IO口能不能像51的IO口那樣直接控制Px口輸出
問:大家好,STM32的IO口能不能像51的IO口那樣直接控制Px口輸出?比如我要用51控制器段數碼管,只要給Px口送十六進制數值就可以了?請問STM32可以嗎?
答:可以的,舉2個例子:GPIO0->BRR = 0x55;GPIO1->BSRR = 0x55;這其中的GPIOx表示IO號的號碼,BRR/BSRR表示相就IO口的控制寄存器,就按這個格式操作就行了。


 17、關於stm32芯片IO端口配置
問:stm32芯片 IO端口配置爲浮空輸入時,能不能讀取端口上的電平狀態。
答:STM32的輸入狀態寄存器GPIOx_IDR和輸出狀態寄存器和GPIOx_ODR的讀取是不受端口配置影響的。 
 
18、stm32 JTAG和普通IO複用問題
 
問:stm32 JTAG和普通IO複用,當軟件設置爲普通IO時,還能用JTAG下載軟件嗎。
答:能。因爲在下載的時候,通過RESET時序進入了下載模式了。但是注意硬件的接法不要強制拉高拉低,也不要讓其芯片的輸出腳接過來。這樣就會影響到jtag了。
 


發佈了53 篇原創文章 · 獲贊 237 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章