Суть проблемы.
В проекте подключил библиотеку stm32tpl (крайняя версия) и объявил согласно инструкции:
в main.cpp:
Код
typedef Pin<'E', 1, 'H', PIN_SPEED_VERY_LOW> PIN_BL;
...
void main()
{
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOEEN; // AHB1, 50 MHz
PIN_BL::Mode(OUTPUT);
OS::run();
}
линкер ругается:
Error[Li005]: no definition for "Pin<(char)69, (int)1, (char)72, (PinSpeed)0>::GPIOx" [referenced from D:\prj\scm_3\iar\Debug\Obj\main.o]
Методом возгонки и последующей абсорбции выделил следующее:
в шаблоне структуры не создаётся указатель на GPIOx, который используется в дальнейшем функциями структуры.
Код
template<char port, int pin_no, char activestate, PinSpeed speed>
struct Pin
{
static const uint32_t pin = pin_no;
static const uint32_t port_no = port-'A';
static const uint32_t shift = pin;
static const uint32_t shift_x2 = pin * 2;
static const uint32_t shift_x4 = (pin % 8) * 4;
static const uint32_t mask = 1UL << shift;
static const uint32_t mask_x2 = 3UL << shift_x2;
static const uint32_t mask_x4 = 0xFUL << shift_x4;
static const uint32_t clearmask = 1UL << (pin + 16);
enum { GPIOx_BASE = port_gpio_t<port>::GPIOx_BASE };
static struct
{
GPIOxTypeDef* operator-> () { return (GPIOxTypeDef*)GPIOx_BASE; }
}GPIOx;
...
INLINE static void SetMode(PinMode mode)
{
GPIOx->MODER = (GPIOx->MODER & ~mask_x2) | (mode << shift_x2); // Линкер выдаёт ошибку
// ((GPIOxTypeDef*)GPIOx_BASE) -> MODER = (((GPIOxTypeDef*)GPIOx_BASE) -> MODER & ~mask_x2) | (mode << shift_x2); // Линкер НЕ выдаёт ошибку
}
Если использовать закомментированный код, то линкер не ругается.
Подскажите, куда копать?