STM32 GPIO輸出高低電平轉換速率測試

2021-06-26 00:18:10 字數 1372 閱讀 3787

最近對stm32 gpio的輸出端高低電平變化速率產生興趣,於是用我所知道的控制gpio的不同方法做了測試。

微控制器cpu:stm32f103zet6

軟體平台:keil mdk

邏輯分析儀:金沙灘 la2016

源程式[code=c]#include "stm32f10x.h"

#define pa0  gpioa ->odr

//位繫結操作開始

#define gpioa_odr_addr (gpioa_base + 0x0c)  //0x0c是odr的位址偏移,見資料手冊

#define gpioa_idr_addr (gpioa_base + 0x08)    //0x08是idr的位址偏移

#define bitband(addr,bitnum)  *(volatile unsigned long *)((addr&0xf0000000)+0x02000000 + ((addr&0xfffff)<<5) + (bitnum<<2) )

#define paout(n)   bitband(gpioa_odr_addr,n)

#define pain(n)    bitband(gpioa_idr_addr,n)

//位繫結結束,如要繫結其他io口,只需把gpioa換成gpiob  gpioc.....gpiof即可,n(0~31)表示第幾個io

u32 *pao0 = (u32 *)(0x42000000+(0x40000000 + 0x10000      + 0x0800  +  0x0c -0x40000000 )*32+4*0);

u32 *pai0 = (u32 *)(0x42000000+(0x40000000 + 0x10000      + 0x0800  +  0x08 -0x40000000 )*32+4*1);

int main(void)

return(1);

}[/code]

測試結果截圖

[img=

[img=

[img=

[img=

[img=

[img=

從圖中看出,最快的是

gpioa ->odr = 0x1;  gpioa ->odr = 0x0;

和   pa0 = 0x01;pa0 = 0x00;   

和   gpioa ->bsrr = 0x01;         gpioa ->brr = 0x01; 

轉換週期是220ns,4.55mhz

最慢的是  *pao0 = !*pao0 ;  和  pa0 =!pa0;  取反操作浪費不少時間

轉換週期是900ns  1.11mhz

用位繫結函式操作最方便,速度稍微慢一點,是320ns,見最後一張圖

如果有更快的操作方法請指教。

R40gpio輸出無高低電平變化 原創

在配置gpio控制繼電器時,其中有幾個在gpio傳送高低電平繼電器沒有變化,測試繼電器是好的,於是用萬用表測io,發現推送高低電平時,沒有發生改變。幾經折騰,發現該組pg的電源沒開,硬體同事找到該組gpio的電源用的是dldo3 於是找到sys config.fex裡面的電源選項power sply...

STM32GPIO部分介紹

最近在老師交給了乙個專案,需要用到stm32微控制器,這裡就在學習的過程中所注意到的一些地方或細節部分記錄了下來,筆者所使用的是stm32f407zgt6晶元 探索者 檢視晶元的資料手冊 這個 對每個i o口的功能進行了很詳細的介紹。每個i o除了作為i o使用外,還可以作為其他的復用。已以pe2口...

STM32 GPIO模式總結

4種輸入模式 浮空輸入 上拉輸入 下拉輸入 模擬輸入 4種輸出模式 開漏輸出 復用開漏輸出 推挽輸出 復用推挽輸出 3種最大輸出速度 2mhz 10mhz 50mhz 浮空輸入模式 1 外部通過io口輸入電平,外部電平通過上下拉部分 浮空模式下都關閉,既無 上拉也無下拉電阻 2 傳輸到施密特觸發器 ...