Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 – вопросы – проблемы - решения.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
dezna
Цитата(brag @ Jun 9 2011, 13:40) *
точно. даже после убирания питания, закорачивания всех ног на землю и ожидания 10 минут, jtag отвечает на команды, но дальше дело не идет, проц не видится дебаггером(jlink в том числе) и жрет раза в 2 больше тока,чем когда работает. уже 2 таких камня лежит

у меня примерно также было. не отвечал проц через дебаггер, после экспериментов с залочиванием.
каким-то образом установилась защита от чтения (глубже не разбирался)
решилось всё давольно просто - использованием штатного бутлоадера.
BOOT0 и RESET симулировал ручками: BOOT - 10кОм на 3В, RESET - передёргивание питания.
с помощью програмуль ничего не получилось, т.к. они хотят сами ресетом управлять и без этого никак
команды слал из терминала (скорость значения не имеет, 8E1):
0x7F - контроллер настраивает скорость обмена (ответ был 0x79)
зетем собственно сбрасываем защиту от чтения
0x92 0x6D (ответ 0x79 0x79)
собственно и всё!
после этого я спокойно залил программу через JTAG
так что может у тебя такая же проблема.
smalcom
не установлены параметры: старт-бит, стоп-бит. не затактирован AFIO.
mrcrook
Цитата(smalcom @ Feb 1 2012, 18:13) *
не установлены параметры: старт-бит, стоп-бит. не затактирован AFIO.

старт-бит, стоп-бит установлены по умолчанию в структуре USART_InitStructure так же как и бауд рейт. все остальные параметры шаблона меня устроили тоесть пакет 8 бит 1 стоп бит ну и т.д. поэтому изменял только бауд рейт.

насчет AFIO не понял что вообще за зверь =) если можно поясните, в примерах не разу не встречалось вроде.
dezna
Цитата(mrcrook @ Feb 1 2012, 16:38) *
старт-бит, стоп-бит установлены по умолчанию в структуре USART_InitStructure так же как и бауд рейт. все остальные параметры шаблона меня устроили тоесть пакет 8 бит 1 стоп бит ну и т.д. поэтому изменял только бауд рейт.

насчет AFIO не понял что вообще за зверь =) если можно поясните, в примерах не разу не встречалось вроде.

AFIO нужен только если переназначаешь ноги перефирии на другие ноги проца,
если используются по умолчанию - то он вообще не нужен.
смотри внимательно настройку скорости обмена! там хитрый регистр BRR в котором старшие 12 бит мантисса (целое число), а младшие
4 бита - дробная часть. т.е. можно задавать делитель типа: 10.75 или 1200.5
Serj78
Цитата(AndreyKar @ Jan 23 2012, 10:06) *
В Reference manual в п.31.8.1 SW protocol introduction сказано: "For SWDIO bidirectional management, the line must be pulled-up on the board (100 KΩ
recommended by ARM)." Уж не знаю, как строго надо этого придерживаться, но я не его не ставлю (внутреннего хватает).
ЗЫ: народ, какие разъемы ставите на этот интерфейс?


А вот в RM008 сказано, (пункт 31.4.3)

"To avoid any uncontrolled I/O levels, the STM32F10xxx embeds internal pull-ups and pulldowns
on JTAG input pins:
● NJTRST: Internal pull-up
● JTDI: Internal pull-up
● JTMS/SWDIO: Internal pull-up
● TCK/SWCLK: Internal pull-down"

Этот резистор составляет ~30к ( ток ноги на землю 100мка)

Кажется внешний - излишен.
demiurg_spb
Цитата(ReRayne @ Jan 20 2012, 18:20) *
Написан PUTCHAR_PROTOTYPE, который по ITM посылает отладку в окно Debug (printf) Viewer в Keil. Можно ли как-то сделать, чтобы этот дебаг сразу логировался в файл?

Похоже что нет.
Я тоже сделал отладку в ITM согласно мануалу
CODE
#define itm_port8(n) (*((volatile uint8_t *)(0xE0000000+4*(n))))
#define itm_port16(n) (*((volatile uint16_t*)(0xE0000000+4*(n))))
#define itm_port32(n) (*((volatile uint32_t*)(0xE0000000+4*(n))))
#define DEMCR (*((volatile uint32_t*)(0xE000EDFC)))
#define TRCENA 0x01000000
//=========================================================================
#define dputchar(x) \
do \
{ \
if (DEMCR & TRCENA) \
{ \
while (itm_port32(0) == 0) \
{ \
; \
} \
\
itm_port8(0) = (x); \
} \
} \
while (0)
Включил TRACE в опциях отладчика согласно мануалу.
Включил ITM порт.
Но ничего не выходит. Виснет на while (itm_port32(0) == 0) {;}
Может отладчик не тот JLINK8, может он только с ULINK2 может?
Работает ли эта фишка при отладке по SWD (у меня подключены лишь SWDIO SWCLK и шьется и дебажится нормально, а вот с ITM никак)?
Что не так?
mrcrook
Цитата(dezna @ Feb 2 2012, 09:57) *
смотри внимательно настройку скорости обмена! там хитрый регистр BRR в котором старшие 12 бит мантисса (целое число), а младшие
4 бита - дробная часть. т.е. можно задавать делитель типа: 10.75 или 1200.5

благодарю, все запустилось как надо.
Код
    // Скорость 115.2 kbps. USARTDIV=FSYS(не частота процессора а частота порта)/(16*baud) = 42e6/(16*115200) = 22,75.
    USART2->BRR=(22<<4); // Целая часть коэффициента деления USART1.
    USART2->BRR|=12; // Дробная часть*16 = 0,75*16 = 12 (окр).

    USART_Cmd( USART2, ENABLE );
Сергей Борщ
QUOTE (mrcrook @ Feb 2 2012, 14:28) *
благодарю, все запустилось как надо.
CODE
    42e6/(16*115200) = 22,75
    USART2->BRR=(22<<4); // Целая часть коэффициента деления USART1.
    USART2->BRR|=12; // Дробная часть*16 = 0,75*16 = 12 (окр).

Итого: BRR = 22*16 + 12 = 364. Две записи в регистр, одно чтение и операция "Или".

(42e6 * 16)/(16*115200) = 42e6 / 115200 = 364. Мистика, не правда ли?
Имеем:
CODE
#define F_SYS          42000000UL
#define BAUDRATE   115200

    // USARTDIV=FSYS(не частота процессора а частота порта)/(16*baud)
    // USART_BRR = USARTDIV * 16
    USART2->BRR = F_SYS / BAUDRATE;

    USART_Cmd( USART2, ENABLE );

Одна запись в регистр. Не трогая калькулятор. И если скорость или частоту изменить понадобится - тоже калькулятор не понадобится, не говоря уже о том, чтобы внимательно просматривать весь исходник в поисках таких магических цифр как ваши 22 и 12.

Эти писатели документации просто вредители какие-то, если после их примеров получается такой код как ваш. А вы ленитесь осмыслить их пример, делаете тупо методом "цельнотянутости".
scifi
Цитата(Сергей Борщ @ Feb 2 2012, 18:26) *
Эти писатели документации просто вредители какие-то, если после их примеров получается такой код как ваш. А вы ленитесь осмыслить их пример, делаете тупо методом "цельнотянутости".

+1. Тоже читал их опус про целую и дробную часть и дивился искусности МК-строителей, пока не осознал, что нужно тупо записать в регистр Fbus/BaudRate.
mrcrook
Цитата(Сергей Борщ @ Feb 2 2012, 20:26) *
Итого: BRR = 22*16 + 12 = 364. Две записи в регистр, одно чтение и операция "Или".

(42e6 * 16)/(16*115200) = 42e6 / 115200 = 364. Мистика, не правда ли?

в данный момент было не особо важно, а вот за пояснение спасибо действительно более понятно и просто, чем какие то манипуляции с калькулятором.
AHTOXA
Цитата(Сергей Борщ @ Feb 2 2012, 20:26) *
Эти писатели документации просто вредители какие-то, если после их примеров получается такой код как ваш. А вы ленитесь осмыслить их пример, делаете тупо методом "цельнотянутости".

Документация - это ещё цветочки по сравнению с библиотекойsm.gif
Вот что там:
Код
  /* Determine the integer part */
  if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
  {
    /* Integer part computing in case Oversampling mode is 8 Samples */
    integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));    
  }
  else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
  {
    /* Integer part computing in case Oversampling mode is 16 Samples */
    integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));    
  }
  tmpreg = (integerdivider / 100) << 4;

  /* Determine the fractional part */
  fractionaldivider = integerdivider - (100 * (tmpreg >> 4));

  /* Implement the fractional part in the register */
  if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
  {
    tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
  }
  else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
  {
    tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
  }
  
  /* Write to USART BRR */
  USARTx->BRR = (uint16_t)tmpreg;

Я даже табличку в экселе составил, пытаясь найти скрытый смысл этих манипуляций. Но так и не смогsm.gif
scifi
Цитата(AHTOXA @ Feb 2 2012, 20:50) *
Документация - это ещё цветочки по сравнению с библиотекойsm.gif
Вот что там:

Просто супер! Я снова порадовался, что не использую эту "библиотеку".
В принципе логику проследить можно. Просто всё это уместилось бы строчки в 3 кода, если бы автор кода ненадолго отвлёкся от нажимания кнопок и включил моск :-)
x83
Добрый день всем.


Есть STM32F407. Пытаюсь запустить таймер TIM1 в режиме счетчика квадратурного сигнала от енкодера. Но как-то успехов особых пока нет.
На реальный квадратурный сигнал никакой реакции не происходит. Если настраивать таймер просто как счетный, то все работает.

Кто-нибудь уже запускал таймер в данном режиме? поделитесь опытом какие тут подводные камни.

А вообще задача стоит чтобы по входному квадратурному сигналу определять направление, кол-во импульсов, и период следования импульсов.


adnega
Цитата(x83 @ Feb 3 2012, 09:13) *
Кто-нибудь уже запускал таймер в данном режиме? поделитесь опытом какие тут подводные камни.


Запускал на 103-их. Никаких камней под водой не обнаружено.
До исходников могу добраться только вечером.
smk
Вопрос: Можно ли использовать ST-LINK при отладке других АРМ-контроллеров (не ST)?
demiurg_spb
Цитата(AHTOXA @ Feb 2 2012, 19:50) *
Я даже табличку в экселе составил, пытаясь найти скрытый смысл этих манипуляций. Но так и не смогsm.gif
Если мне не изменяет память, то "не все уарты одинаковы", по смутным воспоминаниям некоторые уарты или мб лишь один из всех тактируютя не той частотой что и все остальные (PCLK1 либо PCLK2).
И это библиотекой корректно учитывается.
Точно, глянул TRM раздел 27.3.4 Fractional baud rate generation:
fCK - Input clock to the peripheral (PCLK1 for USART2, 3, 4, 5 or PCLK2 for USART1)
x83
Цитата(adnega @ Feb 3 2012, 10:22) *
Запускал на 103-их. Никаких камней под водой не обнаружено.
До исходников могу добраться только вечером.


Спасибо, разобрался sm.gif камней действительно никаких. Сам дурак laughing.gif - на вход подавал синфазный сигнал, потому и результат не коррелировал с реальностью.
=F8=
Вопрос: как STM32F103 без внешнего супервизора живут?
scifi
Цитата(=F8= @ Feb 3 2012, 14:25) *
Вопрос: как STM32F103 без внешнего супервизора живут?

Дык у них специально power-up/power-down reset сделан так, чтобы внешний супервизор не требовался. Я его никогда не ставил, и проблем не было. Но в условиях помех не тестировал.
ReRayne
Возникла проблема:
Отладочная плата STARTERKIT SK-STM32F217.
Программатор JetLink8/Ultra, драйвер 4.40d.
Среда разработки: Keil 4.23.
На плате крутился FreeRTOS 7.1, и очень долгое время все было прекрасно.
Плата стартует бутлоадером по адресу 0x8000000, и перекидывает нас на адрес 0x8040000, откуда начинает выполнялся основная прошивка.
Но в какой-то момент при открытии сначала слетели все настройки программатора.
Ну а потом вообще начался цирк с конями:
1) прошивка с программатором стартует через раз;
2) начало появляться странное окошко, которого раньше не было (J-Link reprogramming flash), которое постоянно перезаписывает чистит сектора флеша на чипе;
3) в файле стартапа успешно инициализирует железо, но при этом в main не переходит, а выкидывается на адрес 0xFFFFFFFE;
4) временами все-таки вышвыривает меня в main и начинает дебажить, но в произвольный момент времени при пошаговой трассировке может просто намертво повиснуть в Trace:Running(перед этим обязательно появляется J-Link reprogramming flash).
5) во время все той же пошаговой трассироки может внезапно возникнуть инструкция в дизасемблере MOVS 0xFFFFFFFE и мы улетаем черт знает куда;
6) при попытке остановить улетевший в никуда процессор вываливает "Can't stop Cortex-M3";

Перерыла весь интернет, нигде ничего подобного не встречал, помогите =(((
mrcrook
Цитата(ReRayne @ Feb 3 2012, 18:37) *
Перерыла весь интернет, нигде ничего подобного не встречал, помогите =(((

так все таки "он" или "она"?) к сожалению больше ничем в твоей проблеме помочь не могу(

Очередная проблема. Имеем все тот же stm32f4 discovery, подключаем стандартную библиотеку SDIO, ну и тут сразу возникает несколько вопросов, как проверить инициализация прошла успешно или нет? И второй, я так думаю, что с первого раза ничего не получится как надо. Правильно ли я инициализировал SDIO? Повторюсь имеем stm32f4 discovery, среду разработки Atollic TRUEStudio, стандартную библиотеку stm32f4xx_sdio.

Сейчас имеем примерно следующий код
CODE
#include "stm32f4xx.h"
#include "stm32f4xx_sdio.h"

uint32_t PowerState;
uint32_t DataCounter;

void vSDIO_Init ( void ) {
GPIO_InitTypeDef GPIO_InitStructure;
SDIO_InitTypeDef SDIO_InitStructure;

/* GPIOC and GPIOD Periph clock enable */
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE );
/* Enable the SDIO APB2 Clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, ENABLE );



/* Configure PC.12 pin: CLK pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIOC->BSRRL = GPIO_Pin_12;
GPIOC->BSRRH = GPIO_Pin_12;
GPIOC->BSRRL = GPIO_Pin_12;
GPIOC->BSRRH = GPIO_Pin_12;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOC, &GPIO_InitStructure);


/* Configure PD.02 CMD line */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);

/* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_Init(GPIOC, &GPIO_InitStructure);


GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);


RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, DISABLE);

SDIO_InitStructure.SDIO_ClockDiv = 0x00;
SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Enable;
SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
SDIO_Init(&SDIO_InitStructure);

/*!< Set Power State to ON */
SDIO_SetPowerState(SDIO_PowerState_ON);

/*!< Enable SDIO Clock */
SDIO_ClockCmd(ENABLE);
}

int main(void)
{
vSDIO_Init();


while (1) {
PowerState = SDIO_GetPowerState();
DataCounter = SDIO_GetDataCounter();
}
}

естественно в переменных "DataCounter", "PowerState " всегда 0x00 ну не запускается у меня ничего с первого раза laughing.gif
kan35
А настроен ли и разрешен ли периферийный PLL на 48МГц?
Еще нюанс: вы разрешили bypass тактового сигнала, это значит что тактовый сигнал будет = частоте pll.
mrcrook
Цитата(kan35 @ Feb 4 2012, 13:09) *
А настроен ли и разрешен ли периферийный PLL на 48МГц?
Еще нюанс: вы разрешили bypass тактового сигнала, это значит что тактовый сигнал будет = частоте pll.

Насколько я понимаю тактирование описано в файле (system_stm32f4xx.c) и SDIO там 48MHz
CODE

*=============================================================================
* Supported STM32F4xx device revision | Rev A
*-----------------------------------------------------------------------------
* System Clock source | PLL (HSE)
*-----------------------------------------------------------------------------
* SYSCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* HCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* AHB Prescaler | 1
*-----------------------------------------------------------------------------
* APB1 Prescaler | 4
*-----------------------------------------------------------------------------
* APB2 Prescaler | 2
*-----------------------------------------------------------------------------
* HSE Frequency(Hz) | 8000000
*-----------------------------------------------------------------------------
* PLL_M | 8
*-----------------------------------------------------------------------------
* PLL_N | 336
*-----------------------------------------------------------------------------
* PLL_P | 2
*-----------------------------------------------------------------------------
* PLL_Q | 7
*-----------------------------------------------------------------------------
* PLLI2S_N | 258
*-----------------------------------------------------------------------------
* PLLI2S_R | 3
*-----------------------------------------------------------------------------
* I2S input clock(Hz) | 86000000
* |
* To achieve the following I2S config: |
* - Master clock output (MCKO): ON |
* - Frame wide : 16bit |
* - Audio sampling freq (KHz) : 48 |
* - Error % : 0.0186 |
* - Prescaler Odd factor (ODD): 0 |
* - Linear prescaler (DIV) : 2 |
*-----------------------------------------------------------------------------
* VDD(V) | 3.3
*-----------------------------------------------------------------------------
* Main regulator output voltage | Scale1 mode
*-----------------------------------------------------------------------------
* Flash Latency(WS) | 5
*-----------------------------------------------------------------------------
* Prefetch Buffer | OFF
*-----------------------------------------------------------------------------
* Instruction cache | ON
*-----------------------------------------------------------------------------
* Data cache | ON
*-----------------------------------------------------------------------------
* Require 48MHz for USB OTG FS, | Enabled
* SDIO and RNG clock |
*-----------------------------------------------------------------------------
*=============================================================================
wedmeed
Цитата(ReRayne @ Feb 3 2012, 16:37) *
4) временами все-таки вышвыривает меня в main и начинает дебажить

А если снять галочку "Run to main()" и пошагать по инициализации, что будет при переходе в мейн?
Цитата(ReRayne @ Feb 3 2012, 16:37) *
0xFFFFFFFE

Что-то сильно напоминает недопрожженную флешку, прочитать бы как-нибудь, что реально записалось после прошивки и сравнить с хексом, который кейл генерирует.
adnega
На той неделе "морозили" изделие на основе STM32F1xx.
При температуре ниже минус 65 работало без проблем (ниже не получалось).
Если нужны подробности, можно их развить.
Danis
Цитата(adnega @ Feb 6 2012, 09:03) *
На той неделе "морозили" изделие на основе STM32F1xx.
При температуре ниже минус 65 работало без проблем (ниже не получалось).
Если нужны подробности, можно их развить.


Я тоже морозил F100 серию, но нет такого холодильника, чтоб до – 60, довольствовался уличными -30. Все ОК работало. А нагревать не пробывали, как там со стабильностью?
adnega
Цитата(Danis @ Feb 6 2012, 11:31) *
Я тоже морозил F100 серию, но нет такого холодильника, чтоб до – 60, довольствовался уличными -30. Все ОК работало. А нагревать не пробывали, как там со стабильностью?


Греть проще. До +85 и выше точно грел, но не на прогоне.
Кстати, встроенный датчик температуры (и внутренняя опора) очень даже ничего)
Acvarif
Цитата(ReRayne @ Feb 3 2012, 15:37) *
Возникла проблема:
Отладочная плата STARTERKIT SK-STM32F217.
Программатор JetLink8/Ultra, драйвер 4.40d.
Среда разработки: Keil 4.23.

Поскольку JetLink8 от Starterkit это не настоящий SEGGER то появление проблемы вполне возможно.
У меня наблюдались частые, на мой взгляд опасные для Flash, сбои JetLink8 на драйвере 4.40d. До таких художеств как у Вас не дошло. Я возвратился на драйвер 4.22f.
Советую перейти на драйвер 4.22f. Работает гораздо надежнее. С загрузкой и отладкой сбои довольно редки. Единственная проблема часто приходится реконектится к USB - Комп теряет отладчик. Подозреваю, что это связано с недостатком питания по USB от конкретного ПК. Проверю на других ПК тогда точно можно сказать.
dezna
Цитата(Acvarif @ Feb 6 2012, 22:23) *
Поскольку JetLink8 от Starterkit это не настоящий SEGGER то появление проблемы вполне возможно.
У меня наблюдались частые, на мой взгляд опасные для Flash, сбои JetLink8 на драйвере 4.40d. До таких художеств как у Вас не дошло. Я возвратился на драйвер 4.22f.
Советую перейти на драйвер 4.22f. Работает гораздо надежнее. С загрузкой и отладкой сбои довольно редки. Единственная проблема часто приходится реконектится к USB - Комп теряет отладчик. Подозреваю, что это связано с недостатком питания по USB от конкретного ПК. Проверю на других ПК тогда точно можно сказать.

скорее всего дело не в ПК а вкабеле USB. у меня такая проблема была с ft2232. кабель USB брал от принтера 3м. так сопротивление 1 жилы там 7Ом, а сама 2232 потребляет от 30мА. на ровном месте падение напряжения 0,42В. а если ещё и питать устройство от программатора, то отваливался программатор практически при каждой прошивке.
перепаял кабель и стало мне счастье! попробуйте - может такая же проблема.
кабель я взял 2 витые пары в общем экране.
Angle
Привет всем.
У меня такой вопрос по IAP.
На STM32F103RBT6 было написано приложение с функциями IAP (сохранял редко изменяемы настройки устройства - в конец внутренней флеш-памяти).
Далее был написан загрузчик для обновления прошивки на основе AN2557 - STM32F10x IAP using the USART, все отлично работает, пепрошивает область флеш с адреса 0x8003000.
Стартует основная программа из загрузчика - переходим на адрес 0x8003000 через присвоение этого адреса указателю на функцию, с последующим вызовом этой функции+переинициализации стека.
Это работает, но! в основном приложении перестали работать функции IAP(сохранение данных в конец флеши) - контроллер зависает.
В чем может быть дело?
dezna
скорее всего страница flash, на которой находятся данные, пересекается со страницей flash памяти программ.
при сохранении настроек необходимо стереть страницу (0.5, 1 или 2 кБ в зависимости от кристала).
и если на этой странице есть код исполняемой программы, то она теряется.
читать страницу в буфер, а затем перезаписывать, тоже не вариант.
выполнение программы может происходить в этой области памяти в момент стирания, тогда мы получим либо прерзагрузку после переполнения
счетчика команд, или HARDFAULT. это не тестировал, потому не могу сказать.
самый простой способ прочитать программу и сравнить с образом. (верифицировать)
Angle
Страницы flash не пересекались, это я проверял.
Оказалось нужно было включить HSI в программе стартующей с адреса 0x8003000, и IAP заработал. (Рекомендации взял с PM0042 STM32F10xxx Flash programming)
Однако, если эту программу зашить с нулевого адреса flash, вместо бутлоадера, IAP работает и без HSI (!?)
ReRayne
wedmeed, начинает с файла стартапа и переходит в main. Похоже, у меня действительно SWD плохо работал в отладчике.
Acvarif, огромное спасибо, помогло! (у меня на 4.22f другой глюк, слетает прошивка с программатора).
dezna, спасибо, буду знать на будущее. Правда, не мой случай, кабели короткие и с питанием все ок.

Очередной неведомой косяк моих кривых ручонок.
Toolchain: MDK-ARM Standard Version: 4.21
Middleware: RL-ARM Real-Time Library Version V4.13
Toolchain Path: BIN40\
C Compiler: Armcc.Exe V4.1.0.713
Assembler: Armasm.Exe V4.1.0.713
Linker/Locator: ArmLink.Exe V4.1.0.713
Librarian: ArmAr.Exe V4.1.0.713
Hex Converter: FromElf.Exe V4.1.0.713
CPU DLL: SARMCM3.DLL V4.21
Dialog DLL: DARMSTM.DLL V1.62
Target DLL: Segger\JL2CM3.dll V2.5
Dialog DLL: TARMSTM.DLL V1.60

В файле stm32_eval_sdio_sd.h разкоменчен дефайн: #define SD_DMA_MODE ((uint32_t)0x00000000)
Есть файл diskio.c, в котором описываются функции работы с SD для файловой системы:
CODE
#include "stm32_eval_sdio_sd.h"
/**************************/
/*-----------------------------------------------------------------------*/
/* Read Sector(s) */
DRESULT disk_read (
BYTE drv, /* Physical drive nmuber (0..) */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address (LBA) */
BYTE count /* Number of sectors to read (1..255) */
)
{
switch (drv)
{
case SDIO_DRIVE:
{
Status = SD_OK;

#if defined SD_DMA_MODE /* DMA Transfer */
/* Read Multiple Blocks */
Status = SD_ReadMultiBlocks((uint8_t*)(buff),(sector)*SECTOR_SIZE,SECTOR_SIZE,count);

/* Check if the Transfer is finished */
Status = SD_WaitReadOperation();

/* Wait until end of DMA transfer */
while(SD_GetStatus() != SD_TRANSFER_OK);
#else /* Polling Transfer */
for (int secNum = 0; (secNum < count) && (Status == SD_OK); secNum++)
{
Status = SD_ReadBlock((buff+SECTOR_SIZE*secNum),
(sector+secNum)*SECTOR_SIZE,
SECTOR_SIZE);

while(SD_GetStatus() != SD_TRANSFER_OK);
}
#endif

if (Status == SD_OK) return RES_OK;
else return RES_ERROR;
}

}
return RES_PARERR;
}

Внезапно оказывается, что компилятор мне включает код не в блоке #if defined SD_DMA_MODE, а блок #else.
demiurg_spb
Цитата(ReRayne @ Feb 8 2012, 12:44) *
Внезапно оказывается, что компилятор мне включает код не в блоке #if defined SD_DMA_MODE, а блок #else.

ИМХО синтаксис препроцессора таков:
Код
#ifdef SD_DMA_MODE
//или
#if defined(SD_DMA_MODE)

хотя попробовал в Кейле и
Код
#if defined SD_DMA_MODE
тоже кажись нормально отрабатывается. Но глазу не привычно такую запись видеть...
Penchev
Помогите разобратся с SPI.Захотел подключить к STM32VLDISCOVERY дисалей LS020,настроил порт и SPI ,в симуляторе KEIL'a v4.23 работает нормально,а именно после записи в SPI1->DR= Cmd; сбрасывается флаг TXE и дальше ждем пока он не подымится while(!((SPI1->SR)&SPI_SR_TXE)); .После того как поднялся идет отправка следующего байта.
привожу настройку SPI и функцию отправки байта.
Код
//*********************Конфигурация SPI в мастер - режиме**********************************************
  
// SPI1->CR1 |= SPI_CR1_BR_0;        // Частота передачи Fclck/4
  SPI1->CR1 |= SPI_CR1_DFF;            // Размер кадра - 16 бит
  SPI1->CR1 |= SPI_CR1_MSTR;        // Установка мастер - режим
  SPI1->CR1 |= SPI_CR1_BIDIMODE;    // Тип коммуникации в 1 направлении                                    
  SPI1->CR1 |= SPI_CR1_BIDIOE;        // Только передача
  SPI1->CR1 |= SPI_CR1_SSI;            //    без этого
  SPI1->CR1 |= SPI_CR1_SSM;            //    и этого в мастер режимме не работает

  SPI1->CR1 |= SPI_CR1_SPE;          // Включение SPI


// Запись команды в дисплей
void Lcd_Write_Command(short Cmd){
  
  GPIOA->BSRR |= RS;                    //RS установлить в 1 (команда)
  GPIOA->BRR |= CS;                       //CS установить в 0 (активный дисплей)
  SPI1->DR = Cmd;                       // ПОСЛЕ ЗАПИСИ В SPI1->DR БИТ TXE НЕ СБРАСЫВАЕТСЯ
  while(!((SPI1->SR)&SPI_SR_TXE));       // ПОЭТОМУ ИДЕТ СРАЗУ ЖЕ ЗАПИСЬ СЛЕДУЮЩЕГО БИТА.
  GPIOA->BSRR |= CS;                     //CS установить в 1 (неактивный дисплей)
}


Подключил железо залил программу и дисплей не инициализируется,при пошаговой отладки заметил, что флаг TXE не сбрасывается после записи в SPI1_DR затем идет проверка бита TXE он постоянно поднят и происходит отправка следующего байта,а буфер то не пуст.....

Добавив задержку в функцию отправки байта
Код
// Запись команды в дисплей
void Lcd_Write_Command(short Cmd){
  int nCount =  15;
  GPIOA->BSRR |= RS;                    //RS установлить в 1 (команда)
  GPIOA->BRR |= CS;                       //CS установить в 0 (активный дисплей)
  SPI1->DR = Cmd;                
  while(!((SPI1->SR)&SPI_SR_TXE));
  
  for (; nCount != 0; nCount--);
  GPIOA->BSRR |= CS;                     //CS установить в 1 (неактивный дисплей)
}


Все заработало.Может ли кто нибудь проверить мой код у себя в железе и посмотреть,что творится с этим флагом TXE.
Или дать рабочий кусочек кода с SPI?
ChipKiller
Цитата("Penchev")
привожу настройку SPI и функцию отправки байта.
... странно, что в настройках не видно строчки
Код
RCC->APB2ENR= .....
Penchev
Да не все показал,повторяюсь все работает,только не так как надо.Флаг TXE в железе не сбрасывается.
Код
//**************************** Настройка POTA **********************************************************
  RCC->APB2ENR|= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта A.
//  RCC->APB2ENR|= RCC_APB2ENR_AFIOEN; // Тактирование альтернативных функций GPIO.
  RCC->APB2ENR|= RCC_APB2ENR_SPI1EN; // Включение тактирования SPI1.
  GPIOA->CRL |= GPIO_CRL_MODE2;         // Output MODE 50 MHz
  GPIOA->CRL &=~GPIO_CRL_CNF2;          // Вывод  PA.2 - на выход (RST).
  GPIOA->CRL |= GPIO_CRL_MODE3;         // Output MODE 50 MHz
  GPIOA->CRL &=~GPIO_CRL_CNF3;          // Вывод  PA.3 - на выход (RS).
  GPIOA->CRL |= GPIO_CRL_MODE4;         // Output MODE 50 MHz
  GPIOA->CRL &=~GPIO_CRL_CNF4;          // Вывод  PA.4 - на выход (NSS).
  GPIOA->CRL |= GPIO_CRL_MODE5;        // Output MODE 50 MHz
  GPIOA->CRL &=~GPIO_CRL_CNF5;
  GPIOA->CRL |= GPIO_CRL_CNF5_1;     // Вывод  PA.5 на выход как альтернативная функция (SCK).
  GPIOA->CRL |= GPIO_CRL_MODE6;        // Output MODE 50 MHz
  GPIOA->CRL &=~GPIO_CRL_CNF6;
  GPIOA->CRL |= GPIO_CRL_CNF6_1;     // Вывод  PA.5 на выход как альтернативная функция (SCK).
  GPIOA->CRL |= GPIO_CRL_MODE7;        // Output MODE 50 MHz
  GPIOA->CRL &=~GPIO_CRL_CNF7;
  GPIOA->CRL |= GPIO_CRL_CNF7_1;     // Вывод  PA.7 на выход как альтернативная функция (MOSI)
dezna
Цитата(Penchev @ Feb 10 2012, 10:19) *
Помогите разобратся с SPI.



SPI1->CR1 |= SPI_CR1_SSI; // без этого
SPI1->CR1 |= SPI_CR1_SSM; // и этого в мастер режимме не работает

использование SS сигнала в MASTER описано в rm0008 "25.3.3 Configuring the SPI in master mode" п.5,
а также в п.6 написано:
6. The MSTR and SPE bits must be set (they remain set only if the NSS pin is connected
to a high-level signal).

Penchev
Цитата(dezna @ Feb 10 2012, 13:36) *
SPI1->CR1 |= SPI_CR1_SSI; // без этого
SPI1->CR1 |= SPI_CR1_SSM; // и этого в мастер режимме не работает

использование SS сигнала в MASTER описано в rm0008 "25.3.3 Configuring the SPI in master mode" п.5,
а также в п.6 написано:
6. The MSTR and SPE bits must be set (they remain set only if the NSS pin is connected
to a high-level signal).


Спасибо за наводку,но с этими битами я попробую разобратся если понадобится аппаратно NSS дергать,а пока я это делаю софтово.
Но все же проблема то в том что я не могу узнать пуст ли буфер или нет,приходится задержки ставить, а при наличии флагов это как то дико...
Сергей Борщ
QUOTE (Penchev @ Feb 10 2012, 08:19) *
затем идет проверка бита TXE он постоянно поднят и происходит отправка следующего байта,а буфер то не пуст.....
А вы не допускаете, что между записью в SPI1->DR и чтением отладчиком содержимого SPI1->SR проходит некоторе время, за которое байт успевает уйти из буфера и буфер таки оказывается действительно пуст?
Попробуйте в цикле ожидания поднять ногу если TXE сброшен а после выхода из цикла эту ногу опускать. И посмотрите осциллографом, поставив точку останова уже после этого участка, т.е. не используя пошаговую отладку.

А ошибка у вас в другом месте: обратите внимание на картинку со структурой модуля SPI. Там четко видно два регистра: Tx buffer и Shift register. Так вот, TXE указывает на то, что ваш байт ушел из Tx_buffer в shift register, но это совершенно не означает, что байт уже выдвинулся. Вам надо проверять RXNE, именно он показывает, что новый байт пришел. А приходит байт одновременно с отправкой. И не забывайте очищать его фиктивным чтением SPI1->DR после проверки.

Добавлено:
И, кстати, поскольку при входе в функцию у вас передача не велась - у вас пусты и Txbuffer и Shift Register. Поэтому при записи в DR ваш байт попадает в Tx Buffer и сразу же проваливается в Shift Register. Согласно картинкам в даташите TXE будет выставлен на время одного бита. Это доказывает, что симулятор ваш отрабатывает периферию с ошибкой. И осциллографом на ноге вы можете ничего не увидеть, если скорость обмена по SPI достаточно велика.
dezna
Цитата(Penchev @ Feb 10 2012, 13:51) *
Спасибо за наводку,но с этими битами я попробую разобратся если понадобится аппаратно NSS дергать,а пока я это делаю софтово.


у меня используется SPI2, но суть та же
вот его инициализация:

GPIOB->BSRR = 1<<12; //собственно установка NSS в единицу
SPI2->CR2 = SPI_CR2_SSOE;
SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1;
SPI2->CR1 |= SPI_CR1_SPE;

у меня также NSS используется софтово. и если его не установить перед инициализацией в 1, то SPI переходит в SLAVE.
был такой косяк.
Penchev
Цитата(Сергей Борщ @ Feb 10 2012, 15:34) *
А вы не допускаете, что между записью в SPI1->DR и чтением отладчиком содержимого SPI1->SR проходит некоторе время, за которое байт успевает уйти из буфера и буфер таки оказывается действительно пуст?

Не допускаю, что он успевает тогда бы работало без задержки и при Fclck/4,8,16,32 не приходилось бы увеличивать эту же самую задержку.
Сейчас попробую Ваши советы,правда к осцилографу щупов нет, уменьшу ка я скорость передачи и вместо проверки бита TXE коприровать значение SPI1_SR в переменные.

Цитата(dezna @ Feb 10 2012, 16:43) *
у меня используется SPI2, но суть та же
вот его инициализация:

GPIOB->BSRR = 1<<12; //собственно установка NSS в единицу
SPI2->CR2 = SPI_CR2_SSOE;
SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1;
SPI2->CR1 |= SPI_CR1_SPE;

у меня также NSS используется софтово. и если его не установить перед инициализацией в 1, то SPI переходит в SLAVE.
был такой косяк.


ПопробовалС Вашей настройкой И все так же работает, TXE бит стоит как вкопаный, правда RXNE поднимается но только на один такт, и сразу Же сбрасываетя...
KnightIgor
Цитата(Penchev @ Feb 10 2012, 14:36) *
И все так же работает, TXE бит стоит как вкопаный

SPI имеет двойную буферизацию: после SPI->DR = data байт/слово переписывается в сдвиговый регистр, начинается его выдвижение, а DR тут же готов принять на грудь еще - TXE "стоит". Ткните быстро два раза данные в SPI->DR, и бит TXE "упадет".
Penchev
Сейчас нет под рукой железяки, в понедельник проверю, так что для отправки байта делать такую запись
SPI1->DR = Cmd;
SPI1->DR = Cmd;
while(!((SPI1->SR)&SPI_SR_TXE));
я правильно Вас понял?
KnightIgor
Цитата(Penchev @ Feb 11 2012, 14:29) *
Сейчас нет под рукой железяки, в понедельник проверю, так что для отправки байта делать такую запись
SPI1->DR = Cmd;
SPI1->DR = Cmd;
while(!((SPI1->SR)&SPI_SR_TXE));
я правильно Вас понял?

В качестве эксперимента - да, но в реальном приложении так заморачиваться совсем не обязательно: если надо передавать последовательность байт, просто кидайте их в пасть SPI, - и все. Если же Вы хотите после передачи байта каждый раз там дергать NSS, то TXE - не тот флаг, чтобы отслеживать начало-завершение передачи. См. бит BSY.
Penchev
Я уже работал с SPI PIC'ков и LPC так там таких проблем не было, есть флаг опустошения или заполнения буфера вот он и опрашивается.
Ладно уже окончательно этими флагами сломал голову, BSY тоже не поднимается.В примерах на передачу я видел опрос TXE.Надо бы SPI2 попробовать мало ли.
Danis
Не знаю, может и не в тему, особо не вникал.
Моя передача по SPI с ожиданием завершения передачи 1-го байта

Код
u8  spi_process_8(u8 data)
{
  SPI1->DR = data;
  while ( (SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET );

  return SPI1->DR;
}
KnightIgor
Цитата(Penchev @ Feb 11 2012, 17:39) *
.Надо бы SPI2 попробовать мало ли.

Разницы нет.
Вы бы задачку обрисовали, что именно нужно.
Если просто идут передачи, то достаточно ПЕРЕД записью проверить готовность регистра данных (наличие флага TXE).
Если же необходимо точно знать, что передача (и прием, который имеет место одновременно с передачей в режиме мастера) завершилась, чтобы после этого "поднять" ногу селекции периферии, то следует использовать метод, указаный Danis в предыдущем посте, немного его модифицировав для передачи потока данных:

1). вначале дождаться отсутствия бита BSY,
2). "опустить" ногу селекции периферии,
3). прочитать DR, гарантируя сброс RXNE,
4). дождаться готовности TXE,
5). вкинуть данные в DR,
6). дождаться готовности RXNE, который взведется после самого последнего такта SCLK,
7). прочитать и, возможно, сохранить принятый DR, если надо,
8). перейти к 4)., если есть еще что для передачи/приема.
9). "поднять" ногу селекции периферии.
xheli
Чтобы не создавать новую тему.
Имеется отладочная платка, 5 на 5 см с stm32f417 144 ноги. Плата простая, выведено большинство ног на разъемы плюс житаг. Из дополнительных элементов тока конденсаторы по питанию согласно даташиту. Запущен микроконтроллер от внутреннего rc генератора на 168мГц. Проблема в том, что при поднесении пальца руки к микроконтроллеру в области ближе к углу где расположены 1, 144 пины, происходит насколько я смог понять срыв тактирования. Для этого даже не нужно касаться самого корпуса. Если прикасаться в других местах, все хорошо. Ну и вопрос, как такое поведение победить? Подскажите в какую сторону искать.
scifi
Может быть, плавают некоторые управляющие линии типа RST, JTAG? Если так, то добавить внешние подтяжки там, где необходимо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.