簡體   English   中英

STM32CubeMX I2C 代碼寫入保留寄存器位

[英]STM32CubeMX I2C code writing to reserved register bits

我正在 STM32F74 系列處理器上開發 I2C 驅動程序。 我正在使用 STM32CubeMX 低級驅動程序,我無法理解為 I2C 啟動和停止寄存器值 (CR2) 生成的定義。

代碼在stm32f7xx_ll_i2c.h中生成,如下。

/** @defgroup I2C_LL_EC_GENERATE Start And Stop Generation
 * @{
 */
 #define LL_I2C_GENERATE_NOSTARTSTOP         0x00000000U
 /*!< Don't Generate Stop and Start condition. */
 #define LL_I2C_GENERATE_STOP                (uint32_t)(0x80000000U | I2C_CR2_STOP)
 /*!< Generate Stop condition (Size should be set to 0).      */
 #define LL_I2C_GENERATE_START_READ          (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN)
 /*!< Generate Start for read request. */

我的問題是為什么這些定義中包含第 31 位? (0x 8 0000000U)。 參考手冊 (RM0385) 指出“位 31:27 保留,必須保持在復位值。”。 我無法決定是修改生成的代碼還是保留 31 位。 我很樂意接受建議,無論這更有可能是需要的東西,還是我會通過寫入保留位來破壞事情。 來自 RM0385 的寄存器位圖 (I2C_CR2) 的圖像

提前致謝!

我在這里猜測是因為誰知道圖書館作者的想法? (如果您查看源代碼,則不是很多!)。 但我猜想在調用 LL 函數時檢查是否使用了指定的宏是一個“骯臟的技巧”。

然而,它存在嚴重缺陷,因為“技巧”僅適用於 Cortex-M3/4 STM32 變體(例如 F1xx、F2xx、F4xx),其中 I2C 外設非常不同,並且 I2C_CR2 等寄存器只有 15 位寬。

訣竅是庫函數具有參數檢查斷言,例如:

assert_param(IS_TRANSFER_REQUEST(Request));

IS_TRANSFER_REQUEST的定義如下:

#define IS_TRANSFER_REQUEST(REQUEST)    (((REQUEST) == I2C_GENERATE_STOP)        || \
                                         ((REQUEST) == I2C_GENERATE_START_READ)  || \
                                         ((REQUEST) == I2C_GENERATE_START_WRITE) || \
                                         ((REQUEST) == I2C_NO_STARTSTOP))

這迫使您使用 LL 定義的宏作為參數,而不是一些自定義或計算的掩碼,因為它們都具有“未使用”的檢查位。

如果這確實是原因,那么沒有設想更新的 I2C 外設是一種不明智的做法。 您可能會認為該位在寫入寄存器之前已從參數中刪除。 我查過了,不是。 如果你會在每次通話時支付開銷,這也是不可取的。

作為一種錯誤檢測技術,如果它是這樣的話,它甚至沒有被一致地應用; 例如,所有 GPIO_PIN_xx 宏都是 16 位寬,並且由於它們是掩碼而不是引腳編號,因此使用位 31 可以例如防止傳遞實際上需要掩碼1<<10的文字引腳編號 10。 傳遞 10 指的是引腳 3 和 1 而不是 10。老實說,這個錯誤比傳遞錯誤的 I2C 傳輸請求類型更有可能發生。

最后,“保留”通常意味着“未使用但可能在未來的實現中使用” ,並且要求您使用“重置值”是確保前向二進制兼容性的一種方式。 如果你有這樣的設備,毫無疑問會有相應的庫更新來支持它——但它需要重新編譯代碼。 如果您嘗試在使用此位的較新的不兼容部件上運行此二進制文件,則風險很低,並且可能只是一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM