07.01.2015, 01:06
|
|
Частый гость
Регистрация: 08.05.2011
Сообщений: 25
Сказал спасибо: 12
Сказали Спасибо 7 раз(а) в 4 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Можно повторить вопрос?
Посоветуйте какой JTAG на данный момент лучший.
Хочется что бы не только SWD был.
В первую очередь буду использовать для STM32F......
Необходима стыковка с IAR.
Цена тоже важна. Но вторична.
Ну и где можно купить в Москве.
|
|
|
|
07.01.2015, 07:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Лучший - это в позолоченном корпусе что ли? Или которым больше хомячков пользуется
Жытаг или работает как все, или не работает, потому что не поддерживается
Посмотри на сайте ИАР какие он поддерживает
|
|
|
|
16.01.2015, 22:44
|
|
Гражданин KAZUS.RU
Регистрация: 03.07.2010
Сообщений: 843
Сказал спасибо: 156
Сказали Спасибо 378 раз(а) в 190 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Доброго времени! Есть процедура обмена данными МК с датчиком температуры LM75A, которая бывает зависает, скорее всего из-за длины кабеля.
Код:
|
// Read 16-bit LM75 register
uint16_t LM75_ReadReg(uint8_t reg)
{
uint16_t value;
I2C_AcknowledgeConfig(I2C_PORT,ENABLE); // Enable I2C acknowledgment
I2C_GenerateSTART(I2C_PORT,ENABLE);
while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_MODE_SE LECT)); // Wait for EV5
I2C_Send7bitAddress(I2C_PORT,LM75_ADDR,I2C_Directi on_Transmitter); // Send slave address
while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_TRANSMI TTER_MODE_SELECTED)); // Wait for EV6
I2C_SendData(I2C_PORT,reg); // Send register address
while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_TR ANSMITTED)); // Wait for EV8
I2C_GenerateSTART(I2C_PORT,ENABLE); // Send repeated START condition (aka Re-START)
while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_MODE_SE LECT)); // Wait for EV5
I2C_Send7bitAddress(I2C_PORT,LM75_ADDR,I2C_Directi on_Receiver); // Send slave address for READ
while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_RECEIVE R_MODE_SELECTED)); // Wait for EV6
while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_RE CEIVED)); // Wait for EV7 (Byte received from slave)
value = (I2C_ReceiveData(I2C_PORT) ‹‹ 8); // Receive high byte
I2C_AcknowledgeConfig(I2C_PORT,DISABLE); // Disable I2C acknowledgment
I2C_GenerateSTOP(I2C_PORT,ENABLE); // Send STOP condition
while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_RE CEIVED)); // Wait for EV7 (Byte received from slave)
value |= I2C_ReceiveData(I2C_PORT); // Receive low byte
return value;
} |
Но суть вопроса не в этом. watchdog использовать не хочу, так как процедуры длинные а везде тыкать обновление счётчика не хочется, поэтому планирую перед вызовом процедуры обмена с термометром, запустить таймер, если МК зависнет в процедуре и на выходе не остановит таймер, произойдёт прерывание в котором планирую либо сделать reset, либо передать управление в главную процедуру. Собственно вопрос в том, как программно сделать reset для stm32f10... или принудительно завершить процедуру в которой произошло прерывание?
ресет вроде нашёл, можно сделать NVIC_SystemReset(); а вот с принудительным завершением какой-либо процедуры, чтобы обойтись без сброса?
Последний раз редактировалось С.М.С; 16.01.2015 в 23:45.
|
|
|
|
17.01.2015, 00:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Ну так напишите функцию ожидания с таймаутом - замените ею Ваши while ы, на которых все зависает.
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
17.01.2015, 00:39
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
С.М.С, ловите
Код:
|
unsigned char I2c_Read_Page (I2C_TypeDef* I2Cx, unsigned char I2c_Address, unsigned char Reg,
unsigned char * buffer, unsigned char Len)
{
I2c_ACK(I2Cx);
if (I2c_Start(I2Cx)) return I2C_BUS_BUSY;
if (I2c_WriteAddress(I2Cx, I2c_Address)) return I2C_NOACK;
I2c_WriteByte(I2Cx, Reg);
I2c_ReStart(I2Cx);
I2c_WriteAddress(I2Cx, I2c_Address|1);
while (Len›1)
{
I2c_ACK(I2Cx);
* buffer++ = I2c_ReadByte(I2Cx);
Len--;
}
I2c_NACK(I2Cx);
I2c_Stop(I2Cx);
* buffer++ = I2c_ReadByte(I2Cx);
return I2C_OK;
} |
Код:
|
unsigned char I2c_Start (I2C_TypeDef* I2Cx)
{
u16 cnt = maxcnt;
if (I2Cx-›SR2&I2C_SR2_BUSY) return I2C_BUS_BUSY;
I2Cx-›CR1 |= I2C_CR1_START;
while ((I2Cx-›SR1 & I2C_SR1_SB) == 0)
{
cnt--;
if (cnt == 0) return I2C_BUS_BUSY;
}
return 0;
}
void I2c_ReStart (I2C_TypeDef* I2Cx)
{
I2Cx-›CR1 |= I2C_CR1_START;
while (!(I2Cx-›SR1 & I2C_SR1_SB));
}
unsigned char I2c_WriteAddress (I2C_TypeDef* I2Cx, unsigned char i2c_address)
{
u16 cnt = maxcnt;
I2Cx-›DR = i2c_address;
while (!(I2Cx-›SR1 & (I2C_SR1_ADDR|I2C_SR1_ARLO|I2C_SR1_AF)))//stuck here sometimes
{
cnt--;
if (cnt == 0) return I2C_NOACK;
}
if (I2Cx-›SR1&(I2C_SR1_ARLO|I2C_SR1_AF)) return I2C_NOACK;
(void) I2Cx-›SR1;
(void) I2Cx-›SR2;
if (i2c_address&1) while (!(I2Cx-›SR1 & I2C_SR1_RXNE));
return 0;
}
void I2c_WriteByte (I2C_TypeDef* I2Cx, unsigned char data)
{
I2Cx-›DR = data;
while (!(I2Cx-›SR1 & I2C_SR1_BTF));
}
unsigned char I2c_ReadByte (I2C_TypeDef* I2Cx)
{
while((I2Cx-›SR1 & I2C_SR1_RXNE)==0); // wait data
I2Cx-›SR1;
I2Cx-›SR2;
return I2Cx-›DR;
}
unsigned char I2c_Stop (I2C_TypeDef* I2Cx)
{
I2Cx-›CR1 |= I2C_CR1_STOP;
while (I2Cx-›SR2&I2C_SR2_BUSY);
return I2C_OK;
}
void I2c_ACK (I2C_TypeDef* I2Cx)
{
I2Cx-›CR1 |= I2C_CR1_ACK;
}
void I2c_NACK (I2C_TypeDef* I2Cx)
{
I2Cx-›CR1 &= ~I2C_CR1_ACK;
} |
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
17.01.2015, 11:59
|
|
Гражданин KAZUS.RU
Регистрация: 03.07.2010
Сообщений: 843
Сказал спасибо: 156
Сказали Спасибо 378 раз(а) в 190 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Благодарю, но вопрос не в самой процедуре. На столе всё прекрасно работает, ставя в моторный отсек, где куча помех, бывает, зависает в одном из циклов. timeout_ы тоже не помогут, потому, как смысл проходить все операторы если уже есть потеря данных. Кабель, взял старый USB, длина метра полтора, на обычном практически не хотело работать. Можно конечно прикрутить преобразователь уровней, но пока пробую обойтись программно.
Последний раз редактировалось С.М.С; 17.01.2015 в 12:16.
|
|
|
|
17.01.2015, 12:40
|
|
Прописка
Регистрация: 21.12.2007
Адрес: Киев
Сообщений: 123
Сказал спасибо: 10
Сказали Спасибо 62 раз(а) в 41 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
В случае успеха отошлите заявку на премию от филипса,за то что смогли сделать и2с больше 40см в условиях помех от мотора
|
|
|
|
17.01.2015, 13:12
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Цитата:
|
пока пробую обойтись программно
|
Программно? Ну-ну! 95-98% безотказности обеспечивает железо!
Цитата:
|
ставя в моторный отсек, где куча помех, бывает, зависает в одном из циклов. timeout_ы тоже не помогут
|
Без железной защиты не помогут. А вообще, это нормальная практика. Все циклы проверки должны иметь таймаут, потому что они имеет потенциальную возможность в любой момент времени стать вечными. Для настольных свестелок-перделок кружка пионеров можно и без таймаута, для остальных девайсов это неприемлемо. Кому понравится вечно зависающий или постоянно пересбрасываемый девайс?
|
|
|
Сказали "Спасибо" STM32F0
|
|
|
17.01.2015, 14:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от С.М.С
|
timeout_ы тоже не помогут, потому, как смысл проходить все операторы если уже есть потеря данных.
|
А кто Вас заставляет проходит все операторы.
Поймали тайматут - установили СТОП и возвращаете ошибку. Ну а далее то уж вам решать что по ошибке делать. Вы не обращали внимания, что все функции возвращают ошибку или генерят исключения
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
23.01.2015, 17:08
|
|
Гражданин KAZUS.RU
Регистрация: 03.07.2010
Сообщений: 843
Сказал спасибо: 156
Сказали Спасибо 378 раз(а) в 190 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Вопрос вроде разрешился, надо погонять дольше.
Код:
|
if (i ›= 1000) goto LM75_ReadReg_Start; else i++; |
Благодарю за пинки в нужном направлении.
Кстати просматривал библиотеку для RTC и там в примерах
Код:
|
/**
* @brief Displays the current time.
* @param TimeVar: RTC counter value.
* @retval None
*/
void Time_Display(uint32_t TimeVar)
{
uint32_t THH = 0, TMM = 0, TSS = 0;
/* Reset RTC Counter when Time is 23:59:59 */
if (RTC_GetCounter() == 0x0001517F)
{
RTC_SetCounter(0x0);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
/* Compute hours */
THH = TimeVar / 3600;
/* Compute minutes */
TMM = (TimeVar % 3600) / 60;
/* Compute seconds */
TSS = (TimeVar % 3600) % 60;
printf("Time: %0.2d:%0.2d:%0.2d\r", THH, TMM, TSS);
} |
Сброс счётчика происходит раз в сутки, т.е через 86400 секунд, но это когда запитан основной домен питания. В случая же если МК отключен, запитывается только Vbat для резервного домена, счётчик протикает 86400 импульсов и при следующем запуске не попадёт под условие сброса. if (RTC_GetCounter() == 0x0001517F) В результате на табло появятся значения за 24 часа либо если есть условия корректности вылетит в обработчик ошибки.
Последний раз редактировалось С.М.С; 23.01.2015 в 17:11.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:19.
|
|