|
Скрытый баг, О вреде копипасты |
|
|
|
Jul 3 2013, 06:24
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Столкнулся я с тем, что проект, ранее работавший на 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: вот тутмучаются с похожей проблемой, но не нашли решения...
Сообщение отредактировал Genadi Zawidowski - Jul 3 2013, 07:01
|
|
|
|
|
Jul 3 2013, 07:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(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. Хорошие грабли, я по ним уже ходил  .
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Jul 3 2013, 13:21
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(demiurg_spb @ Jul 3 2013, 12:18)  В очередной раз убеждаюсь в правильности выбора использования STM32 библиотеки для настройки периферии... Расскажите вы ей... (с) Как я по этим граблям прошелся.Цитата(Tahoe) В общем вывод остается прежним - remap JTAG делать в самую последнюю очередь. А в библиотеках от ST просто в наглую подставляется константа. И совсем не факт, что она совпадет с тем, как ранее настроил программер.
|
|
|
|
|
Jul 3 2013, 22:17
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(Genadi Zawidowski @ Jul 4 2013, 00:20)  Но почему _почти все_ примеры просто OR-с присвоением используют? И ведь, наверное, в серийных устройствах такое тоже оказывается. Вопрос риторический. Интернет не заменяет даташит, это понятно. Как и "русская инструкция для начинающих". либы "индусы" пишут. Им фиолетово, а контроль либо не успевает, либо тоже "индусский" я со старыми-то либами к арм9 плясал, пока сам не разобрался и свое не разродил... вроде и проект не особо важный, но спортивный интерес свое взял Короче говоря, смотри, изучай и пиши сам
|
|
|
|
|
Jul 4 2013, 06:48
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(demiurg_spb @ Jul 3 2013, 11:18)  В очередной раз убеждаюсь в правильности выбора использования STM32 библиотеки для настройки периферии... Цитата(toweroff @ Jul 4 2013, 01:17)  Короче говоря, смотри, изучай и пиши сам  Сколько людей - столько и мнений, как всегда. Есть еще одно мнение  - все, что касается статического конфига, зависящего только от конкретной платы - записывать сразу, с минимумом манипуляций регистрами. Я понимаю, - вкл/выкл модуль и уменьшить потребление - этого не избежать, но применять этот подход всегда - не получается.
|
|
|
|
|
Jul 4 2013, 08:26
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(Genadi Zawidowski @ Jul 3 2013, 23:04)  Я решил просто - свой функцией, которая подставляет нужную мне константу в каждому обращению к ремапу. ИМХО, лучше всего и правильнее воспользоваться такой фичей кортекса, как bitbang. "И сразу станет от этого хорошо."(с) Цитата(_Pasha @ Jul 4 2013, 10:48)  все, что касается статического конфига, зависящего только от конкретной платы - записывать сразу, с минимумом манипуляций регистрами Так прокатит только в одном случае, если писать быдлокод. А если писать нормально, с возможностью reuse, тогда никаких статических конфигов не получится, даже на самом мелком AVR.
|
|
|
|
|
Jul 4 2013, 11:05
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(_Pasha @ Jul 4 2013, 12:43)   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. Хотя Паша, конечно, просто тупо проинициализирует в самом начале, на самую меденную скорость. И даже, скорее всего, будет собой очень доволен - еще бы, сэкономил пару байт флеша.
|
|
|
|
|
Jul 4 2013, 14:12
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(_Pasha @ Jul 4 2013, 17:37)  Чушь котячья. Я такого не сказал. Скажу по-умному шоб зауважали  Write-once registers. Знаете такой термин? Вот. Прекрасно. Подозреваю, что человек, который в R/W регистр пишет лишь один раз, навернное и флешовый микроконтроллер выпаивает после первой же прошивки, заменяя его на новый? Любовь к целк ко всему девственно чистому? Или one more once not a pidarance?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|