設置 | 登錄 | 註冊

目前共有3篇帖子。

【程序示例】使用位帶操作法操作GPIOC的I/O口

1樓 巨大八爪鱼 2017-2-20 20:21

#include <stm32f10x.h>


void delay(void)
{
    uint32_t i;
    for (i = 0; i < 2000000; i++);
}


int main(void)
{
    *(uint32_t *)0x42420310 = 0x01; // RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
   
    /* GPIOC->CRH = 0x00300000; */
    *(uint32_t *)0x422200d0 = 0x01;
    *(uint32_t *)0x422200d4 = 0x01;
   
    while (1)
    {
        *(uint32_t *)0x422201b4 = 0x01; // GPIOC->ODR = 1 << 13;
        delay();
        *(uint32_t *)0x422201b4 = 0x00; // GPIOC->ODR = 0;
        delay();
    }
}

2樓 巨大八爪鱼 2017-2-20 20:34

首先看RCC->APB2ENR |= RCC_APB2ENR_IOPCEN。這句話是把RCC中的APB2ENR寄存器的第4位置1。在RM0008-PDF手冊(STM32F103的參考手冊)上的第3.3節表3中可查到RCC的首地址為0x40021000,末五位為0x21000。
在第七章的最後一部分7.3.11 RCC register map里可以查到RCC_APB2ENR的偏移量為0x18,兩者相加得到0x40021018,末五位為0x21018。

根據位帶公式,位帶地址=位帶區開始地址+32*寄存器地址總偏移量+位號*4
由STM32F103的編程手冊的2.2.5節的表14可知,以0x400開頭的寄存器的位帶區的開始地址為0x42000000。
寄存器地址總偏移量=末五位0x21018,乘上32就是先乘2,然後在末尾添一個0。乘上2後是0x42030(注意0x18*2=0x30),添零後得到0x420300
位號*4=4*4=16=0x10
0x420300+0x10=0x420310
把這幾個數相加,得到位帶地址0x42000000+0x420310=0x42420310
然後即可寫出把這個位帶寄存器1的代碼:
*(uint32_t *)0x42420310 = 0x01;

置1是0x01,清0是0x00。

3樓 巨大八爪鱼 2017-2-20 20:35
對於GPIOC->CRH = 0x00300000,是把CRH寄存器的第20位和第21位置1,所以相應就有兩條語句。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。