簡體   English   中英

使用程序集在 STM32F103 上配置 GPIO 時出現問題

[英]Problem configuring the GPIO on STM32F103 using assembly

我的目標是為打開 PB1 LED 的 STM32F103 編寫裸機匯編代碼。

我遵循的步驟如下:

1. 啟用 RCC_APB2ENR 注冊表中的 IOPB 位 3,該注冊表具有從 RCC 基地址 0x40021000 重置的 0x18 地址。 (此注冊表的重置值為 0x00000000)

2、在GPIO_CRL注冊表中為PB1啟用CNF1(00):7-6 bits和MODE1(10):5-4bits,復位值為0x44444444,其地址為GPIO_BASE地址0x40010C00偏移0x0。 此配置將端口設置為通用 output 推挽式,最大速度為 2MHz。

3. 設置 GPIOx_ODR 注冊表中的 bit 1 - ODR1,它是 GPIO_BASE 的 0x0C 偏移量,其復位值為 0x00000000。
 stack_size EQU 0x400; 0x400 = 1024 byte = 1kB stack_start EQU 0x20000000 + stack_size gpiob_base EQU 0x40010C00 rcc_base EQU 0x40021000 rcc_apb2enr EQU rcc_base+0x18 gpio_crl EQU gpiob_base gpiob_odr EQU gpiob_base+0x0C PRESERVE8 THUMB AREA RESET, DATA, READONLY DCD stack_start DCD __mainCode AREA |.text|, CODE, READONLY ENTRY __mainCode PROC LDR R0, =rcc_apb2enr LDR R1, [R0] LDR R2, =0x4 ORR R1, R2 STR R1, [R0]; Configure GPIO_CRL LDR R0, =gpio_crl LDR R1, [R0] LDR R2, =0xFFFFFF00 AND R1,R1,R2 ORR R1, R1, #0x20 STR R1, [R0]; Reset register; Configure GPIOB_ODR LDR R0, =gpiob_odr LDR R1, [R0] ORR R1, #0x2 STR R1, [R0] NOP ENDP ALIGN END

不幸的是,代碼沒有打開。 我已經調試了代碼並注意到以下內容。

  1. 重置后 GPIO_CRL 的值必須是 0x44444444,但它是 0x44444844

在此處輸入圖像描述

  1. GPIO_ODR 注冊表值必須為 0x00000000 但它也是 0x00000001 在我將此值與 0x2 進行 ORR 並希望將其存儲回其注冊表地址 0x40010C0C 后,其值保持 (0x00000001) 不變。

在此處輸入圖像描述

請告知我的代碼有什么問題,我該如何解決?

只要寄存器中有多位參數,我就會養成先清除它們然后應用所需的非零值的習慣。

如果設置零值,則無需清除它們。 你已經在清理它了。

這是我使用的示例代碼。

////Clearing the bit masks. Need to keep it a practice at all multibit parameters
GPIOA->CRL=(GPIOA->CRL & ~((3U<<GPIO_CRL_CNF7_Pos) | (3U<<GPIO_CRL_CNF5_Pos)))
        | (2U<<GPIO_CRL_CNF7_Pos) | (2U<<GPIO_CRL_CNF5_Pos);//setting desired values

在上面的代碼中,我想將 PA7 和 PA5 的配置設置為備用端口 function(推挽)。

所以我清除了這些位,然后設置了所需的值。

如果我想在這些位中設置一個零,那么我可以簡單地寫如下(為 PC13 編寫)

GPIOC->CRH |= (GPIOC->CRH & ~(1U<<GPIO_CRH_CNF13_Pos)) | (2U<<GPIO_CRH_MODE13_Pos);     //LED PIN

暫無
暫無

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

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