История изменений
Исправление COKPOWEHEU, (текущая версия) :
- Поскольку считать все вручную лень, оформим в виде макроса (надеюсь, не надо объяснять откуда в коде взялись 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, :
- Поскольку считать все вручную лень, оформим в виде макроса (надеюсь, не надо объяснять откуда в коде взялись 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;