stm32的IO端口都是16位的, 如果要單獨操作某高8位或低8位, 則不是那么簡單, 先看兩張BSRR/BRR寄存器的圖:
據官方數據手冊上面說, 這兩個寄存器用于專門對ODR進行原子操作的位操作, 都是在置1的時候對某位有影響.
舉例說下怎么對IO端口賦值:
1.對高8位/低8位/全部清零
很明顯, 這個只需要操作BRR寄存器即可:
對高8位清零:GPIOA->BRR = 0xFF00
對低8位清零:GPIOA->BRR = 0x00FF
全部清零: GPIOA->BRR = 0xFFFF 或 GPIOA->ODR = 0x0000
當然了, 使用下面2,3的兩個宏也可以完全該清零操作~ stm32固件庫是不是應該加上這兩個宏/函數?
2.對低8位置數
涉及到置數, 這個就是操作BSRR寄存器了
比如要使端口A的低8位為 0x55 (01010101B), 那么對于BSRR這個32位寄存器來說:
低16位應該置為 0000 0000 0101 0101, 這個就等于 0x55, 置1使某位為1, 置0的位不影響原來的值
高16位應該置為 0000 0000 1010 1010, 這個就等于 ~0x55(即取反)的結果, 置1使某位為0, 置0不影響原來的值
這樣, BSRR寄存器的值就是 0000 0000 1010 1010 0000 0000 0101 0101, 兩部分的高8位均為0, 所以不會影響到IO口的高8位
總結, 以下的宏實現對某端口的低8位置數, 不影響高8位:
#define GPIO_WriteLow(GPIOx,a) GPIOx->BSRR=(((uint32_t)(uint8_t)~(a))<<16)|((uint32_t)(uint8_t)(a))
3.對高8位置數
這個和單獨對低8位置數其實是一樣的, 只是設置的位不一樣罷了
同樣, 要使高8位為0x55, 那么:
低16位應該置為 0101 0101 0000 0000
高16位應該置為 1010 1010 0000 0000, 同樣是取反的結果; 不影響低8位的數據
這樣, BSRR寄存器的值就是 1010 1010 0000 0000 0101 0101 0000 0000, 可以看出, 其實它就是上面那個結果左移8位
總結, 以下的宏實現對某端口的高8位置數, 不影響低8位:
#define GPIO_WriteHigh(GPIOx,a) GPIOx->BSRR=(((uint8_t)(uint8_t)~(a))<<24)|(((uint32_t)(uint8_t)(a))<<8)
大家不用擔心效率問題, 上面那兩個宏最終的結果就是 GPIOx->BSRR=value 的形式, 所以擔心是多余的
上一篇:基于STM32和CPLD可編程邏輯器件的等精度測頻
下一篇:STM32-通用定時器基本定時功能
推薦閱讀
史海拾趣
風華高科自成立以來,一直注重技術創新和產品多元化發展。公司不斷投入研發資源,成功開發出多種新型電子元器件和電子材料,如片式電阻器、片式電感器、超小型鋁電解電容器等。這些產品廣泛應用于通訊、消費、計算機、汽車電子等領域,滿足了市場多樣化的需求。同時,公司還建立了完善的質量管理體系,確保產品質量符合國際標準。
Heatron LED Integration深知品質對于產品的重要性,因此從原材料采購到生產制造,每一環節都嚴格把關。公司建立了完善的質量管理體系,確保每一款LED產品都能達到國際最高標準。同時,公司還注重產品的性能優化,通過不斷的研發和技術升級,提升產品的發光效率和使用壽命。這種對品質和性能的雙重追求,使得Heatron LED Integration的產品在市場上享有極高的聲譽。
在1968年,電子行業正迎來一場技術革新。在這個充滿機遇的時代,CML Microcircuits公司應運而生。初創時期的CML專注于研發單芯片解決方案,而不是傳統的標準組件組合。這一創新理念使CML在行業中脫穎而出。公司的第一個產品——頻率敏感開關,憑借其卓越的性能和可靠性,迅速贏得了市場的認可。這款產品不僅銷售了30多年,而且至今仍在某些應用中發揮著關鍵作用。
在1968年,電子行業正迎來一場技術革新。在這個充滿機遇的時代,CML Microcircuits公司應運而生。初創時期的CML專注于研發單芯片解決方案,而不是傳統的標準組件組合。這一創新理念使CML在行業中脫穎而出。公司的第一個產品——頻率敏感開關,憑借其卓越的性能和可靠性,迅速贏得了市場的認可。這款產品不僅銷售了30多年,而且至今仍在某些應用中發揮著關鍵作用。
作為一家領先的電子公司,因美納深知自己的社會責任。公司積極參與各種公益活動,推動基因測序技術在醫療、環保等領域的應用。同時,因美納還注重可持續發展,通過采用環保材料、優化生產流程等方式降低對環境的影響。這種積極履行社會責任和推動可持續發展的做法贏得了社會各界的廣泛贊譽。
Asia Electronics Ind Co Ltd自成立以來,一直致力于電子技術的研發與創新。公司投入大量資源用于研發,不斷推出具有市場競爭力的新產品。其中,公司成功開發的一款高效能、低功耗的電子產品,在市場上獲得了廣泛的認可。這款產品不僅滿足了消費者對性能的需求,還順應了綠色環保的發展趨勢,為公司贏得了良好的口碑。
0 引 言 電子研發工程師最常采用的EMI/EMC防范措施不外乎是屏蔽、濾波、接地和布線,但是隨著電子系統的集成化,在考慮成本、質量、功能,又要兼顧產品推出速度的要求下,工程師們必須在設計初始階段就展開EMI/EMC預測分析和設計,避免在研發后 ...… 查看全部問答∨ |
|
本期精彩內容包括如下主題: 放大器 • 運算放大器的增益穩定性,第 1 部分:總體系統分析• 壓電傳感器的信號調節• 將運算放大器與高速 DAC 進行接口連接,第 3 部分:簡化 DAC 電流源電源管理 • 電池備份存儲系統的電量 ...… 查看全部問答∨ |
|
大家好, 我剛開始使用wince編程,現在總是問題不斷 今天遇到的問題是。我從platform builder中導出的 sdk 然后安裝 使用vs2008建立了一個win32的應用程序,我建立好以后沒有進行修改直接編譯 但是他報了很多錯誤,主要是因為我導出sdk的時候組 ...… 查看全部問答∨ |
有誰幫忙解答一下OS_Sched函數的問題: 我的問題是:執了OS_TASK_SW();函數之后,它會不會返回調用點,接著調用OS_EXIT_CRITICAL();開中斷?我試著在OS_TASK_SW();函數后加調試信息發現它沒有執行調試信息,這樣子的話,由于前面已經調用了關中 ...… 查看全部問答∨ |
我在ST的研討會上得到一個小開發板,它上面的芯片是STM32F100,這個芯片沒有FSMC功能。我想用這個開發板做個MP3,用I/O方式控制TFT屏(這個芯片速度慢會不會有問題),SPI接口給解碼芯片送數據,另一個SIP接口從SD卡里面讀文件數據。這個方案 ...… 查看全部問答∨ |
例程是TI的例程: #include "DSP280x_Device.h" // DSP280x Headerfile Include File #include "DSP280x_Examples.h" // DSP280x Examples Include File // Prototype statements for functions fo ...… 查看全部問答∨ |