Беру следующий чип из бракованной партии. Та же история: в нем что-то было прошито (некоторые светодиоды светились), стояла защита записи. Защиту снял, прошил через st-link, после чего через st-link шиться отказывался: опять включилась защита. Войти в режим бутлоадера и снять защиту с первой попытки не получалось. После повторного снятия защиты все так же, как и у других: st-link долго пытается передавать данные, но отваливается:
Код: Выделить всё
make flash
FLASH blink.bin
/usr/bin/st-flash write blink.bin 0x8000000
st-flash 1.6.0
2021-07-13T21:18:20 INFO common.c: Loading device parameters....
2021-07-13T21:18:20 INFO common.c: Device connected is: F3 device, id 0x10036422
2021-07-13T21:18:20 INFO common.c: SRAM size: 0xa000 bytes (40 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 2048 bytes
2021-07-13T21:18:20 INFO common.c: Attempting to write 612 (0x264) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08000000 erased
2021-07-13T21:18:20 INFO common.c: Finished erasing 1 pages of 2048 (0x800) bytes
2021-07-13T21:18:20 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id
2021-07-13T21:18:20 INFO flash_loader.c: Successfully loaded flash loader in sram
2021-07-13T21:18:24 ERROR flash_loader.c: flash loader run error
2021-07-13T21:18:24 ERROR common.c: stlink_flash_loader_run(0x8000000) failed! == -1
stlink_fwrite_flash() == -1
make: *** [Makefile:137: flash] Error 255
Однако, через бутлоадер вполне прошивалось. И опять те же грабли. Настроил пины:
Код: Выделить всё
static void gpio_setup(void){
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
GPIOA->MODER = GPIO_MODER_MODER8_O | GPIO_MODER_MODER6_O;
GPIOA->ODR = 0;
GPIOB->MODER = GPIO_MODER_MODER0_O | GPIO_MODER_MODER1_O;
GPIOB->ODR = 0;
}
Светодиоды сидят на питании, так что включаются нулем. Пытаюсь погасить так: GPIOA->BRR = 0xffff — не работает, однако вот так: GPIOA->BRR = (1<<6 | 1<<8) — работает. Вот так: GPIOA->ODR = 0 — тоже светодиоды зажигаются.
А теперь — вообще фантастика: если я пишу GPIOB->BSRR = 3<<16 (пауза) GPIOB->BSRR = 3, а код для PORTA оставляю прежним (который мигал до этого), то порт B мигает, а порт А — нет!
Стоит мне закомментировать GPIOB->BSRR = 3, как порт A начинает мигать!! Однако, вот такой код мигает всем:
Код: Выделить всё
for (i = 0; i < 100000; i++) __NOP();
GPIOA->ODR = 0;
GPIOB->ODR = 3;
for (i = 0; i < 100000; i++) __NOP();
GPIOB->ODR = 0;
GPIOA->ODR = (1<<6) | (1<<8);
Теперь меняю GPIOB->ODR = 0 на GPIOB->BSRR = 3. И что я вижу? Светодиоды на PB0/1 один раз вспыхивают (на инициализации), после ODR=3 гаснут и больше не загораются, т.е. GPIOB->BSRR = 3 не сбрасывает их в нуль! Но только я поменяю это на GPIOB->BRR = 3, как все работает!
Запустил это с SysTick, не настроив кварц (этим займусь позже, по мануалу). Мигает:
Код: Выделить всё
static volatile uint32_t blink_ctr = 0;
void sys_tick_handler(void){
++blink_ctr;
}
static void systick_setup(uint32_t xms){
static uint32_t curms = 0;
if(curms == xms) return;
SysTick_Config(6000 * xms);
curms = xms;
}
static void gpio_setup(void){
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
GPIOA->MODER = GPIO_MODER_MODER8_O | GPIO_MODER_MODER6_O;
GPIOA->ODR = 0;
GPIOB->MODER = GPIO_MODER_MODER0_O | GPIO_MODER_MODER1_O;
GPIOB->ODR = 3;
}
int main(void){
gpio_setup();
systick_setup(100);
uint32_t ctr = 0;
while (1){
if(blink_ctr - ctr > 5){
ctr = blink_ctr;
GPIOB->ODR ^= 3;
GPIOA->ODR ^= ((1<<6) | (1<<8));
}
}
}
В общем, BSRR здесь какой-то мутный, причем, во всех сериях! В заголовочном файле структура GPIO_TypeDef описана правильно, порядок соответствует порядку в мануале. Вообще, странно, что BSRR, идущий сразу за ODR, не работает как надо, а идущий в хвосте BRR — работает.
Добавлено after 10 minutes 43 seconds:
И тут у меня срывает крышу. Вот этот код:
Код: Выделить всё
if(blink_ctr - ctr > 5){
ctr = blink_ctr;
pin_toggle(GPIOB, 3);
pin_toggle(GPIOA, 1<<8|1<<6);
}
работает! Макрос pin_toggle раскрывается в
Код: Выделить всё
#define pin_toggle(gpioport, gpios) do{ \
register uint32_t __port = gpioport->ODR; \
gpioport->BSRR = ((__port & (gpios)) << 16) | (~__port & (gpios));}while(0)
Чертовщина какая-то! В общем, буду дальше тестировать. Но явно, судя по ошибкам в загрузке через st-link, с чипами что-то не то (до этого в этой же девборде работал с F072, ни разу такой проблемы не встретил).
Судя по тому, что светодиоды блымцкают 10 раз за 9 секунд, частота тактирования SysTick составляет около 8МГц, т.е. HCLK=64МГц по умолчанию.