Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103x
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4, 5, 6
KRS
Цитата(Vitaliy_ARM @ Feb 1 2008, 02:23) *
Недавно наткнулся на ссылку с конфигурацией OpenOCD под вашу плату

Да как раз с ней проблем нет никаких, IAR 4.xx и 5.xx с ней отлично работает через LMFTDI,
а моя плата с STM32F103 почему то не работает (наверное каких то сигналов не хватает диагностики нет никакой....)

Цитата(Vitaliy_ARM @ Feb 1 2008, 02:23) *
Может выложите свою версию OpenOCD сюда? wink.gif

Эта сборка OpenOCD с конфигурацией
./configure --enable-ft2232_ftd2xx --with-ftd2xx=/cygdrive/e/.....
И удалено установка младшего бита PC ( что бы IAR не глючил), зато наверное оригинальный GDB может глючить.
У меня с IAR вроде все работает.
gregory812
А что, правда, что J-Link еще не поддерживает STM32?

А что, правда, что J-Link еще не поддерживает STM32?
KRS
Цитата(gregory812 @ Feb 15 2008, 18:02) *
А что, правда, что J-Link еще не поддерживает STM32?

IMHO не правда. В IAR даже настройка есть на SWD, а SWD есть только у Cortex
К тому же у Segger написано
Any ARM7/ARM9 core (including thumb mode) and Cortex M3 including SWD


Кстати как раз сегодня плотно начал работать с STM32F013C6T6.
(ну тут как всегда танец с бубном с отладчиком и gdb server).
Но обнаружил интересную вещь!
простейшая программа
Код
void main(void)
{
    RCC_APB2ENR_bit.IOPBEN = 1;
    GPIOB_CRL_bit.CNF2 = 0;
    GPIOB_CRL_bit.MODE2 = 1;
    while(1) {
        GPIOB_BSRR = 1<<2;
        GPIOB_BRR = 1<<2;
    }
}


Из флеша дергает ногами быстрее чем из SRAM. Но самое интересное из флеша картинка получается короткий импульс вверх короткий вниз короткий вверх длинный вниз и так по кругу.
Где то так
Код
из флеша
001010010100
из SRAM
00011000110001100011000

причем имеено в такой пропорции.

Если в цикле поставить
Код
    while(1) {
        GPIOB_BSRR = 1<<2;
        GPIOB_BRR = 1<<2;
        GPIOB_BSRR = 1<<2;
        GPIOB_BRR = 1<<2;
    }

То из флеша картина не меняется

Код
из флеша
001010010100
из SRAM
000110011000110011000
OVladimir
Цитата(OVladimir @ Jan 12 2008, 19:15) *
с STM при дебаге если после точки останова необходимо сделать шаг (step over, например), попадаешь в процедуры обработки какого-нибудь прерывания, поэтому приходится расставлять доп. брейкпоинты чтобы просто пройти по процедуре основного цикла.


и ещё, на сей раз в корзину плюсов по поводу дебага: значения глобальных переменных видно всё время, не надо останавливать выполнение программы.
KRS
Немного потестировал STM32F103

Простейшая программка в цикле доступ к GPIO, просто операции в регистрах и переходы, и SRAM

Код
unsigned gpio_test(void)
{
    unsigned r,i;
    r = SYSTICKCVR;
    i = 1024;
    do {
        GPIOB_BSRR = 1<<2;
        GPIOB_BRR = 1<<2;
    }while(--i);
    return r - SYSTICKCVR;
}

unsigned alu_test(void)
{
    unsigned r,i,tmp;
    r = SYSTICKCVR;
    i = 1024;
    do {
        if (tmp) tmp++;
    }while(--i);
    return r - SYSTICKCVR;
}

unsigned ram_test(void)
{
    unsigned r,i;
    volatile unsigned tmp;
    r = SYSTICKCVR;
    i = 1024;
    do {
        tmp = 1;
        tmp = 2;
    }while(--i);
    return r - SYSTICKCVR;
}


компилировал IAR 5.11 с максимальной оптимизацией, сами цыклы получились
Код
??gpio_test_1:
        STR      R4,[R3, #+0]
        STR      R4,[R3, #+4]
        SUBS     R2,R2,#+1
        BNE.N    ??gpio_test_1

??alu_test_0:
        CBZ      R0,??alu_test_1
        ADDS     R0,R0,#+1
??alu_test_1:
        SUBS     R3,R3,#+1
        BNE.N    ??alu_test_0

??ram_test_0:
        STR      R4,[SP, #+0]
        STR      R3,[SP, #+0]
        SUBS     R2,R2,#+1
        BNE.N    ??ram_test_0


Результаты для SRAM и флеша с разными wait stait
Получатеся что из Флеша доступ к переферии существенно быстрее.

Код
            SRAM         FLASH 0       FLASH 1      FLASH 2
GPIO        12335        6191          8238         12333
ALU         6144         5121          6145         9213
RAM         8189         5121          8189         12283
cebotor
Цитата(KRS @ Feb 1 2008, 10:36) *
Да как раз с ней проблем нет никаких, IAR 4.xx и 5.xx с ней отлично работает через LMFTDI,
а моя плата с STM32F103 почему то не работает (наверное каких то сигналов не хватает диагностики нет никакой....)
Эта сборка OpenOCD с конфигурацией
./configure --enable-ft2232_ftd2xx --with-ftd2xx=/cygdrive/e/.....
И удалено установка младшего бита PC ( что бы IAR не глючил), зато наверное оригинальный GDB может глючить.
У меня с IAR вроде все работает.

Еще раз спасибо , заставил работать OPENOCD с помощью вашего патча с STM32.
Однако у меня не STELLARIS-овская плата а OLIMEX-овский USB_OCD jtag адаптер, и я так понимаю именно по этому OPENOCD не врубает swd режим. следовательно мне надо перепрошить епромку содержимым таким же как у вас , чтобы получить всю мощь SWD smile.gif
не выложите ?
KRS
Цитата(cebotor @ Feb 26 2008, 16:41) *
именно по этому OPENOCD не врубает swd режим. следовательно мне надо перепрошить епромку содержимым таким же как у вас , чтобы получить всю мощь SWD smile.gif

Не не поэтому. OpenOCD вообще не умеет работать через SWD sad.gif, покрайней мере пока. Я тоже использую режим JTAG.
А прошивку прилагаю, может понадобится что бы IAR определил устройство как LM FTDI
KRS
Все еще мучаю STM32F103. Пока чип работает хорошо.
Кстати у него очень удобная реализация CAN - 2 fifo (что мне удобнее чем куча mailbox) и много довольно гибких фильтров.
И еще тут обнаружил что APB1 (на ней и CAN висит ) работает (по даташиту) максимум на 36 Mhz, т.к. я на это внимания не обратил у меня APB1 и CAN на ней работают на полной скорости 72 Mhz ( глюков не было), но скорость я конечно все равно понижу до 36.
cebotor
Цитата(KRS @ Mar 11 2008, 18:38) *
Все еще мучаю STM32F103. Пока чип работает хорошо.
Кстати у него очень удобная реализация CAN - 2 fifo (что мне удобнее чем куча mailbox) и много довольно гибких фильтров.

тоже мучаю его , все приятненько , только по прежнему накалываюсь н абаги в либах ... например при работе со слипом процедура
RCC_WaitForHSEStartUp - таймаут тупым счетчиком который обнуляется один раз при старте микроконтроллера - наш выход :
ErrorStatus RCC_WaitForHSEStartUp(void)
{
/* Wait till HSE is ready and if Time out is reached exit */
StartUpCounter=0;
ну хотя бы так , не переписывать же все.

PS так и не разобрался с SWD !!!!! вобще никак ни через ft2232 ни через три варианта j linka sad.gif
что делать ума не приложу ..
на jlink mt link и jet-link IAR ругается типа - указанный адаптер не поддерживает режим СВД ! sad.gif
KRS
Цитата(cebotor @ Mar 13 2008, 16:09) *
тоже мучаю его , все приятненько , только по прежнему накалываюсь н абаги в либахм СВД ! sad.gif


Да я тоже сразу эти либы скачал, посмотрел на них... и решил что обойдусь без них.

На SPI тут уже жаловались - что плохо описан. IMHO он не плохо описан а просто так тупо сделан. Очень примитивно. Больше всего расстраивает что нет флага на конец передачи, флаг на прием срабатывает по приему последнего бита и если CHPA = 0 получается на пол периода раньше, что очень неудобно если скорость маленькая и чипселекты софтом реализованы. Но самое главное при overrun остается не новое значение - а старое и пока его не прочитать все новые будут отброшены, что очень неудобно когда чать устройств на SPI только на передачу. Если например тупо послать 4 байта то потом в SPI_DR останется не последний принятый байт, а первый а все остальные удалятся ( ну и флаг overrun конечно будет установлен)
Vitaliy_ARM
Получил на днях плату PREMIER.

Кто-нибудь ее к IAR подключал?
KRS
По поводу SPI -
1. У меня не получилось нормально настроить SS на выход. Вернее на выход он настраивается, но стоит только разрешить SPI (SPIEN бит) как SS встает в 0 и никак не привязан к фреймам.
2. Хоть и написано что CPHA можно менять не отключая SPI (если в данный момент нет передачи) это как то криво работает (с флагом что данные есть были глюки прходилось проверять перед отправкой и первый байт отправлялся криво), заморачиваться не стал - переключаю SPI двумя записями - 1 с новым конфигом но без enable, вторая с enabe.

По поводу отладки
Отладка через FT2232 работает, но есть некоторая кривость IMHO связана с серьезными отличаями архитектуры ( новые регистры) IAR при отладке через GDB server показывает только R0 - R12 и PC
LR SP все время 0, остальные регистры вообще ----.
Сечас в основонм отлаживаюсь в RAM ( init script ресетит проц, устанавливает VTOR и PC) все работает даже прерывания и в RAM и во фелеше. Только после загрузки программы в RAM надо сделать single step (можно в асме прямо) а потом run иначе встанет где нибудь сама, в произвольном месте, что за фича не понятно ( но не критично single step вылечивает).

Тут сделал свой отладчик для SWD на FT245R/FT232R используя synchro bit bang. c протоколом SWD полностью разобрался. И даже прикрутил эту штуку к OpenOCD и вот сегодня даже удалось пошагать под IAR. Но пока все кривовато (особенно внедрение в openocd я переписал cortex_swjdp так что фиксировано работает с моим устройством через swd_dp).
cebotor
Цитата(KRS @ Apr 2 2008, 23:35) *
По поводу отладки
Отладка через FT2232 работает, но есть некоторая кривость IMHO связана с серьезными отличаями архитектуры ( новые регистры) IAR при отладке через GDB server показывает только R0 - R12 и PC
LR SP все время 0, остальные регистры вообще ----.
Сечас в основонм отлаживаюсь в RAM ( init script ресетит проц, устанавливает VTOR и PC) все работает даже прерывания и в RAM и во фелеше. Только после загрузки программы в RAM надо сделать single step (можно в асме прямо) а потом run иначе встанет где нибудь сама, в произвольном месте, что за фича не понятно ( но не критично single step вылечивает).

Тут сделал свой отладчик для SWD на FT245R/FT232R используя synchro bit bang. c протоколом SWD полностью разобрался. И даже прикрутил эту штуку к OpenOCD и вот сегодня даже удалось пошагать под IAR. Но пока все кривовато (особенно внедрение в openocd я переписал cortex_swjdp так что фиксировано работает с моим устройством через swd_dp).

а почему вы взяли делать отладчик свд из 245й в битбэнг моде а не из той же 2232 ? если не секрет конечно ? ведь та более предназначена для этого насколько я понимаю. второй вопрос а не будет ли вам сложн оподелиться ссылками на документы , которые помогли вам в реализации своего swd ?
KRS
Цитата(cebotor @ Apr 3 2008, 14:32) *
а почему вы взяли делать отладчик свд из 245й в битбэнг моде а не из той же 2232 ? если не секрет конечно ? ведь та более предназначена для этого насколько я понимаю. второй вопрос а не будет ли вам сложн оподелиться ссылками на документы , которые помогли вам в реализации своего swd ?

232R/245R не требует внешних компонентов (генератор и eeprom на борту), еще дешевле и меньше по размеру. Лучше использовать 232R т.к. может работать еще и в режиме UART ( можно например LPC программировать). К тому же по скорости не намного медленнее 2232 получается потому что основные задержки происходят в USB (полудуплекс). К тому же у меня есть плата на которй используется 245R ( поэтому пока с ней и работаю, старые 232 не катят там нет синхро бит банг).

а основные документы
IHI0031A_ARM_debug_interface_v5.pdf
DDI0337E_cortex_m3_r1p1_trm.pdf
DDI0405B_arm_v7m_architecture_app_level_reference_manual.pdf

они доступны на сайте arm ( для некоторых надо зарегистрироваться и сразу можно скачать)


кстати OpenOcd прекрасно работает с флешом stm32, сейчас проверил. Там только артефакт в исходнике надо убрать ( наверное от str остался)
а то пишет что флеш с 0x08000000 начинается.
Код
Index: stm32x.c
===================================================================
--- stm32x.c    (revision 526)
+++ stm32x.c    (working copy)
@@ -676,7 +676,7 @@
    
    LOG_INFO( "flash size = %dkbytes", num_sectors );
    
-    bank->base = 0x08000000;
+    bank->base = 0x00000000;
    bank->size = num_sectors * 1024;
    bank->num_sectors = num_sectors;
    bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors);
mai
Попробовал в своей программе переводить stm32 в режим сна командами WFI и WFE. Работает вроде как ожидалось, но есть неприятный сюрприз: перестает работать jtag. Использую J-Link вместе с IAR. Так вот IAR пишет
Цитата
Fri Apr 04 10:12:27 2008: Fatal error: Wrong ROM table component Id. Expected 0xB105100D, Found 0x00000000

Проверил это на двух кристалах. Причем во второй раз в программе сделал возможность выключать засыпание. Теперь при включенном засыпании jtag не работает, выключаю засыпание - работает снова.
Не помню ничего на этот счет в документации, или я что-то пропустил? Покопался немного в гугле, нашел упоминание о таком поведении http://www.st.com/mcu/forums-cat-6541-23.html
cebotor
Цитата(mai @ Apr 4 2008, 10:21) *
Попробовал в своей программе переводить stm32 в режим сна командами WFI и WFE. Работает вроде как ожидалось, но есть неприятный сюрприз: перестает работать jtag. Использую J-Link вместе с IAR.


да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип smile.gif и теперь jtag-ом до них не дотянуться.
mai
cebotor
[q]да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип и теперь jtag-ом до них не дотянуться.[/q]
Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса?

Цитата(mai @ Apr 4 2008, 13:05) *
cebotor
Цитата
да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип и теперь jtag-ом до них не дотянуться.

Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса?



Цитата(mai @ Apr 4 2008, 13:06) *
cebotor
Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса?



Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса?



Нет макета под руками, проверить не могу.
Сейчас ведь, что у меня получается: сразу после сброса опция, разрешающая засыпание, разрешена и jtag не работает. Устанавливаю в программе запрет засыпания и jtag начинает работать. Получается jtag не сбрасывает контроллер? Иначе после сброса опция, разрешающая засыпание, включилась бы и не дала работать jtag. А jtag все же работает.
cebotor
Цитата(mai @ Apr 4 2008, 13:27) *
Сейчас ведь, что у меня получается: сразу после сброса опция, разрешающая засыпание, разрешена и jtag не работает. Устанавливаю в программе запрет засыпания и jtag начинает работать. Получается jtag не сбрасывает контроллер? Иначе после сброса опция, разрешающая засыпание, включилась бы и не дала работать jtag. А jtag все же работает.

Логика крайне проста - жтаг не может дотянуться до контроллера пока тот спит(вообще), если у вас в проекте пауза между периодами сна больше времени требующегося жтагу чтобы остановить процессор, то проблем быть не должно (теоретически).. На практике же, например lpc очень медленно останавливается по жтагу - сначала стопается ядро , а потом вся переферия - так что глобально программа может таки встать раком.

Да и еще если пауза достаточна , но периоды сна слишком велики - то у жтага будет выходить таймаут и у вас процессор будет подчиняться ему (жтагу) через раз smile.gif
pan_oleg
День добрый.,
У меня проблема с модулем I2C на STM32F103.
Встечал в теме фразу, корявий мол I2C.
Помогите розобратся.
Проблема в следующем:
на I2C подключена EEPROM 24LC256, всял из екземпелов пример по роботе с I2C EEPROM, единственое что подменил, сделал два байти установки адреса ячейки в EEPROM (в примере однобайтная адресация).
проблема с том, что после одного чтения из EEPROM код зависает, не может создать старт (зацикливается на ужедании создания старта),
потогает ресет кода.
часть кода
EEPROM_ADDRESS = 0xA2;
u16 ee_adr=0;
while(1)
{
u8 qwq;
I2C_EE_BufferRead(&qwq, ee_adr++, 1);
uartSendByte(GSM_UART,qwq);
}
тоесть в цыкле читаю EEPROM,
фокус в том если например поставить брекпоент на
I2C_EE_BufferRead(&qwq, ee_adr++, 1);
или
uartSendByte(GSM_UART,qwq);
то все работает (читается байт за байтом)
работаю через MT-Link+JTAG+IAR
пробовал в чикл вставлять паузу(после завершения чтения EEPROM), не помогает
Посоветуйте, куда копать help.gif
Заранее благодарен.
mai
[q]cebotor[/q]
Спасибо за разъяснения. Картинка получается не совсем приятная, пытаться искусственно управлять периодами сна и бодрствования как-то уж совсем печально, на мой взгляд.
Придется все же делать возможность выключить засыпание в работающей программе, чтобы иметь возможность дать работать jtag.
KRS
Цитата(mai @ Apr 4 2008, 14:26) *
Спасибо за разъяснения. Картинка получается не совсем приятная, пытаться искусственно управлять периодами сна и бодрствования как-то уж совсем печально, на мой взгляд.
Придется все же делать возможность выключить засыпание в работающей программе, чтобы иметь возможность дать работать jtag.

С stm32 по поводу этого можно не беспокоится! Потому что законектится к процу через SWD можно пока он в ресете ( сам лично пробовал ). И можно легко не дать процу выполнить не одной команды ( достаточно поставить остновку на ресет и потом только отпустить ногу ресет) как все это делается описано в соотв. даташитах!
pan_oleg
проверил процедуру записи байта в еепромку - работает нормально, похоже имено в чтении .
Привожу исходник
/*******************************************************************************
* Function Name : I2C_EE_BufferRead
* Description : Reads a block of data from the EEPROM.
* Input : - pBuffer : pointer to the buffer that receives the data read
* from the EEPROM.
* - ReadAddr : EEPROM's internal address to read from.
* - NumByteToRead : number of bytes to read from the EEPROM.
* Output : None
* Return : None
*******************************************************************************/
void I2C_EE_BufferRead(u8* pBuffer, u16 ReadAddr, u16 NumByteToRead)
{
/* Send START condition */
I2C_GenerateSTART(I2C1, ENABLE);

/* Test on EV5 and clear it */вот тут циклится!!!
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

/* In the case of a single data transfer disable ACK before reading the data */
if(NumByteToRead==1)
{
I2C_AcknowledgeConfig(I2C1, DISABLE);
}

/* Send EEPROM address for write */
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);

/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

/* Clear EV6 by setting again the PE bit */
I2C_Cmd(I2C1, ENABLE);

/* Send the EEPROM's internal address (high byte)to write to */
I2C_SendData(I2C1, ReadAddr>>8);

/* Test on EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* Send the EEPROM's internal address (low byte) to write to */
I2C_SendData(I2C1, ReadAddr);

/* Test on EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* Send STRAT condition a second time */
I2C_GenerateSTART(I2C1, ENABLE);

/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

/* Send EEPROM address for read */
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Receiver);

/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

/* While there is data to be read */
while(NumByteToRead)
{
/* Test on EV7 and clear it */
if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
{

if(NumByteToRead == 2)
{
/* Disable Acknowledgement */
I2C_AcknowledgeConfig(I2C1, DISABLE);

}

if(NumByteToRead == 1)
{
/* Send STOP Condition */
I2C_GenerateSTOP(I2C1, ENABLE);
}

/* Read a byte from the EEPROM */
*pBuffer = I2C_ReceiveData(I2C1);

/* Point to the next location where the byte read will be saved */
pBuffer++;

/* Decrement the read bytes counter */
NumByteToRead--;

}
}

/* Enable Acknowledgement to be ready for another reception */
I2C_AcknowledgeConfig(I2C1, ENABLE);
}
mai
KRS
Цитата
С stm32 по поводу этого можно не беспокоится! Потому что законектится к процу через SWD можно пока он в ресете ( сам лично пробовал ). И можно легко не дать процу выполнить не одной команды ( достаточно поставить остновку на ресет и потом только отпустить ногу ресет) как все это делается описано в соотв. даташитах!

Спасибо, буду знать. Только у меня сейчас старенький J-Link, а он, насколько я знаю, SWD не поддерживает.
cebotor
Цитата(pan_oleg @ Apr 4 2008, 15:30) *
проверил процедуру записи байта в еепромку - работает нормально, похоже имено в чтении .

Кривость реализации i2c в stm, заключается в том, что они там наворотили "не совсем стэйт машину".. То есть евенты евентами , но отрабатывать их надо побитно а не так как они рекомендуют.
приблизительно 80 процентов вероятности вашего клина в том , что у вас приходит событие с лишним выставленным битом (или без бита)изза несовпадения (например последовательности обмена или входа в прерывания) неотрабатывается - выход отлаживать пошагово , смотреть по диаграммам как в референсе написано ..

И простите поллингом я ничего не делал только по прерыванию.

Я для начала делал так
добавил к строке
#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((u32)0x00070084)
#define I2C_EVENT_MASTER_BYTE_TRANSMITTED_2 ((u32)0x00000084)
#define I2C_EVENT_MASTER_BYTE_REQUESTED ((u32)0x00070080)
все три события - обрабатываютьяс эквивалентно ...

И это касается нескольких событий... Однако потом мне стало стыдно и я переписал все на побитную обработку и "фирменные" события не использую совсем ...
Просить меня дать получившееся не имеет смысла ибо "агрегаты" , которыми я управляю сами имеют шандарахнутый I2C .
pan_oleg
Спасибо что откликнулись.
Пошаговая отладка показала что переменая (см. ниже) LastEvent получает значение 0х00030041, вместо 0х00030001. похоже гдето ещо появляется событие RxNE: Data Register not Empty (receivers).
но откуда, и почему при шаговом выполнении все работает? не пойму. Переделал подтяжку согласно доки (добавил по резистору между шиной и контроллером), ничего не поменялось.
подскажите, как побороть эту беду crying.gif

/*******************************************************************************
* Function Name : I2C_CheckEvent
* Description : Checks whether the last I2Cx Event is equal to the one passed
* as parameter.
* Input : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* - I2C_EVENT: specifies the event to be checked.
* This parameter can be one of the following values:
* - I2C_EVENT_SLAVE_ADDRESS_MATCHED : EV1
* - I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2
* - I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3
* - I2C_EVENT_SLAVE_ACK_FAILURE : EV3-1
* - I2C_EVENT_MASTER_MODE_SELECT : EV5
* - I2C_EVENT_MASTER_MODE_SELECTED : EV6
* - I2C_EVENT_MASTER_BYTE_RECEIVED : EV7
* - I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8
* - I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9
* - I2C_EVENT_SLAVE_STOP_DETECTED : EV4
* Output : None
* Return : An ErrorStatus enumuration value:
* - SUCCESS: Last event is equal to the I2C_Event
* - ERROR: Last event is different from the I2C_Event
*******************************************************************************/
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, u32 I2C_EVENT)
{
u32 LastEvent = 0;
u32 Flag1 = 0, Flag2 = 0;
ErrorStatus status = ERROR;

/* Check the parameters */
assert_param(IS_I2C_EVENT(I2C_EVENT));

Flag1 = I2Cx->SR1;!!!!!!!!!!!иногда стает 0х00000041, хотя SR1=0х00000001!!!!!!!!!!!!!!!!!!
Flag2 = I2Cx->SR2;
Flag2 = Flag2 << 16;

/* Get the last event value from I2C status register */
LastEvent = (Flag1 | Flag2) & I2C_FLAG_Mask;

/* Check whether the last event is equal to I2C_EVENT */
if (LastEvent == I2C_EVENT )
{
/* SUCCESS: last event is equal to I2C_EVENT */
status = SUCCESS;
}
else
{
/* ERROR: last event is different from I2C_EVENT */
status = ERROR;
}

/* Return status */
return status;
}
cebotor
Цитата(pan_oleg @ Apr 4 2008, 18:11) *
Спасибо что откликнулись.

да не за что
именно про это я Вам и говорил - у меня было то же самое при пошаговом бит снимался , а при последовательном - просто не успевает сняться . и2ц штука циклическая - так что если вы перед этин
новым стартом "принимали " а потом решили завершить прием и принять заново , то в пмомент завершения вам придет событие (тот самый бит номер 6 ) что регистр не пуст , это вызвано тем что регистр приема передачи лежит над сдвиговым регистром и является как бы однобайтовым фифо буффером , дающим вам отставание (или опережение, это как посмотреть ) на один байт... выход проигнорируйте этот бит .

если Вам лень делать по человечески (или пока лень) напишите так
#define I2C_EVENT_MASTER_MODE_SELECT ((u32)0x00030001) /* BUSY, MSL and SB flag */
#define I2C_EVENT_MASTER_MODE_SELECT_2 ((u32)0x00030041) /* BUSY, MSL , RxNE and SB flag */
и обработайте оба события
pan_oleg
я сделал несколько по другому, работает нормально, только что все 32 кБ yeah.gif побайитно записал и считал
я подпровил:
Flag1 = I2Cx->SR1;
Flag2 = I2Cx->SR2;
Flag2 = Flag2 << 16;

/* Get the last event value from I2C status register */
LastEvent = (Flag1 | Flag2) & I2C_EVENT;

/* Check whether the last event is equal to I2C_EVENT */
if (LastEvent == I2C_EVENT )
в принципе ето и есть битовая маска, как вы считаете?
или я неправельно сделал?
вам огромный a14.gif a14.gif a14.gif
cebotor
Цитата(pan_oleg @ Apr 4 2008, 19:01) *
я сделал несколько по другому, работает нормально, только что все 32 кБ yeah.gif побайитно записал и считал
я подпровил:
Flag1 = I2Cx->SR1;
Flag2 = I2Cx->SR2;
Flag2 = Flag2 << 16;

/* Get the last event value from I2C status register */
LastEvent = (Flag1 | Flag2) & I2C_EVENT;

/* Check whether the last event is equal to I2C_EVENT */
if (LastEvent == I2C_EVENT )
в принципе ето и есть битовая маска, как вы считаете?
или я неправельно сделал?

то есть вы проверяете , присутствует ли искомое событие в пришедшем статусе?
Это полукорректный метод , более корректный чем плодить псевдоодинаковые статусы , но менее корректный чем обработать все биты "выбирая" их по одному или по группам , то есть бит RxNe то же надо отработать в зависимости от того "в каком положении" мы сейчас находимся. то есть в данном случае , если пришел байт , а мы ждали конца, то в принципе все корректно , а вот если произошла или ошибка , или непреднамеренный конец в дополнении к ожидаемому нами событию , то его нельзя игнорировать, иначе встанем в неприличную позу.
Abckur
Цитата(KRS @ Feb 26 2008, 18:15) *
OpenOCD вообще не умеет работать через SWD sad.gif, покрайней мере пока. Я тоже использую режим JTAG.

А прошивку прилагаю, может понадобится что бы IAR определил устройство как LM FTDI


Подскажите где взять схему под эту прошивку ? Спасибо !
KRS
Цитата(Abckur @ Apr 11 2008, 11:57) *
Подскажите где взять схему под эту прошивку ? Спасибо !

Да стандартное подключение FT2232C в качестве JTAG TCK/TDI/TDO/TMS на своих местах и еще систем ресет nSRST на ADBUS5

что бы схему посмотреть надо документацию на eval board скачать (например Stellaris LM3S6965 Evaluation Board) только там еще PLD стоит, но он нужен только для SWD и переключения/отключения дебагера на внешний разъем.
Abckur
А прошивку то во что заливать ? на в CPLD разве ?

в 93с46 чтоль ?
KRS
Цитата(Abckur @ Apr 11 2008, 22:30) *
А прошивку то во что заливать ? на в CPLD разве ?

прошивка заливается стндартной FTDIной программой к еепром подключенной к FTDI (штатным способом) нужна исключительно для настройки параметров FT2232 ( имя VID PID ....)

CPLD вообще не нужна ( если использовать JTAG, а SWD IAR не поддерживает, да и для SWD нужен только буфер с OE)

К тому же если вы собираетесь использовать OpenOcd еепром вообще не нужен. (кстати IAR поддерживает только cortex-M3 через такое устройство, а OpenOCd и все )
KRS
Цитата(AlexandrY @ Jan 13 2008, 12:37) *
Лучше скажите как умудрится сделать чтобы отладчик все время спотыкался на прерываниях.
Такого никогда не было и в последнем компилере нет.

Для этого в DHCSR есть бит MASKINTS, если его установить в еденицу то прерывания будут замаскированы (причем и при single step и при run в режиме отладки) что не всегда очень хорошо.
IAR когда шагает по исходнику С ( не в дизассемблере) если возможно ставить точки останова ставит их и делает run (так что прерывания должны обходится).
OpenOcd всегда чистит бит MASKINTS ( и это можно исправить при singlestep, а при resume оставить очистку).
Вообще идеально было бы выбирать режим с прерываниями или без...


Цитата(OVladimir @ Jan 13 2008, 12:43) *
а точек останова да, больше: 8 вместо 2 в ARM7

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

Я уже почти доделал совю реализацию GDB server на FT232/245R (уже совсем без использования openocd, его идеология не очень хорошо ложится на SWD), вообще даже при небольщой частоте SWD (в пределе 500 khz из-за особенностей FTDI) отладчик просто леатет ( скорость достигается за счет очереди и послыки сразу большого количества тарнзакций....) по сравнеию с обычным JTAG через FT2232C, да и пожалуй с Wiggler и некоторыми другими ( single step просто мгновенно отрабатывает)
Но еще много работы, брекпоинты еще не реализованы....

Одно неприятно, ни в RDI ни в GDBServer не понятно как передавать системные регистры (которых нет в предыдущих версиях архитектур ARM)
alexsl
Добрый день. Ответьте пожалуйста, данный чип работает с Wigler'ом. Или нужен обязательно J-LINK?
KRS
Цитата(alexsl @ Apr 24 2008, 16:12) *
Добрый день. Ответьте пожалуйста, данный чип работает с Wigler'ом. Или нужен обязательно J-LINK?

у него есть JTAG порт, следовательно с Wiggler ом работает, тут главное поддержка софта. H-JTAG не умеет работать с Coretx-M3 sad.gif . Есть поддержка у OpenOcd ( он умеет работать и с Wiggler и с Cortex-M3) и его можно прикрутить к IAR 5.11 ( с некоторыми ньюансами в частности ( указатель стека R13 и LR не отображаются... но их можно смотреть через telnet).
Тут выше я описывал как подключить OpenOcd к IAR ( для FT2232 правда, но такой же путь и для Wiggler).
alexsl
Ага, понятно. Но ведь есть CrossWorks, который умеет работать с виглером. Или я не прав?
KRS
Цитата(alexsl @ Apr 24 2008, 17:55) *
Ага, понятно. Но ведь есть CrossWorks, который умеет работать с виглером. Или я не прав?

Да у кроссвокса свой драйвер виглера и он прекрасно и быстро работал ( я просто когда я его пробовал о кортексах никто и не слышал ничего), так что сейчас если кроссвокс умеет работать с кортексами это может быть хороший вариант!
gregory812
А есть ли возможность во время работы контроллера сохранять во флеш память без торможения основной программы (наподобие памяти EEPROM у AVR)?
KRS
Цитата(gregory812 @ Apr 24 2008, 23:52) *
А есть ли возможность во время работы контроллера сохранять во флеш память без торможения основной программы (наподобие памяти EEPROM у AVR)?

Можно, только гемора много... Надо все что может испольняться пока флеш пишется ( в частности перывания) располагать в ОЗУ. У STR два флеша и даже appnote есть как иммитировать eeprom, а вот у STM только один.
Andy Great
А подскажите, мэтры Кортекса, применимость его в таком случае: имею микросхему с параллельным 5В интерфейсом (уровень "1" 3.5В), 8бит адрес/данные, 3 адрес, ALE-RD-WR-INT. Крутил и так и этак (корпус 48), не получается красиво. На двух портах только старшие байты 5В-толерантные, дальше побитно дергать надо. Без софтовых обработок адреса не получится. А жаль: хотелось попробовать новую платформу, но некрасиво не хочется делать.

ЗЫ: И как у них с доступностью на Украине?
Krom
Добрый день! А работать с этими процами под Linux в Эклипс+OCD+GCC... кто-нибудь уже пробовал?
sensor_ua
На Techtrends 2008 анонсировали (пока неофициально - обещают официально выдать только в мае) расширение линейки STM32 как вверх - до 512 кБ FLASH и 64 кБ ОЗУ с кучей новых вкусностей, так и вниз до блох, сравнимых с ATmega88.
Предварительные доки выложил на ftp в /upload/DOCs/ARM/STM32/
и в пески
hччp://upload.caxapa.ru/STM32_ref_man.zip
hччp://upload.caxapa.ru/STM32F101xCDE.pdf
hччp://upload.caxapa.ru/STM32F103xCDE.pdf
Krom
Что-то у меня никак не получается связать Кейл и отладочную плату STM3210B-EVAL.
Имеется в наличии STM3210B-EVAL и USB J-Link иаровский.
Стоит RealView MDK-ARM v3.20, Segger J-Link ARM V3.80.
По отдельности все работает - кейл проект компиллирует, с помощью J-Flash hex-файл во флеш прошивается, программа работает (демо-пример).
А вот все вместе - никак.
В Кейле в Flash->Configure Flash Tools на вкладках Debug и Utilites установлено RDI Interface Driver, длл-ки указаны не кейловские, а сеггеровские ( в обоих случаях JLinkRDI.dll).
Если делаем Start/Stop Debug Session задумывается на пару минут, потом выбрасывает в окно Disassemly sad.gif
А грузить и стирать флеш из Кейла вообще не хочет. Что я забыл настроить?
Maximm
У меня проблема с компиляцией проектов для STM32F103 - использую Keil MDK v. 3.20 при компиляции примеров от Keil получаю ошибку:

STM32F10x.s: error: A3903U: Argument 'DARMSTM' not permitted for option 'device'.

Подскажите, пожалуйста, что не так сделал.....
Maximm
Цитата(Maximm @ May 1 2008, 02:43) *
У меня проблема с компиляцией проектов для STM32F103 - использую Keil MDK v. 3.20 при компиляции примеров от Keil получаю ошибку:

STM32F10x.s: error: A3903U: Argument 'DARMSTM' not permitted for option 'device'.

Подскажите, пожалуйста, что не так сделал.....


Может кому-нибудь пригодится: ошибка была в лиценции к Keil - стояла "RealView MDK Enterprise" - с ней проект не компилировался, сменил на "RealView MDK Professional" и всю заработало....
Даже не понятно почему такая разница в лицензиях...
gregory812
Запустил АЦП на отладочной плате STM3210B-EVAL. Показания плавают в пределах +-5LSB. Выходит, что по точности не больше 10-ти разрядов. Кто испытывал АЦП поделитесь впечателниями.
sonycman
Имеется STM32F103RBT6 (на плате от Olimex STM32 P103) и МТ-Линк (версия железа 5.0, серийник 11111117).
Почему-то дебаггер заливает прошивку в контроллер через раз.
То есть соединение всегда проходит на ОК, но вот дальше дебаггер обязательно споткнётся на стирании, или на записи страницы. Выдаётся сообщение о таймауте стирания или записи... 07.gif
Причём если сразу-же повторить попытку - то запись и проверка записи завершаются успешно.

Юзал заливку из под JFlashARM из пакета дров сеггера (версия 4.0), так и из под кейла MDK3.40.
Скорость соединения выставлял от 5 до 200 килогерц - без разницы.

В этом топике тоже пишут про "пляски с бубном" с дебаггером - это что, у всех так?

Причём вот что интересно - до этого юзал этот-же дебаггер с самопальной платой с LM3S601 - ни одной проблемы с дебаггером! Запись, стирание, проверка - быстро и чётко, без запинок.

Может, с железом на олимексовской плате что не так? В смысле, лишний пулл-ап/пулл-даун влепили на жи-таг?
Я просто теряюсь в догадках... wacko.gif
sonycman
А в STM32 разве нет возможности обращаться к периферийным регистрам через бит-бэнг области?
Что-то в мануале не нашёл упоминаний...
Почему-то показалось, что такая фича есть у всех кортексов, а не только у Stellaris... 05.gif

ЗЫ: А, сорри, нашёл! Уря, я просто перепутал, когда искал - правильно пишется "band", а не "bang"...
cebotor
Цитата(sonycman @ Jan 4 2009, 00:39) *
Почему-то дебаггер заливает прошивку в контроллер через раз.

Год почти полет нормальный. в том числе и на пятой версии j-линка и Мтлинка (дебаггер - ИАР)
а Вы что под дебаггером подразумеваете ?
Пляски были, не отрецаем,- но плясали вокруг GDB сервера и(или) SWD, кажется , а если работать напрямую и не по СВД ,то там все как часы.
sonycman
Цитата(cebotor @ Jan 6 2009, 03:25) *
Год почти полет нормальный. в том числе и на пятой версии j-линка и Мтлинка (дебаггер - ИАР)
а Вы что под дебаггером подразумеваете ?
Пляски были, не отрецаем,- но плясали вокруг GDB сервера и(или) SWD, кажется , а если работать напрямую и не по СВД ,то там все как часы.

Дебаггер - МТ-Линк smile.gif
Кейл с ним работает через RDI.
Хотя, если пробовать через родную JFlashARM.exe - то запись во флеш тоже через раз. Не знаю, JFlash работает через RDI или напрямую?

Посмотрел по логам - сложилось впечатление, что дело такое:
1. Сначала в оперативу контроллера заливается код "прошивальщика".
2. Потом с ним ведётся многократный обмен данными путём перезаписи регистров и рестарта кода.
Вероятно, здесь идёт стирание нужных страниц флеш.
После окончания обработки данных код стопорит ядро и таким образом даёт знать ожидающему дебаггеру о возможности продолжения "диалога" smile.gif
3. Только теперь ему начинает передаваться код программы для флеш в виде кусков определённой длинны.
4. Считывание флеш и верификация записи.

Зависание происходит на втором этапе. То есть до передачи данных для записи дело не доходит.
Перестаёт отвечать "прошивальщик". Спрашивается - какого хрена?

Было-бы интересно посмотреть, что происходит "внутри" кода загрузчика? На чём он стопорится?
Но как это сделать? Есть где-нибудь его исходники?

По схемотехнике JTAG вроде у Олимекс STM32-P103 всё в порядке - все подтягивающие резисторы на месте.
sad.gif

Думаю, проблема не в МТ-Линк, так как со Stellaris всё работает "как часы" smile.gif
Проблема может быть или в плате Олимекса (что маловероятно, но допустимо), или в коде прошивальщика - неправильная инициализация камня или что-то в этом духе.
Или, что совсем маловероятно - глючный микроконтроллер.
05.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.