LINUX.ORG.RU

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

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

  1. Поскольку считать все вручную лень, оформим в виде макроса (надеюсь, не надо объяснять откуда в коде взялись 0x4000’0000 и 0x4200’0000). ВНИМАНИЕ! С этого момента начинается мой затуп:
#define BB_PERIPH( addr, bit ) (*((uint32_t*)( 0x42000000 + (addr-0x40000000)*32 + bit*4 )))
...
BB_PERIPH( RCC_APB2ENR, 3 ) = 1;

Проверяем - не работает. Вспоминаю, что RCC_APB2ENR оформлен как приведение типов. Попробуем вместо макропеременной подставить число 0x40021018:

#define BB_PERIPH( addr, bit ) (*((uint32_t*)( 0x42000000 + (0x40021018-0x40000000)*32 + bit*4 )))
...
BB_PERIPH( RCC_APB2ENR, 3 ) = 1;

А вот так уже работает. Значит, проблема приведения типов. Надо из «переменной» получить адрес и привести его к uint32_t:

#define BB_PERIPH( addr, bit ) (*((uint32_t*)( 0x42000000 + ((uint32_t)&(addr)-0x40000000)*32 + bit*4 )))
...
BB_PERIPH( RCC_APB2ENR, 3 ) = 1;

Вот теперь работает

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

  1. Поскольку считать все вручную лень, оформим в виде макроса (надеюсь, не надо объяснять откуда в коде взялись 0x4000’0000 и 0x4200’0000). ВНИМАНИЕ! С этого момента начинается мой затуп:
#define BB_PERIPH( addr, bit ) (*((uint32_t*)( 0x42000000 + (addr-0x40000000)*32 + bit*4 )))
...
BB_PERIPH( RCC_APB2ENR, 3 ) = 1;

Проверяем - не работает. Вспоминаю, что RCC_APB2ENR оформлен как приведение типов. Попробуем вместо макропеременной подставить число 0x40021018:

#define BB_PERIPH( addr, bit ) (*((uint32_t*)( 0x42000000 + (0x40021018-0x40000000)*32 + bit*4 )))
...
BB_PERIPH( RCC_APB2ENR, 3 ) = 1;

А вот так уже работает. Значит, проблема приведения типов. Надо из «переменной» получить адрес и привести его к uint32_t:

#define BB_PERIPH( addr, bit ) (*((uint32_t*)( 0x42000000 + ((uint32_t)&(addr)-0x40000000)*32 + bit*4 )))
...
BB_PERIPH( RCC_APB2ENR, 3 ) = 1;