Страница 373 из 446
Re: STM32 новичку в ARM что к чему
Добавлено: Вт июл 13, 2021 13:45:43
WiseLord
На производстве проверка микросхем не в таком виде происходит.
Основные электрические параметры проверяются на этапе, когда пластина ещё не разрезана на кристаллы. Она перемещается под зондом с шагом, равным расстоянию между кристаллами, затем зонд (представляющий из себя кучу тонких иголочек, подключенному к тестирующей системе) опускается на контактные площадки очередного кристалла, и несколько секунд/минут тратятся на то, чтобы замерить электрические параметры. В случае МК это может быть в том числе и прошивка какой-нибудь программой с проверкой её отработки.
Если какой-то кристалл не пройдёт тест, он будет просто помечен, и уже потом, когда пластина будет порезана на кристаллы, отбракован. Корпуса ему не достанется.
Хотя, и в корпусе можно будет затем что-то мерять, но особого смысла в этом нет - дешевле это всё делать ещё на пластине.
Re: STM32 новичку в ARM что к чему
Добавлено: Вт июл 13, 2021 13:54:17
COKPOWEHEU
Мы ведь сейчас обсуждаем тестер контроллеров на брак. Кто может заранее предсказать какой именно модуль у данного конкретного контроллера поврежден. У вас вот BSRR себя ведет странно, хотя казалось бы, где там косячить.
Хотя, конечно, на таймеры стоило бы более активную проверку сделать (в т.ч. на режим энкодера: собираюсь
Сейчас собираетесь играться с энкодером, потом с АЦП/ЦАП, потом еще с чем-то. По-хорошему, если вы действительно пытаетесь сделать из своей платы тестер, стоит итеративно добавлять проверку новых узлов чтобы хотя бы с ними в будущем не ловить сюрпризов.
Чтобы сделать проверку вообще всех компонент, придется нехилую обвязку делать. Да и прошивка МК будет оочень жирной.
Теоретически, можно воспользоваться JTAG чтобы напрямую писать значения в регистры периферии, тогда сложность переедет в программу на стороне компа.
А если просто не хочется протирать до дыр флешку (хотя вряд ли - пару раз переписать для тестов это ни о чем), можно через ОЗУ.
Основные электрические параметры проверяются на этапе, когда пластина ещё не разрезана на кристаллы. Она перемещается под зондом с шагом, равным расстоянию между кристаллами, затем зонд
Сомневаюсь, что кто-то делает зонды с 200 иголками - они слишком громоздки. Плюс не все параметры, вроде температурной стабильности или частоты, удобно проводить на большой пластине. Я бы предположил скорее корпусировку одного экземпляра и тестирование его в надежде что все кристаллы на пластине одинаковы.
Re: STM32 новичку в ARM что к чему
Добавлено: Вт июл 13, 2021 15:06:27
Reflector
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4060110#p4060110"]Мы ведь сейчас обсуждаем тестер контроллеров на брак. Кто может заранее предсказать какой именно модуль у данного конкретного контроллера поврежден. У вас вот BSRR себя ведет странно, хотя казалось бы, где там косячить.[/uquote]
Там не просто якобы BSRR косячит, но еще номера партий и даже шрифты разные, т.е. похоже китайцы эти мк откуда-то выпаивали, потому они и залочены, в таком случае с большой вероятностью речь идет об оригиналах. Если это отбраковка произведенная в разных местах, то косячный во всех BSRR будет наоборот с микроскопической вероятностью, если же это перемаркировка, то надписи должны быть по крайней мере одним шрифтом и раньше китайцы действительно перемаркировывали F303, но это были другие STM32, типа F100 и ID у них тоже были другие, а в этих ID правильные... Возможно косячит как раз
Eddy_Em не признающий отладчики и т.д., у него постоянно какие-то проблемы

Re: STM32 новичку в ARM что к чему
Добавлено: Вт июл 13, 2021 15:59:09
Eddy_Em
Reflector, а не могут ли это какие-нибудь GD или CS быть? Что, если у них регистры ODR и BRR совпадают по адресу с ST'шными, а BSRR — нет? Регистр BRR работает же. Надо остальные 7 штук из этого десятка проверить. А может, какие-то близкие к 303 МК, у которых нет регистра BSRR?
Во всяком случае, и st-flash, и stm32flash распознают их как Cortex-M4 a la STM32F3xx со 128кБ флеша, 40кБ ОЗУ, 8кБ спец. ОЗУ. Но после снятия защиты от записи st-flash может прошить МК только единожды(хоть я не трогаю никакие регистры, связанные с отключением SWD или защитой).
P.S. На BSRR и глюк, если в BRR писать 0xffff вместо конкретных пинов, проверял и свой велосипед, и код, предложенный WiseLord.
Re: STM32 новичку в ARM что к чему
Добавлено: Вт июл 13, 2021 17:06:03
COKPOWEHEU
Reflector, проблема ведь в том, что они сами по себе лочатся.
Но после снятия защиты от записи st-flash может прошить МК только единожды
У меня похожая беда с L1 - не срабатывало стирание флеша, решилось вот таким костылем:
Код: Выделить всё
stm32flash -j /dev/ttyUSB0
sleep 1
stm32flash -k /dev/ttyUSB0
sleep 1
stm32flash -e 0 -w $(frmname).bin /dev/ttyUSB0
Re: STM32 новичку в ARM что к чему
Добавлено: Вт июл 13, 2021 17:30:29
Reflector
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4060154#p4060154"]а не могут ли это какие-нибудь GD или CS быть?[/uquote]
Как минимум нужен GD или CS с подходящим ID, у GD есть похожая серия F303, но там у ID даже адрес другой...
Re: STM32 новичку в ARM что к чему
Добавлено: Вт июл 13, 2021 21:47:19
Eddy_Em
Беру следующий чип из бракованной партии. Та же история: в нем что-то было прошито (некоторые светодиоды светились), стояла защита записи. Защиту снял, прошил через 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МГц по умолчанию.
Re: STM32 новичку в ARM что к чему
Добавлено: Вт июл 13, 2021 22:01:42
Reflector
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4060306#p4060306"]Теперь меняю GPIOB->ODR = 0 на GPIOB->BSRR = 3. И что я вижу? Светодиоды на PB0/1 один раз вспыхивают (на инициализации), после ODR=3 гаснут и больше не загораются, т.е. GPIOB->BSRR = 3 не сбрасывает их в нуль! Но только я поменяю это на GPIOB->BRR = 3, как все работает![/uquote]
Ты уже путаешься, GPIOB->BSRR = 3 - это не сброс, для сброса нужно писать 3 << 16. В макросе pin_toggle сдвиг есть, он и работает...
Re: STM32 новичку в ARM что к чему
Добавлено: Вт июл 13, 2021 23:55:16
Eddy_Em
А! Посыпаю голову пеплом. Я считал, что младшая половина - reset, а старшая - set.
Ну, ОК тогда. Претензия пока только к косякам при записи во флеш.
Добавлено after 1 hour 49 minutes 52 seconds:
Кстати, в даташите нарисовано, что SysTick тактируется от HCLK/8 (жестко). Однако, оказалось, что приходится вызывать SysTick_Config(72000), чтобы получить период в 1мс! Хотя, если бы там было 9МГц, пришлось бы писать 9000 в аргументе!
И вот, что обнаружил: если вначале не написать while(blink_ctr < 9) (в общем, не подождать немного), то "блымкают" только светодиоды на PB0/1! Похоже, какой-то косяк с инициализацией периферии, хотя я вызываю ее после StartHSE() (а эта функция ждет, пока все будет ОК):
Код: Выделить всё
TRUE_INLINE void StartHSE(){
__IO uint32_t StartUpCounter = 0;
RCC->CR = (RCC->CR & ~RCC_CR_PLLON) | RCC_CR_HSEON; // disable PLL to reconfigure, enable HSE
while(!(RCC->CR & RCC_CR_HSERDY) && (++StartUpCounter < 10000));
if(RCC->CR & RCC_CR_HSERDY){
// Enable Prefetch Buffer. Flash 2 wait states for 48..72MHz
FLASH->ACR = (FLASH->ACR & ~(FLASH_ACR_LATENCY)) |
FLASH_ACR_LATENCY_1 | FLASH_ACR_PRFTBE;
// HCLK = SYSCLK (AHB prescaler = 1), PCLK1 = HCLK (APB1 prescaler = 1), PCLK2 = HCLK (APB2 prescaler = 1)
// PLLCLK = HSE * 9 = 72MHz
RCC->CFGR = (RCC->CFGR & ~(RCC_CFGR_HPRE | RCC_CFGR_PPRE1 | RCC_CFGR_PPRE2 |
RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMUL)
) | RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR_PLLMUL9;
RCC->CR |= RCC_CR_PLLON; // Enable PLL
// Wait till PLL is ready
StartUpCounter = 0;
while(!(RCC->CR & RCC_CR_PLLRDY) && (++StartUpCounter < 1000)){}
// Select PLL as system clock source
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_PLL;
// Wait till PLL is used as system clock source
StartUpCounter = 0;
while(((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) && (++StartUpCounter < 1000)){}
}else{ // HSE fails to start-up
RCC->CIR = 0;
RCC->CR |= RCC_CR_HSION;
// To adjust HSI use HSITRIM and after that wait for HSIRDY
}
}
Другой вариант — у меня неправильно настроены flash latency и flash prefetch (хотя, вроде это делаю по даташиту).
Но больше всего для начала меня смущает то, что у SysTick тактирование не 9МГц, когда у меня на HSI стоит кварц 8МГц, PLL с умножителем на 9, а все делители на 1.
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 00:13:28
Reflector
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4060317#p4060317"]Кстати, в даташите нарисовано, что SysTick тактируется от HCLK/8 (жестко). Однако, оказалось, что приходится вызывать SysTick_Config(72000), чтобы получить период в 1мс![/uquote]
SysTick везде одинаковый и тактируется или от AHB, или от AHB/8, или, иногда, от системной частоты, как у H7, но у них она просто может быть в 2 раза больше частоты AHB. А нарисовано местами действительно только AHB/8...
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 00:43:37
Eddy_Em
Поражаюсь, что между STM32F303CBT6 и C8T6 разница не только в размере флеша/оперативки, но и в некоторых регистрах! Что ж за камень такой?
А проблема с "неблымкающими" светодиодами, возможно, из-за flash latency: я ее выставлял по мануалу в 010, однако, сейчас вот методом тыка сделал 100 (как у F103), и заработало!
Но в мануале вообще ничего не пишется про третий (старший) бит, там только три упомянуто (000 - ни одного цикла ожидания, 001 - 1 цикл, 010 - 2 цикла). По умолчанию оно в нуле, поэтому, видимо, когда без настроек таймеров автоматом включался HSI, и были эти косяки, что часть кода просто "не читалась"!
Блин, я фигею от этой документации!!! Либо здесь - какой-то экзотический перемаркированный МК.
А насчет HCLK/8, действительно, под F0 функция настройки systick выглядит вот так:
Код: Выделить всё
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks, uint32_t div8)
{
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
if(!div8) SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
return (0);
}
Надо ее в таком виде на все перенести, а то в остальных семействах в коде от ST по умолчанию считается, что SysTick тактируется напрямую от HCLK.
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 01:10:57
Reflector
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4060361#p4060361"]Но в мануале вообще ничего не пишется про третий (старший) бит, там только три упомянуто (000 - ни одного цикла ожидания, 001 - 1 цикл, 010 - 2 цикла). По умолчанию оно в нуле, поэтому, видимо, когда без настроек таймеров автоматом включался HSI, и были эти косяки, что часть кода просто "не читалась"![/uquote]
Даже у F0 все три бита рабочие, можно 7 записать и код будет медленнее работать, чем с 6-ю, а с двумя тактами должно и в разгоне до 120 MHz работать, если все правильно сделано и питание нормальное...
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 02:00:46
Asmodey
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4060361#p4060361"]Блин, я фигею от этой документации!!![/uquote]
Зато в цирк ходить не нужно. С ST не соскучишься

Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 06:46:10
240265
У STM32F303CBT6 есть BRR который сбрасывает без сдвига и макрос не нужен.
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 09:20:03
Eddy_Em
[uquote="Asmodey",url="/forum/viewtopic.php?p=4060370#p4060370"]С ST не соскучишься

[/uquote]
Я считал, что F303 — сравнительно свежий чип (не старее F072). Но, судя по Errata, это просто жесть какая-то!!!
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 09:51:50
COKPOWEHEU
[uquote="Asmodey",url="/forum/viewtopic.php?p=4060370#p4060370"]Зато в цирк ходить не нужно. С ST не соскучишься

[/uquote]
Вот только от производителя чипов ожидаешь вменяемой документации и железа, а не цирка!
Хотя вы правы, для таких как я (да и Эдди, похоже) они идеальны: всегда есть что героически превозмогать.
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 10:04:58
Reflector
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4060415#p4060415"]Я считал, что F303 — сравнительно свежий чип (не старее F072). Но, судя по Errata, это просто жесть какая-то!!![/uquote]
Когда последний раз Errata для F072 открывал? Она даже чуть больше, чем для F303, хотя последний сложнее, а год выпуска у серий одинаковый.
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 10:52:11
Eddy_Em
Когда последний раз Errata для F072 открывал?
Там ничего принципиального для меня нет, поэтому я ее давно полистал, увидел, что мне ничего страшного не грозит (т.к. всякие экзотические режимы я не использую) и забил.
А вот у F303 сразу в глаза бросается, например, "ADEN bit cannot be set immediately after the ADC calibration is done" — забавный глюк, надо иметь в виду. Вот это: "Imprecise VREFINT calibration values" не может не "радовать".
Вот еще жесть: "BSY bit may stay high at the end of a SPI data transfer in slave mode". Хочешь работать в SPI slave? Отрубай SPI после каждой передачи, а как BSY упадет, можешь включать обратно!
Вроде, больше особых косяков в errata на STM32F303 не заметил. У 072 ни одного такого серьезного косяка нет!
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 11:14:04
Reflector
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4060467#p4060467"]А вот у F303 сразу в глаза бросается, например, "ADEN bit cannot be set immediately after the ADC calibration is done" — забавный глюк, надо иметь в виду. Вот это: "Imprecise VREFINT calibration values" не может не "радовать".[/uquote]
Так ведь и сам ADC у F3 намного сложнее, тем более у предыдущих серий такого не было, так что даже если бы F3 были новее это бы не сильно помогло.
Eddy_Em писал(а):Вот еще жесть: "BSY bit may stay high at the end of a SPI data transfer in slave mode". Хочешь работать в SPI slave? Отрубай SPI после каждой передачи, а как BSY упадет, можешь включать обратно!
SPI у STM32 в принципе жесть, особенно в режиме слейва, а конкретно этот баг есть и у новых G0/G4, видимо его исправление не самая приоритетная задача.
Re: STM32 новичку в ARM что к чему
Добавлено: Ср июл 14, 2021 11:34:42
Eddy_Em
На F072 у меня никаких проблем с SPI-slave не было, Rx/Tx по DMA.
А вот чего реально не хватает, так это каналов DMA!!! Их нужно хотя бы 32. Но лучше бы — 64. С семью каналами F072 далеко не уйдешь. Да и у F303 всего-то на 5 каналов больше. Тоже мне…
Если нужно одновременно работать с обоими SPI, I2C и четырьмя USART'ами, то вариант полностью отдать ненужные потуги на DMA не прокатывает ☹
А еще ведь бывает нужно таймеру регистры менять при помощи DMA (+складывать захваченное в массив — для того же 1-wire) или генерировать ЦАПом что-нибудь…
В общем, за малое количество каналов DMA жирнейший минус ST!