最近對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 傳輸到施密特觸發器 ...