目前共有3篇帖子。 內容轉換:不轉換▼
 
點擊 回復
380 2
【程序示例】使用位带操作法操作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,所以相应就有两条语句。

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:380 回複數:2
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2017-2-20 20:35
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。