Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Скрытый баг
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Genadi Zawidowski
Столкнулся я с тем, что проект, ранее работавший на STM32F101, STM32F105 перестал работать на STM32F103 (буквочки не важны).
Вернее, проект работал, но "отваливался" дебаг порт SWD - помогала только загрузка через замыкание BOOT0. Радостно потирая руки, начал писать демонстрацию бага...
Внимательное чтение документации выявило причину.
Пока - код-загадка, который после программирования в STM32F103RC делал его "невидимым" для J-FLASH.

CODE
#include "stm32f10x.h"

#define STACK_SIZE 0x600

static __attribute__ ((aligned(8), section(".noinit"))) uint32_t pdwStack [STACK_SIZE] ;

typedef void IntFunc(void);
typedef IntFunc * IntFuncP;

static IntFunc ResetException;


static
__attribute__((used, section(".vectors"))) IntFuncP exception_table [256] = {

(IntFuncP) (& pdwStack [STACK_SIZE]),
ResetException,
};


static void ResetException(void)
{
/* Используется только SWD */
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->MAPR = (AFIO->MAPR & ~ AFIO_MAPR_SWJ_CFG) | AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // PA15, BP3 & PB4 pins free for use.

/* ... много кода */
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->MAPR |= AFIO_MAPR_SPI1_REMAP;
/* ... инициализация SPI1 */

/* ... много кода */
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; /* I/O port B clock enable */
// Set PB3 as output
GPIOB->CRL = GPIO_CRL_CNF3_0;


/* ... много кода */
for (;;)
;
}



ps: вот тут
мучаются с похожей проблемой, но не нашли решения...
SSerge
Цитата(Genadi Zawidowski @ Jul 3 2013, 13:24) *
...
Внимательное чтение документации выявило причину.
...

Это всегда помогает.
"Bits 26:24 SWJ_CFG[2:0]: Serial wire JTAG configuration
These bits are write-only (when read, the value is undefined)."

P.S. Хорошие грабли, я по ним уже ходил sm.gif.
demiurg_spb
Цитата(SSerge @ Jul 3 2013, 11:45) *
P.S. Хорошие грабли, я по ним уже ходил sm.gif.
Да неплохие.
В очередной раз убеждаюсь в правильности выбора использования STM32 библиотеки для настройки периферии...
Tahoe
Цитата(demiurg_spb @ Jul 3 2013, 12:18) *
В очередной раз убеждаюсь в правильности выбора использования STM32 библиотеки для настройки периферии...

Расскажите вы ей... (с)

Как я по этим граблям прошелся.
Цитата(Tahoe)
В общем вывод остается прежним - remap JTAG делать в самую последнюю очередь.
А в библиотеках от ST просто в наглую подставляется константа. И совсем не факт, что она совпадет с тем, как ранее настроил программер.
Genadi Zawidowski
Я решил просто - свой функцией, которая подставляет нужную мне константу в каждому обращению к ремапу.
Первое обращение с маской "0", для настройки SWD, если ремапа не окажется.
Честно говоря, я удивлён что эти грабли такие истоптанные... Всегда хочется верить в уникальность своих проблем.
Genadi Zawidowski
Цитата
P.S. Хорошие грабли, я по ним уже ходил

Но почему _почти все_ примеры просто OR-с присвоением используют? И ведь, наверное, в серийных устройствах такое тоже оказывается. Вопрос риторический. Интернет не заменяет даташит, это понятно. Как и "русская инструкция для начинающих".
toweroff
Цитата(Genadi Zawidowski @ Jul 4 2013, 00:20) *
Но почему _почти все_ примеры просто OR-с присвоением используют? И ведь, наверное, в серийных устройствах такое тоже оказывается. Вопрос риторический. Интернет не заменяет даташит, это понятно. Как и "русская инструкция для начинающих".

либы "индусы" пишут. Им фиолетово, а контроль либо не успевает, либо тоже "индусский"

я со старыми-то либами к арм9 плясал, пока сам не разобрался и свое не разродил... вроде и проект не особо важный, но спортивный интерес свое взял


Короче говоря, смотри, изучай и пиши сам sm.gif

_Pasha
Цитата(demiurg_spb @ Jul 3 2013, 11:18) *
В очередной раз убеждаюсь в правильности выбора использования STM32 библиотеки для настройки периферии...


Цитата(toweroff @ Jul 4 2013, 01:17) *
Короче говоря, смотри, изучай и пиши сам sm.gif


Сколько людей - столько и мнений, как всегда.
Есть еще одно мнение sm.gif - все, что касается статического конфига, зависящего только от конкретной платы - записывать сразу, с минимумом манипуляций регистрами.
Я понимаю, - вкл/выкл модуль и уменьшить потребление - этого не избежать, но применять этот подход всегда - не получается.
Tahoe
Цитата(Genadi Zawidowski @ Jul 3 2013, 23:04) *
Я решил просто - свой функцией, которая подставляет нужную мне константу в каждому обращению к ремапу.

ИМХО, лучше всего и правильнее воспользоваться такой фичей кортекса, как bitbang. "И сразу станет от этого хорошо."(с)

Цитата(_Pasha @ Jul 4 2013, 10:48) *
все, что касается статического конфига, зависящего только от конкретной платы - записывать сразу, с минимумом манипуляций регистрами

Так прокатит только в одном случае, если писать быдлокод. А если писать нормально, с возможностью reuse, тогда никаких статических конфигов не получится, даже на самом мелком AVR.
_Pasha
Цитата(Tahoe @ Jul 4 2013, 11:26) *
Так прокатит только в одном случае, если писать быдлокод. А если писать нормально, с возможностью reuse, тогда никаких статических конфигов не получится, даже на самом мелком AVR.

a14.gif Reuse периферии... оригинально!
Genadi Zawidowski
Цитата(_Pasha @ Jul 4 2013, 12:43) *
a14.gif Reuse периферии... оригинально!


А что, для Вас это новость? Я давно во всех своих проектах использую что-то вроде "bios" с инициализацией (как минимум) разных модулей - причём, платформы arm7-arm9(atmel), cortex-m3 (atmel, stm), atmega... http://subversion.assembla.com/svn/hfreciever/trunk/
Tahoe
Цитата(_Pasha @ Jul 4 2013, 12:43) *
a14.gif Reuse периферии... оригинально!

Вообще-то reuse кода. А какого именно - инициализирующего периферию или декодирующего biphase - дело десятое. Дело в подходе к кодированию, а не к тому, что именно кодируешь в данный момент.

Цитата(Genadi Zawidowski @ Jul 4 2013, 14:43) *
Я давно во всех своих проектах использую что-то вроде "bios" с инициализацией

Я даже имел в виду несколько шире:
Код
void    RFID_Init(        RFID    *        pRfid        )
{
    BIPHASE_Init( &( pRfid->Decoder ) );
    BSP_U2270_Init();
}

void    BSP_U2270_Init( void )
{
    MCU_PIN_Cfg(            BSP_PIN_U2270_ENBL,        MCU_PIN_MODE_OUT_PUSHPULL    );
    MCU_PIN_Cfg(            BSP_PIN_U2270_ADJ,        MCU_PIN_MODE_OUT_PUSHPULL    );
}

e.t.c.


Т.е. всегда есть некий верхний модуль, который по иерархии вниз обращается. В какой момент времени это произойдет - никому неизвестно. И если, допустим, на общем SPI сидит два устройства, с разной скорострельностью, то при обращении придется перенастраивать baud rate. Хотя Паша, конечно, просто тупо проинициализирует в самом начале, на самую меденную скорость. И даже, скорее всего, будет собой очень доволен - еще бы, сэкономил пару байт флеша.
_Pasha
Цитата(Tahoe @ Jul 4 2013, 14:05) *
Хотя Паша, конечно, просто тупо проинициализирует в самом начале, на самую меденную скорость. И даже, скорее всего, будет собой очень доволен - еще бы, сэкономил пару байт флеша.

Чушь котячья. Я такого не сказал.
Скажу по-умному шоб зауважали sm.gif
Write-once registers. Знаете такой термин? Вот.
Tahoe
Цитата(_Pasha @ Jul 4 2013, 17:37) *
Чушь котячья. Я такого не сказал.
Скажу по-умному шоб зауважали sm.gif
Write-once registers. Знаете такой термин? Вот.

Прекрасно. Подозреваю, что человек, который в R/W регистр пишет лишь один раз, навернное и флешовый микроконтроллер выпаивает после первой же прошивки, заменяя его на новый? Любовь к целк ко всему девственно чистому? Или one more once not a pidarance? sm.gif
Fujitser
Быдлокод и возможность reuse - это совершенно ортогональные понятия. Можно написать библиотеку с быдлокодом, можно написать статическую конфигурацию правильно и хорошо.
Хотя я за библиотеки.
_Pasha
Цитата(Tahoe @ Jul 4 2013, 17:12) *
Или one more once not a pidarance? sm.gif

Once again
You're happy:
The bullet in your brain
Can't wake up at now?
Try and try again
biggrin.gif
Tahoe
Цитата(Fujitser @ Jul 7 2013, 09:23) *
Быдлокод и возможность reuse - это совершенно ортогональные понятия. Можно написать библиотеку с быдлокодом, можно написать статическую конфигурацию правильно и хорошо.

Одноразовый стаканчик, конечно, можно помыть и использовать повторно, но обычно так не делают. В то же время чайный сервиз, как правило, никто не выкидывает в помойку, после первого чаепития.
С кодом та же история. Возможно, зависимость быдлокод/reuse неочевидна, но она есть и вполне осязаема, т.е. ортогональности минимум.
Fujitser
Цитата(Tahoe @ Jul 8 2013, 04:38) *
Возможно, зависимость быдлокод/reuse неочевидна, но она есть и вполне осязаема, т.е. ортогональности минимум.


Да, неочевидна. Возможно, вы хотели сказать, что библиотеки прекрасны, как чайные сервизы, а одноразовый код всегда уродлив? Если бы...
Возможно, фирменные библиотеки или известные open-source библиотеки сделаны хорошо (гм, не всегда), но что касается библиотек, которые пишутся на предприятиях "для себя", это ужас-ужас.

Ситуация на рынке труда сейчас такова, что программированием зачастую занимаются случайные люди, что в совокупности с огромной текучестью приводит к тому, что на код часто нельзя смотреть без слёз.
Tahoe
Цитата(Fujitser @ Jul 8 2013, 17:31) *
Да, неочевидна. Возможно, вы хотели сказать, что библиотеки прекрасны, как чайные сервизы, а одноразовый код всегда уродлив? Если бы...

Нет. Я о том, что назначение предмета тянет за собой выбор материала, из которого он изготовлен. Reuse кода подразумевает некие явные и неявные правила его написания, суть - ограничения буйной фантазии программера, что, в свою очередь, ограничивает "быдлокодерство". В этом и проявляется не ортогональность.

Развивая пример выше, сколько ни пытайся сделать из пластика полноценную чашку, все равно будет получаться больше похожее одноразовый стаканчик. До тех пор, пока материал не будет заменен на фарфор или стекло, что потянет за собой технологию и остальное.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.