Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Перпеключаем светодиод, если был ноль то будет 0 и наобротну ну…
запустить Make утилиту.
prog:
stm32flash -w main.bin /dev/ttyUSB0
prog2:
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "init" -c "reset halt" -c "flash write_image erase main.bin 0x08000000" -c "reset run" -c "exit"prog: $(frmname).bin
openocd -f interface/stlink-v2.cfg -f target/stm32l1.cfg -c "init" -c "reset halt" -c "flash write_image erase "$(frmname).bin" 0x08000000" -c "reset run" -c "exit"
prog2: $(frmname).bin
-stm32flash -j /dev/ttyUSB0
sleep 1
-stm32flash -k /dev/ttyUSB0
sleep 1
-stm32flash -e 0 -w $(frmname).bin /dev/ttyUSB0$ make
$ make prog//Включаем тактирование GPIO I порта, порт номер 8 (очень важно)Магические чиселки — плохая идея. Лучше было объявить макроконстанту #define RCC_AHBENR_GPIOIEN (1<<8) и пользовались ей.
RCC->AHB1ENR |= (1<<8);
//Далее настраиваем режим ножки на «Выход»
GPIOI->MODER |= (1<<2);
//Теперь указываем тип выхода, в данном примере, push-pull, необходимости указывать нет.
//По умолчанию стоит push pull
GPIOI->OTYPER &= ~(1<<1);
//Скорость с которой будет происходить переключение ножки, очень важный парметр при работе с переферией
GPIOI->OSPEEDR |= (2<<2);
#define LED_RED D,1,1
GPIO_config( LED_RED );
GPIO_ON( LED_RED );
GPIO_OFF( LED_RED );Без описания формата регистров вообще непонятно почему в одном случае сдвигаем на 1 бит, а в другом — на два.тут людям надо учится мануал листать. А насчет почему не использовал GPIOI->MODER |= (0b01 << (2*i) ); то это в следующей статье я пройдусь, там будет более гибкая реализация драйвера порта
#define PM_BITMASK(reg, mask, val) do{ reg = (reg &~mask) | (val * (mask &~(mask<<1)) ); }while(0)Разработка под Arduino
typedef struct
{
...
volatile unsigned int DCKCFGR2;
} RCC_Struct;
typedef struct
{
...
volatile uint32_t AFR[2];
} GPIO_Struct;typedef struct
{
...
unsigned int RESERVED0;
...
unsigned int RESERVED1[2];
...
unsigned int RESERVED2;
...
} RCC_Struct;typedef struct
{
...
uint32_t :32;
...
uint64_t :64;
...
uint32_t :32;
...
} RCC_Struct;BLOCK->REG.val = 0x12345678;
BLOCK->REG.bit.STATUS = 0;if (BLOCK->STATUS.bit.READY) {
...
BLOCK->STATUS.bit.READY = 0;
}
vs
if ( BLOCK->STATUS && (1<<READY)) {
BLOCK->STATUS &= ~(1<<READY);
}BLOCK->REG.val = 0x800000001; /* Magic constant */
vs
BLOCK->REG.val = (1<<FIRST | 1<<LAST); /* Mixed style */
vs
/* bits style */
BLOCK->REG.val = 0; /* reset */
BLOCK->REG.bit.FIRST = 1;
BLOCK->REG.bit.LAST = 1;
Инты поправилМожет, это у меня не обновилась страница, но сейчас там unsigned int и тому подобные типы негарантированного размера. Это вы не везде поправили на int32_t и подобные, да?
Насчет битовых полей, я не уверенНе стоит. По крайней мере при взаимодействии с системными файлами. Насколько я надеюсь, вы хотите привести свой «заготовочный» код к стандартному ST-шному. А они битовыми полями не пользуются. То есть если вы сразу жестко на битовые поля завяжетесь, потом придется портировать не только основной код, но и заголовочники.
typedef unsigned int int32_t.Просто там ниже уже про переносимость с архитектур говорят. Вообщем порнография.
А вообще, по-хорошему, стоит использовать даже не uint32_t, а uint_fast32_t.
… вместо нового типа time64_t изменил разрядность time_t поломав двоичную совместимость...
Обещали совметимость на уровне исходного кода
Смысл typedef в возможности определить пользовательский тип.
И что есть критерий нормальности?
Которому из источников будет больше веры?
Да, для переносимости между платформати поменять надо только один typedef.
то правильнее этот тип выразить через typedef
И пока ничего убедительного против такого подхода я не видел.
Потому что это K&R. Им виднее, что они придумали. :)
попробуйте убедить меня что time_t имеет преимущества перед long.
Я предпочитаю верить авторам стандарта.
Сколько запаса даст 64 битный time_t?
Да, переход time_t c 32 на 64 бита прошел
time_t local_time;
typedef struct t_msg {
uint8_t from:4;
uint8_t seq:4;
...
uint32_t remote_time;
...
uint16_t crc16;
} proto_mgs;
...
void do_recv_pkt(proto_msg *msg)
{
time_t remote_time = (time_t)msg->remote_time;
if(local_time < remote_time) {
...
}
}#warning ToDo: this code to long and need reviewесли бы предлагали не long, а int64_t
А выше предложение с long выглядит странной альтернативой. Я очевидно не могу воткнуть его в пакет — это очевидный слом протокольного слоя.
я считаю такие типы машинозависимыми
Пакет в моем понимании это безусловно datagram.
вычислительные мощности позволят сделать его 64-разрядным.
Все же десктопно-серверно-мобильный парк уже 64 разрядный. А отстающим достаточно пересобрать
По части первой — в пакете время uint32_t.
i8051 рулит мотором, и ему глубоко до лампочки до текущего времени в UTC или любом ином формате.
Новомодный IoT уже знает о том, что time_t 64-разрядный.
Да и опять — самому IoT плевать на время.
А вот тянуть до последнего
С чего читерство?
А вот с фискальным накопителем — крайне неудачный пример.
Трекер, камера или замок в ответственном месте тоже будут заменены.
И упомянутый вами принт-сервер. Разве что-то поменяется если его часы собьются?
Вы тут K&R цитировали, а сами в открытую противоречите идеологии UNIX.
И все же это не читерство. Это опыт разработки.
А вы предлагаете именно это. Да еще и с предельно четким дублированием функционала.
Но, боюсь, позиция ваша в меньшинстве.
четко проектировать свои решения
в наше время никому верить нельзя.
Только вот для людей «старой закалки» единственным реально «машинно-независимым» типом данных являются типы c явным указанием размерности.
ssize_t write(int fd, const void *buf, size_t count);int write(int fd, const void *buf, unsigned int count);Я всегда отделяю форматно-, системно-, аппаратно-зависимые куски от основного кода...
xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );И ваши же примеры как раз показывают как сделать новое не сломав старое, а дав ему спокойно доработать свой срок.
BLOCK->REG |= (1<<POS);
BLOCK->REG.bit.POS = 1;А про безусловную модификацию всего регистра я не понял.
Но если есть хотя-бы одна живая переменная — то начинается пережёвывание стека.
Программист пытается обхитрить компилятор, подсовывая ему «хитрые» конструкции, а компилятор считает все это ошибками.
STM32 Часть 3: Первый Проект