Vitaliy_ARM 0 21 марта, 2008 Опубликовано 21 марта, 2008 · Жалоба Получил на днях плату PREMIER. Кто-нибудь ее к IAR подключал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 2 апреля, 2008 Опубликовано 2 апреля, 2008 · Жалоба По поводу 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 0 3 апреля, 2008 Опубликовано 3 апреля, 2008 · Жалоба По поводу отладки Отладка через 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 1 3 апреля, 2008 Опубликовано 3 апреля, 2008 · Жалоба а почему вы взяли делать отладчик свд из 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 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба Попробовал в своей программе переводить 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 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба Попробовал в своей программе переводить stm32 в режим сна командами WFI и WFE. Работает вроде как ожидалось, но есть неприятный сюрприз: перестает работать jtag. Использую J-Link вместе с IAR. да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип :) и теперь jtag-ом до них не дотянуться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mai 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба cebotor [q]да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип и теперь jtag-ом до них не дотянуться.[/q] Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса? cebotor да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип и теперь jtag-ом до них не дотянуться. Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса? cebotor Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса? Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса? Нет макета под руками, проверить не могу. Сейчас ведь, что у меня получается: сразу после сброса опция, разрешающая засыпание, разрешена и jtag не работает. Устанавливаю в программе запрет засыпания и jtag начинает работать. Получается jtag не сбрасывает контроллер? Иначе после сброса опция, разрешающая засыпание, включилась бы и не дала работать jtag. А jtag все же работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cebotor 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба Сейчас ведь, что у меня получается: сразу после сброса опция, разрешающая засыпание, разрешена и jtag не работает. Устанавливаю в программе запрет засыпания и jtag начинает работать. Получается jtag не сбрасывает контроллер? Иначе после сброса опция, разрешающая засыпание, включилась бы и не дала работать jtag. А jtag все же работает. Логика крайне проста - жтаг не может дотянуться до контроллера пока тот спит(вообще), если у вас в проекте пауза между периодами сна больше времени требующегося жтагу чтобы остановить процессор, то проблем быть не должно (теоретически).. На практике же, например lpc очень медленно останавливается по жтагу - сначала стопается ядро , а потом вся переферия - так что глобально программа может таки встать раком. Да и еще если пауза достаточна , но периоды сна слишком велики - то у жтага будет выходить таймаут и у вас процессор будет подчиняться ему (жтагу) через раз :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pan_oleg 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба День добрый., У меня проблема с модулем 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), не помогает Посоветуйте, куда копать Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mai 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба [q]cebotor[/q] Спасибо за разъяснения. Картинка получается не совсем приятная, пытаться искусственно управлять периодами сна и бодрствования как-то уж совсем печально, на мой взгляд. Придется все же делать возможность выключить засыпание в работающей программе, чтобы иметь возможность дать работать jtag. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 4 апреля, 2008 Опубликовано 4 апреля, 2008 (изменено) · Жалоба Спасибо за разъяснения. Картинка получается не совсем приятная, пытаться искусственно управлять периодами сна и бодрствования как-то уж совсем печально, на мой взгляд. Придется все же делать возможность выключить засыпание в работающей программе, чтобы иметь возможность дать работать jtag. С stm32 по поводу этого можно не беспокоится! Потому что законектится к процу через SWD можно пока он в ресете ( сам лично пробовал ). И можно легко не дать процу выполнить не одной команды ( достаточно поставить остновку на ресет и потом только отпустить ногу ресет) как все это делается описано в соотв. даташитах! Изменено 4 апреля, 2008 пользователем KRS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pan_oleg 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба проверил процедуру записи байта в еепромку - работает нормально, похоже имено в чтении . Привожу исходник /******************************************************************************* * 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 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба KRS С stm32 по поводу этого можно не беспокоится! Потому что законектится к процу через SWD можно пока он в ресете ( сам лично пробовал ). И можно легко не дать процу выполнить не одной команды ( достаточно поставить остновку на ресет и потом только отпустить ногу ресет) как все это делается описано в соотв. даташитах! Спасибо, буду знать. Только у меня сейчас старенький J-Link, а он, насколько я знаю, SWD не поддерживает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cebotor 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба проверил процедуру записи байта в еепромку - работает нормально, похоже имено в чтении . Кривость реализации 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 0 4 апреля, 2008 Опубликовано 4 апреля, 2008 · Жалоба Спасибо что откликнулись. Пошаговая отладка показала что переменая (см. ниже) LastEvent получает значение 0х00030041, вместо 0х00030001. похоже гдето ещо появляется событие RxNE: Data Register not Empty (receivers). но откуда, и почему при шаговом выполнении все работает? не пойму. Переделал подтяжку согласно доки (добавил по резистору между шиной и контроллером), ничего не поменялось. подскажите, как побороть эту беду :crying: /******************************************************************************* * 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться