реклама на сайте
подробности

 
 
20 страниц V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> STM32F103x, делимся впечатлениями
Vitaliy_ARM
сообщение Mar 21 2008, 13:39
Сообщение #61


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Получил на днях плату PREMIER.

Кто-нибудь ее к IAR подключал?


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 2 2008, 19:35
Сообщение #62


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



По поводу 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).
Go to the top of the page
 
+Quote Post
cebotor
сообщение Apr 3 2008, 10:32
Сообщение #63


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(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 ?


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 3 2008, 12:18
Сообщение #64


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(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);
Go to the top of the page
 
+Quote Post
mai
сообщение Apr 4 2008, 06:21
Сообщение #65


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 27-02-05
Пользователь №: 2 915



Попробовал в своей программе переводить 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
Go to the top of the page
 
+Quote Post
cebotor
сообщение Apr 4 2008, 08:31
Сообщение #66


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(mai @ Apr 4 2008, 10:21) *
Попробовал в своей программе переводить stm32 в режим сна командами WFI и WFE. Работает вроде как ожидалось, но есть неприятный сюрприз: перестает работать jtag. Использую J-Link вместе с IAR.


да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип smile.gif и теперь jtag-ом до них не дотянуться.


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
mai
сообщение Apr 4 2008, 09:27
Сообщение #67


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 27-02-05
Пользователь №: 2 915



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 все же работает.
Go to the top of the page
 
+Quote Post
cebotor
сообщение Apr 4 2008, 09:46
Сообщение #68


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



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

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

Да и еще если пауза достаточна , но периоды сна слишком велики - то у жтага будет выходить таймаут и у вас процессор будет подчиняться ему (жтагу) через раз smile.gif


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
pan_oleg
сообщение Apr 4 2008, 10:18
Сообщение #69


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 16-11-07
Пользователь №: 32 387



День добрый.,
У меня проблема с модулем 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
Заранее благодарен.
Go to the top of the page
 
+Quote Post
mai
сообщение Apr 4 2008, 10:26
Сообщение #70


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 27-02-05
Пользователь №: 2 915



[q]cebotor[/q]
Спасибо за разъяснения. Картинка получается не совсем приятная, пытаться искусственно управлять периодами сна и бодрствования как-то уж совсем печально, на мой взгляд.
Придется все же делать возможность выключить засыпание в работающей программе, чтобы иметь возможность дать работать jtag.
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 4 2008, 10:52
Сообщение #71


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(mai @ Apr 4 2008, 14:26) *
Спасибо за разъяснения. Картинка получается не совсем приятная, пытаться искусственно управлять периодами сна и бодрствования как-то уж совсем печально, на мой взгляд.
Придется все же делать возможность выключить засыпание в работающей программе, чтобы иметь возможность дать работать jtag.

С stm32 по поводу этого можно не беспокоится! Потому что законектится к процу через SWD можно пока он в ресете ( сам лично пробовал ). И можно легко не дать процу выполнить не одной команды ( достаточно поставить остновку на ресет и потом только отпустить ногу ресет) как все это делается описано в соотв. даташитах!

Сообщение отредактировал KRS - Apr 4 2008, 10:54
Go to the top of the page
 
+Quote Post
pan_oleg
сообщение Apr 4 2008, 11:30
Сообщение #72


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 16-11-07
Пользователь №: 32 387



проверил процедуру записи байта в еепромку - работает нормально, похоже имено в чтении .
Привожу исходник
/*******************************************************************************
* 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);
}
Go to the top of the page
 
+Quote Post
mai
сообщение Apr 4 2008, 12:16
Сообщение #73


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 27-02-05
Пользователь №: 2 915



KRS
Цитата
С stm32 по поводу этого можно не беспокоится! Потому что законектится к процу через SWD можно пока он в ресете ( сам лично пробовал ). И можно легко не дать процу выполнить не одной команды ( достаточно поставить остновку на ресет и потом только отпустить ногу ресет) как все это делается описано в соотв. даташитах!

Спасибо, буду знать. Только у меня сейчас старенький J-Link, а он, насколько я знаю, SWD не поддерживает.
Go to the top of the page
 
+Quote Post
cebotor
сообщение Apr 4 2008, 13:53
Сообщение #74


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(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 .


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
pan_oleg
сообщение Apr 4 2008, 14:11
Сообщение #75


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 16-11-07
Пользователь №: 32 387



Спасибо что откликнулись.
Пошаговая отладка показала что переменая (см. ниже) 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;
}
Go to the top of the page
 
+Quote Post

20 страниц V  « < 3 4 5 6 7 > » 
Reply to this topicStart new topic
6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016