Вс фев 03, 2019 17:00:07
Вс фев 03, 2019 18:29:17
Вс фев 03, 2019 20:11:18
По поводу 70KB - это только при нулевой оптимизации и использовании наследования, так что не слишком страшно, но, как по мне, странно.
Вс фев 03, 2019 23:38:47
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
Stm32Gpio <GPIOA, 1<<8> led0; // ошибка
Stm32Gpio <(GPIO_TypeDef *)0x40010800, 1<<8> led1; // таже самая ошибка
GPIO_TypeDef GPIO_1;
Stm32Gpio <&GPIO_1, 1<<8> led2; // а вот это, хоть и бессмысленно, но компилируется
template<uint32_t pin, uint32_t af = 0>
using PinX = PinT<I2C1_BASE, pin, af>;
Пн фев 04, 2019 02:21:22
PS Ваш вариант использовать GPIOx_BASE мне не очень нравится потому что обязывает заранее создать шаблоны для всех GPIO, что по сути дублирует CMSIS.
Pin<'A', 1> led;
enum {PA, PB, PC... };
Gpio<PB, 0x0FF0> port8;
Пн фев 04, 2019 17:34:58
Pin<'A', 1> led;
enum {PA, PB, PC... };
Gpio<PB, 0x0FF0> port8;
class Test
{
public:
constexpr Test (uint16_t number) : m_number(number) {}
void setNumber (uint16_t number) {m_number = number;}
private:
uint16_t m_number;
};
Test A(15); // Объект в оперативной памяти
A.setNumber (10); // Изменить значение можно
const Test B1(15); // Объект всеравно в оперативной памяти
const Test B2(<имя объекта>.getValue();) // Зато можно инициализировать чем угодно, через тот же USART
B1.setNumber (10); // Ошибка
constexpr Test C1 (15); // Объект находится во флеше
constexpr Test B2(<имя объекта>.getValue();) // По понятным причинам так уже сделать не получится
class Test
{
public:
constexpr Test (GPIO_TypeDef *number) : m_number(number) {}
private:
GPIO_TypeDef *m_number;
};
constexpr Test A(GPIOA); // Error: constexpr variable 'A' must be initialized by a constant expression
Пн фев 04, 2019 20:32:47
class Gpio
{
public:
auto base() const { return (GPIO_TypeDef*)gpio; }
constexpr Gpio(int gpio, uint16_t pinsMask) : gpio(gpio), pinsMask(pinsMask) {}
void write(uint16_t value) const { base()->BSRR = (pinsMask << 16) | value; }
private:
int gpio;
uint16_t pinsMask;
};
constexpr Gpio g1(GPIOA_BASE, 0x0FF0);
g1.write(123);
constexpr auto mask = pinsMask;
if constexpr (pinsMask & 0x00FF)
{
static constexpr uint32_t mask = qmask(pinsMask);
base()->CRL = base()->CRL & ~mask | (uint32_t(mode) & mask);
}
if constexpr (pinsMask & 0xFF00)
{
static constexpr uint32_t mask = qmask(pinsMask >> 8);
base()->CRH = base()->CRH & ~mask | (uint32_t(mode) & mask);
}
Вт фев 05, 2019 22:15:52
static void set() { base()->BSRR = pinMask; }
static void clear() { base()->BSRR = 0x10000 << pin; } // Почему не base()->BRR = pinMask; ?
Вт фев 05, 2019 22:47:29
И ещё один вопрос, весьма наивный, но вдруг) В векторе прерываний на каждое прерывание отводится по 4 байта, ровно под указатель на обычную C функцию. Я правильно понимаю, что вызов метода класса (не статический) туда не впихнуть, ибо он банально не влезет в 4 байта?
Пт фев 08, 2019 17:23:32
#define _always_inline_ __attribute__((always_inline))
Пт фев 08, 2019 17:50:38
#define _inline_ __attribute__((always_inline)) inline
Сб фев 09, 2019 18:47:38
#include <cstdint>
uint32_t A = 0; // Ок
// Но в моём понимании, тут должна выдаваться ошибка, т.к. uint32_t
// должен находиться в пространстве имён std, но это компилируется
std::uint32_t B = 0; // Ок
using std::uint32_t; // Ок
uint32_t C = 0; // Ок
В GCC с сайта ARM год исправили на 2018))Copyright (C) 2007-2017 Free Software Foundation, Inc.
Вс фев 10, 2019 06:21:48
Вс фев 10, 2019 14:17:08
Ср фев 20, 2019 18:34:36
Пн фев 05, 2024 12:08:14
Доброго дня! если не трудно подскажите по компилятору версии 6 в последних версиях Keil. При компиляции проекта не находит элемент IP в misc.c.C:/Users/New/AppData/Local/Arm/Packs/Keil/STM32F1xx_DFP/2.4.1/Device/StdPeriph_Driver/src/misc.c(131): error: no member named 'IP' in 'NVIC_Type'
Пн фев 05, 2024 17:38:24