Цитата(AHTOXA @ Apr 21 2017, 19:16)
Может, так:
Код
static constexpr TIM_TypeDef* TIM() { return TIM2; }
?
Надо, конечно, глянуть потом, сработал ли constexpr. Но по крайней мере не ругается
Спасибо большое!!
Проверил на 5-м gcc (5.4 2016q3 от ARM.com).
Он ест оба варианта, содержимое бинарника идентичное.
6-му gcc этот вариант тоже подходит.
Цитата(AHTOXA @ Apr 21 2017, 19:16)
А если не привязываться к constexpr, то можно сделать вот так:
Код
struct SomeClass
{
struct TIMx
{
TIM_TypeDef* operator->() { return TIM2; }
};
};
Тогда можно писать
Код
SomeClass::TIMx->CR = 0;
У меня не получилось, ругается невнятными словами. Ну да ладно.
Следующий вопрос, если Вы не против.
Ещё у меня есть конструкция
static PeriphBit<(uintptr_t)&EXTI->IMR, EXTI_IMR_MR1> ExtiUnmaskIRQ;
Откуда я её взял (слегка доработав), думаю, Вы узнаете
Код
// возвращает номер старшего бита
constexpr int8_t mask2bit (uint32_t val)
{
return (val > 1) ? ( mask2bit (val/2) + 1 ) : 0;
}
enum
{
pPERIPH_BASE = 0x40000000UL, // Peripheral base address
pPERIPH_BB_BASE = 0x42000000UL, // Peripheral base address in the bit-band region
pSRAM1_BB_BASE = 0x22000000UL, // SRAM1(112 KB) base address in the bit-band region
pSRAM2_BB_BASE = 0x2201C000UL // SRAM2(16 KB) base address in the bit-band region
};
/**
* Peripheral bit - bit-band accessed bit.
* @param addr peripheral address
* @param bit_mask mask of requested bit. Важно! в маске должен быть только ОДИН бит!
*/
template <uintptr_t addr, uint32_t bit_mask> struct PeriphBit
{
enum { BIT = mask2bit(bit_mask) };
enum { BB_ADDR = pPERIPH_BB_BASE + (addr - pPERIPH_BASE) * 32 };
uint32_t operator=(uint32_t value)
{ ((volatile uint32_t*)BB_ADDR)[BIT] = (bool)value; return value; }
operator uint32_t()
{ return ((volatile uint32_t*)BB_ADDR)[BIT]; }
};
Может, тоже подскажете, как доработать?..