Приехал китайский программатор. Программачит хорошо. Версия у него 2, т.е. без доп фич которые на нуклео и дисковерях. снизу написано А2019 03
Как разобрать без поломок не понимаю, сломать страшно.
Приехал китайский программатор. Программачит хорошо. Версия у него 2, т.е. без доп фич которые на нуклео и дисковерях. снизу написано А2019 03
Как разобрать без поломок не понимаю, сломать страшно.
Даже и незнаю, такое себе впечатление.
Connect under reset не работает на этом программаторе вообще, он ресет просто не отпускает. Если выдергивать проводок руками - то работает.
Если обновить программатор до версии V2.J33.S7 то перестает работать вообще - и не прошивает и не отлаживает и не видит прицепленные таргеты вообще никак. Хорошо что откатился до V2.J31.S7 без проблем. Тут только Connect under reset не работает.
Странно что вчера TrueStudio нормально работала и на старой версии(ещё старее V2.J31.S7 было), а сегодня вдруг ей понадобилось его обновить и понеслось...
Он держит этот NRST сигнал прижатым к земле всё время, не отпуская. В то время как на нуклео там 3.3В, и видно что он сначала прижимается вниз а потом отпускается во время присоединения.
---------- Сообщение добавлено 19:36 ---------- Предыдущее сообщение было 18:52 ----------
Чип f103c8. Полный левак похоже. Только в коробочке.
**
Прошил в стлинк отладочную плату, смотрю на тотже пин где NRST выходит, поведение тоже - прижат к земле и не отпускается вообще. Заинтригован.
Последний раз редактировалось l3VGV; 12.04.2019 в 20:00.
Левак конкретный. Дома сфоткаю оригинал.
По АЦП шумам просто жесть, у меня 4-5 усреднений на F0, 200 раз это за границей разума.
Простейший (без калибраторов) тестовый стенд - переменный резистор 5к на питание проца, с выхода резистора керамика 0.1 на землю. Дальше резистор 10-50к с джампером(замыкать резистор) и перемычка-веревка на вход целевой платы. Также прямо на входе целевой платы керамика 0.1 на землю. Снимаем показания ацп при разных положениях подстроечника и разных положениях резисторного джампера. Так наглядно видно входное сопротивление и его линейность. Мне было актуально большое сопротивление - иногда плата работает с бусинковыми термисторами 100к. Хорошо работает, без буферов. Более сложная калибровка шла уже с внешним токовым калибратором, основная погрешность была от дешманского измерительного резистора. Но даже с дешманским резистором на практике хорошо заметно ~ +2 от ацп. В коде ацп у меня не осталось записей, фактический сразу выдавал нормализованное с шагом 10мкА, каждый канал на плате калиброван индивидуально. В реальном применении во внешний мир идет в физических единицах, в моем случае в миллибарах и иногда в десятых градуса и десятых влажности. Внутри вся математика уже на физических единицах.
WBR, Michael.
Цель расчетов - понимание, а не числа (с) Хемминг.
Вот что неясно. Они сделали корпус, коробочку, а немножко рассыпухи зажмотили. Ну как так... Саботаж какойто.
---------- Сообщение добавлено 20:52 ---------- Предыдущее сообщение было 20:46 ----------
Эксперименты продолжаются, на нуклео с WFI и торможением делителями частоты АЦП до 500кГц удалось добиться шумов примерно в 12ед пик-пик. Что далеко до того что хотелосьбы, но гораздо лучше чем на блу пилах. Но настолько хуже того что хочется, что прямо ой. Собственную Температуру и Vref он цифрует с шумом в 1-2ед.
Думаю в порядке эксперимента оторвать ноги от платы (питания и земли ацп и входы), кинуть соплями и посмотреть как повлияет. Практического смысла в этом уже 0, то что я хотел придётся делать на внешних ацп, но хоть разобраться.
А тем временем STM вывалило видосы по USB.
https://www.youtube.com/playlist?lis...6EfnnHhQZI4Hxa вроде и по делу, но во первых ужасный французкий акцент, во вторых мелко и обзорно. Куда тыкать в кубе. Но новичкам будет полезно.
Последний раз редактировалось l3VGV; 27.07.2019 в 01:00.
Похоже радость с блу пил платами подошла к своему логическому завершению. Китайцы стали массово туда лепить перемарикровки собственных клонов(клон называется CS32F103C8T6, эту маркировку сдирают и рисуют STM, прямо видно как корпус зацарапан). И ладно бы эти клоны работали как родные. Нет. USB не запускается никак(паяй резистор или нет). Отладка тоже не работает. Жаль, крайне жаль, удобно было.
Купил недавно 5 плат. К счастью 1 оказалась с оригинальным чипом.
С удивлением обнаружил что плата stm32f103 nucleo-64 нормально работает с USB без кварца.
Это повезло или такое часто бывает? Ведь по идее точности* встроенного клока не должно хватать для уверенной работы, а тем не менее, HID без проблем.
Точности и самое главное - стабильности.
Последний раз редактировалось l3VGV; 07.08.2019 в 15:56.
"Замполит, чайку?"(с)"Охота за Красным Октябрем".
"Да мне-то что, меняйтесь!"(с)анек.
<-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.
I2C на f103 чипах - кривой. Иногда он включается и работает нормально, а иногда сразу выпадает в busy. И это описано в errata. Чтобы это сбросить нужно хитрым образом его перевключать. Причем просто разок перевключить может и не сработать, в результате повесил пересброс в цикл пока он не начнет нормалбно читать данные.
В код инициализации I2C добавил такое
Скрытый текст
Код:/* USER CODE BEGIN I2C1_Init 2 */ struct I2C_Module i2cm1; i2cm1.instance = hi2c1; i2cm1.sclPin =GPIO_PIN_8; i2cm1.sclPort =GPIOB; i2cm1.sdaPin = GPIO_PIN_9; i2cm1.sdaPort =GPIOB; HAL_Delay(100); while(HAL_I2C_Master_Transmit(&hi2c1, ADS1115_ADDRESS, ADSwrite, 3, 100) != HAL_OK) { HAL_Delay(10); I2C_ClearBusyFlagErratum(&i2cm1); HAL_Delay(5); } /* USER CODE END I2C1_Init 2 */[свернуть]
Ну и сам код хитрого перевключения, уперто с https://electronics.stackexchange.co...ange-behaviour
Скрытый текст
Код:void I2C_ClearBusyFlagErratum(struct I2C_Module* i2c) { GPIO_InitTypeDef GPIO_InitStructure; // 1. Clear PE bit. i2c->instance.Instance->CR1 &= ~(0x0001); // 2. Configure the SCL and SDA I/Os as General Purpose Output Open-Drain, High level (Write 1 to GPIOx_ODR). GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD; //GPIO_InitStructure.Alternate = I2C_PIN_MAP; GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStructure.Pin = i2c->sclPin; HAL_GPIO_Init(i2c->sclPort, &GPIO_InitStructure); HAL_GPIO_WritePin(i2c->sclPort, i2c->sclPin, GPIO_PIN_SET); HAL_Delay(1); GPIO_InitStructure.Pin = i2c->sdaPin; HAL_GPIO_Init(i2c->sdaPort, &GPIO_InitStructure); HAL_GPIO_WritePin(i2c->sdaPort, i2c->sdaPin, GPIO_PIN_SET); HAL_Delay(1); // 3. Check SCL and SDA High level in GPIOx_IDR. while (GPIO_PIN_SET != HAL_GPIO_ReadPin(i2c->sclPort, i2c->sclPin)) { asm("nop"); } while (GPIO_PIN_SET != HAL_GPIO_ReadPin(i2c->sdaPort, i2c->sdaPin)) { asm("nop"); } // 4. Configure the SDA I/O as General Purpose Output Open-Drain, Low level (Write 0 to GPIOx_ODR). HAL_GPIO_WritePin(i2c->sdaPort, i2c->sdaPin, GPIO_PIN_RESET); HAL_Delay(1); // 5. Check SDA Low level in GPIOx_IDR. while (GPIO_PIN_RESET != HAL_GPIO_ReadPin(i2c->sdaPort, i2c->sdaPin)) { asm("nop"); } // 6. Configure the SCL I/O as General Purpose Output Open-Drain, Low level (Write 0 to GPIOx_ODR). HAL_GPIO_WritePin(i2c->sclPort, i2c->sclPin, GPIO_PIN_RESET); HAL_Delay(1); // 7. Check SCL Low level in GPIOx_IDR. while (GPIO_PIN_RESET != HAL_GPIO_ReadPin(i2c->sclPort, i2c->sclPin)) { asm("nop"); } // 8. Configure the SCL I/O as General Purpose Output Open-Drain, High level (Write 1 to GPIOx_ODR). HAL_GPIO_WritePin(i2c->sclPort, i2c->sclPin, GPIO_PIN_SET); HAL_Delay(1); // 9. Check SCL High level in GPIOx_IDR. while (GPIO_PIN_SET != HAL_GPIO_ReadPin(i2c->sclPort, i2c->sclPin)) { asm("nop"); } // 10. Configure the SDA I/O as General Purpose Output Open-Drain , High level (Write 1 to GPIOx_ODR). HAL_GPIO_WritePin(i2c->sdaPort, i2c->sdaPin, GPIO_PIN_SET); HAL_Delay(1); // 11. Check SDA High level in GPIOx_IDR. while (GPIO_PIN_SET != HAL_GPIO_ReadPin(i2c->sdaPort, i2c->sdaPin)) { asm("nop"); } // 12. Configure the SCL and SDA I/Os as Alternate function Open-Drain. GPIO_InitStructure.Mode = GPIO_MODE_AF_OD; //GPIO_InitStructure.Alternate = I2C_PIN_MAP; GPIO_InitStructure.Pin = i2c->sclPin; HAL_GPIO_Init(i2c->sclPort, &GPIO_InitStructure); HAL_Delay(1); GPIO_InitStructure.Pin = i2c->sdaPin; HAL_GPIO_Init(i2c->sdaPort, &GPIO_InitStructure); HAL_Delay(1); // 13. Set SWRST bit in I2Cx_CR1 register. i2c->instance.Instance->CR1 |= 0x8000; asm("nop"); HAL_Delay(1); // 14. Clear SWRST bit in I2Cx_CR1 register. i2c->instance.Instance->CR1 &= ~0x8000; asm("nop"); HAL_Delay(1); // 15. Enable the I2C peripheral by setting the PE bit in I2Cx_CR1 register i2c->instance.Instance->CR1 |= 0x0001; HAL_Delay(1); // Call initialization function. HAL_I2C_Init(&(i2c->instance)); HAL_Delay(1); }[свернуть]
Каждый раз натыкаясь на такое думаю - а почему в новых ревизиях силикона это не исправлено? А почему если не исправлено то в кубе эта ситуация не обрабатывается его силами.
2019й год, победило право быть кривым.
В длительной работе пока не проверял. Волнуюсь а вдруг и во время работы его заклинит. В моем случае это будет катастрофа. Виртуальная
Я во всех проектах с 103-м, ипользую программный I2C, ногодрыгом.
Тем более, что для I2C-master, в среде с одним мастером, аппаратный имет смысл только при блочных пересылках большого размера.
А, к примеру, чтобы записать несколько регистров ЦАПа или какой другой микросхемы, или прочитать раз при старте из епрома блок параметров, или инода записывать в него изменяемый параметр (например последнюю регулировку громкости) - аппаратный совершенно не имеет никаких преимуществ перед ногодрыгом.
"Замполит, чайку?"(с)"Охота за Красным Октябрем".
"Да мне-то что, меняйтесь!"(с)анек.
<-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.
Смотрю errata на f103RC, ну всё что можно хоть както но забаговано. Это один такой кристал проклятый или старшие тоже в основном кривые?
Eclipse продолжает доставлять.
После некоторого перерыва решил продолжить освоение stm32. Запускаю проект который 2 недели назад отлично работал. Запускаю отладку, а оно мне говорит что "Temporary breakpoint warning: Source file is more recent than executable."
Оказалось. Build configuration была выбрана Release. А на отладку запускалась всёравно debug. Атас. Т.е. оно сначала как нужно собирало релиз, но прошивало и запускало в отладчик всёравно дебуг и потом удивлялось а чо такое. Мощён опенсорс, много полезных возможностей и продуманых фичей.
Для совсем новичков обнаружился внятный курс, http://themagicsmoke.ru/courses/stm32/ описано кратно и понятно.
https://microtechnics.ru/category/mi...ery/stm32cube/
Здесь есть кое что интересное
_________________
Евгений
Так а чо, SPI в этой поделке тоже кривое?
Казалось бы что может быть сложнее, 2х байтов переслать. В часности - получить.
По скопу видно, что оно отключает слейва(подымает CS) до того как закончило принимать, т.е. такты ещё генерирует, но из функции уже вывлилось и код побежал дальше.Код:errorcode = HAL_SPI_Receive(&hspi1, data, 2, TIMEOUT_VALUE); sl_Disable();
https://i.imgur.com/JHtG5Rs.png
***
Дальше ещё смешнее. Если принимать 4 байта, то всё нормально. Оно принимает. А потом меняет им порядок. Сколько не смотрел в халовский код который принимает, так и не смог понять как оно этот фокус проворачивает, ведь там всё просто и линейно.
Код:while(hspi->RxXferCount > 0U) { /* Check the RXNE flag */ if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) { /* read the received data */ (* (uint8_t *)pData)= *(__IO uint8_t *)&hspi->Instance->DR; pData += sizeof(uint8_t); hspi->RxXferCount--; }
А тем не менее
https://i.imgur.com/3rsLKaN.png
***
Если поставить отладчик на фунцию приема, и поыткать на старте, то видно что сначала он при приеме может посылать не кратное запрошенному количество клоков. Т.е. принимаем 2 байта а оно выдает наружу 17, или 41 при 5. Слейву всёравно, тот выдает правильно, а вот контролер сам свои подвиги интерпретирует в совершенно левые данные.
Отличная вещь одним словом, библиотеки хорошие, переферия интересна. Ну и ногодрыг конечно, всех спасёт.
/0\
Последний раз редактировалось l3VGV; 17.08.2019 в 10:17.
"Замполит, чайку?"(с)"Охота за Красным Октябрем".
"Да мне-то что, меняйтесь!"(с)анек.
<-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.
Помню что русский не родной. Оно это обращение к неодушевленному предмету. В часности к чипу. Или в данном случае уместнее к софту?
Функция, которая якобы блокирующая, возвращает управление до того как закончила дела. Такой смысл. Такто я всё и делаю, после получения данных отключаю слейва. А он получается отключается ещё до того как данные получены.
Никаких преобразований нет вообще, простой приём в буфер.
Социальные закладки