LINUX.ORG.RU

История изменений

Исправление COKPOWEHEU, (текущая версия) :

С вашего позволения распишу как переводить bit-band в нормальные адреса. Картинку вы уже показывали, остается только оформить в виде алгоритма.

Согласно документации смещение для записи бита X в регистр по смещению Y равен A = Y∙32 + X∙4. Для RCC_APB2ENR |= RCC_APB2ENR_GPIOCEN, оно же RCC_APB2ENR |= (1<<4) получаем:

0x40000000 - PERIPH_BASE
   0x20000 - AHBPERIPH_BASE = (PERIPH_BASE + 0x20000)
    0x1000 - RCC_BASE       = (AHBPERIPH_BASE + 0x1000)
(6*4 = 0x18) - все регистры в структуре 4-байтные, а APB2ENR идет шестым
Убираем смещение 0x40000000
   0x21018 - X (Смещение нужного нам регистра)
Y = 4 (бит, который мы выставляем)
A = 0x21018*32 + 4*4 = 0x420310
Чтобы получить абсолютный адрес добавляем смещение 0x42000000
Addr = 0x42420310 - вроде похоже

Теперь обратно. Здесь есть фокус что регистры 32-битные, а адресация побайтная. Значит, адрес (и смещение) делятся на 4.

Y = trunc( A / 32 / 4 ) * 4
X = ( A - Y*32 ) / 4

A = 0x420310
Y = 0x21018
X = 4

Ну а из адреса получить имя регистра уже несложно.

Исходная версия COKPOWEHEU, :

С вашего позволения распишу как переводить bit-band в нормальные адреса. Картинку вы уже показывали, остается только оформить в виде алгоритма.

Согласно документации смещение для записи бита X в регистр по смещению Y равен A = Y32 + X4. Для RCC_APB2ENR |= RCC_APB2ENR_GPIOCEN, оно же RCC_APB2ENR |= (1<<4) получаем:

0x40000000 - PERIPH_BASE
   0x20000 - AHBPERIPH_BASE = (PERIPH_BASE + 0x20000)
    0x1000 - RCC_BASE       = (AHBPERIPH_BASE + 0x1000)
(6*4 = 0x18) - все регистры в структуре 4-байтные, а APB2ENR идет шестым
Убираем смещение 0x40000000
   0x21018 - X (Смещение нужного нам регистра)
Y = 4 (бит, который мы выставляем)
A = 0x21018*32 + 4*4 = 0x420310
Чтобы получить абсолютный адрес добавляем смещение 0x42000000
Addr = 0x42420310 - вроде похоже

Теперь обратно. Здесь есть фокус что регистры 32-битные, а адресация побайтная. Значит, адрес (и смещение) делятся на 4.

Y = trunc( A / 32 / 4 ) * 4
X = ( A - Y*32 ) / 4

A = 0x420310
Y = 0x21018
X = 4

Ну а из адреса получить имя регистра уже несложно.