Jump to content

    

VAI

Модераторы
  • Content Count

    1120
  • Joined

  • Last visited

Everything posted by VAI


  1. Когда-то я выкладывал сюда код, работающий на STM32 и на MSP430. Вот, смотрите, может подойдёт для Вас. http://electronix.ru/forum/index.php?showt...p;#entry1089884
  2. Здесь Миландровский форум по МК 1986. Здесь 1986x-std-per-lib Здесь 1986x-std-per-lib-doc Здесь unofficial Milandr MCU 1986x CMSIS Pack for GNU MCU Eclipse and Keil MDK 5. Ну и очень правильный для Вас совет:
  3. STM32 Процедура вычисления CRC32

    Вот проверено http://electronix.ru/forum/index.php?showt...p;#entry1318905
  4. Цитата(DASM @ Sep 8 2016, 20:34) Какие вы видели отечественные рад.стойкие АРМы? На вскидку, у Миландра есть Cortex M4 http://milandr.ru/index.php?mact=Products,...nt01returnid=68
  5. Sinus 2kHz на К1986ВЕ92QI

    Ещё на хабре был цикл статей с общим названием "Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI". Вот статья по Вашей теме. Остальные можно найти самому. https://habrahabr.ru/post/255513/
  6. Столько лет прошло... Мы всегда использовали питание самого прошиваемого устройства. 1. Подключаете BSL к устройству. 2. Запускаете bsldemo2.exe с командной строкой, там должен быть ключ -d . У вас есть 10 секунд, пока держится сигнал RST на MSP430 на то, чтобы включить питание устройства. 3. По истечении 10-ти секунд начнётся процесс программирования. Кажется так.
  7. Проверьте мыло. Кстати, по Вашей теме http://electronix.ru/forum/index.php?showt...=129230&hl= Имею некоторый опыт работы с весоизмерительными устройствами и 24-х битными АЦП, несколько изделий в серии.
  8. Хотя проще бригадой. Схемотехника и ПО - 1 человек, трассировка плат - другой, дизайн и корпус - третий, написание ПО для мобильных устройств - четвёртый. Могу бригаду подобрать.
  9. STM32F4Discovery + UART .. нужна помощь

    Есть древние приборы, уже 9 лет в серии. Часов реального времени нет, а тут понадобились. Плату, схему менять запретили. Только программные доработки. У всех приборов есть СОМ-порт. Общаются по проприетарному протоколу с компом или другими изделиями. Вот подвесил в разрыв кабеля СОМ-порта от платы до разъёма на корпусе плату на STM32F051, у неё есть встроенные часы реального времени. Задействовал USART1 и USART2. Почему выбор пал на STM32F051 - просто уже была разработана мелкая платочка на нём с двумя USART-ами. Для серии просто ещё кастрировали немного. Прибор по СОМ-порту у платы время запрашивает, а если работает с компом или другими изделиями через порт, то плата для него прозрачна. По протоколу, в блоке данных есть ID, к кому обращается и есть команда. ID для каждого изделия, естественно свой. Так вот, плата на STM32F051: Для каждого USART имеются кольцевые буфера для приёма и передачи. USART-ы работают по прерыванию, принятые байты складывают в приёмный кольцевой буфер, при наличии в буфере передачи байта запускается передача, если буфер передачи пуст - останавливается передача. В фоне анализируется нужный приёмный поток и если ловится свой ID, то выполняется переданная команда. Вкратце всё. Проект не выложу, т.к. комерческий, но можно и поторговаться... :-) Тогда в личку.
  10. STM32F0 и CRC16

    А я всегда думал, что блок расчета CRC в STM32 считает CRC32... Вот здесь я выкладывал 2 функции, программную и железную для STM32. Результат их работы одинаков. И да, на вход блока CRC32 должны подаваться 32-х битные слова. В "железной" функции по ссылке применена "uint32_t __rbit( uint32_t )", Кеил её прекрасно понимает. Она реверсирует слово. И, похоже, в Cortex-M0 такой команды нету... А здесь я сейчас нашел статейку про аппаратный блок расчета CRC в STM32... А CRC16 я считаю программно. CODE /* --- crc16() -------------------------------------------------------------------------------------------- ** * Контрольная сумма crc16 * BYTE *buf - указатель на байтовый буфер * short num - размер буфера в байтах * Возвращает * unsigned short crc16 буфера * -------------------------------------------------------------------------------------------------------- */ unsigned short crc16( BYTE *buf, unsigned short num ) { #define POLINOM 0xa001 int i; WORD crc = 0xffff; while ( num-- ) { crc ^= *buf++; i = 8; do { if ( crc & 1 ) crc = ( crc >> 1 ) ^ POLINOM; else crc >>= 1; } while ( --i ); } return( crc ); #undef POLINOM }
  11. Инициализация RTC.

    Цитата(insane_person @ Nov 19 2015, 14:11) https://gcc.gnu.org/onlinedocs/cpp/Standard...ned-Macros.html Всё равно кое-какие телодвижения делать придётся... У меня STM32F205 и stm32f2xx_stdperiph_lib.v1.1.0 Я делаю так (понавыдирал куски кода из проекта, немного подправил, удалил, что не касается темы...): В *.h-файле с описаниями данных описываю структуру с калибровочными константами прибора CODE #pragma pack( 4 ) typedef struct { char b_date[sizeof( __DATE__ )]; // r_const.build_dt.b_date[];"Apr 23 2011" char b_time[sizeof( __TIME__ )]; // r_const.build_dt.b_time[];"14:18:40" } BUILD_VER; typedef struct { BUILD_VER build_dt; // r_const.build_dt; - Дата и время компиляции будет вместо версии ПО unsigned long Firm_number; // r_const.Firm_number; - Заводской номер прибора //... далее калибровочные константы прибора } ATM_Constant; #pragma pack() // выравнивание по умолчанию В *.h-файле, где инициализирую данные: CODE #if defined( MAIN_FILE ) // объявлена в файле, где функция main(), т.е. в этом файле инициализируем, а в остальных extern const ATM_Constant r_const = { { __DATE__, // r_const.build_dt.b_date[];"Apr 23 2011" __TIME__ // r_const.build_dt.b_time[];"14:18:40" }, FIRST_RUN, // r_const.Firm_number; - заводской номер прибора }; #else // MAIN_FILE extern const ATM_Constant r_const; #endif // MAIN_FILE В сишном файле делаю функции... CODE /* --- mon_num() ------------------------------------------------------------------------------------------ ** * Возвращает номер месяца (1..12) из строки r_const.build_dt.b_date[sizeof( __DATE__ )]; // "Apr 23 2011" * При ошибке в текстовой строке r_const.build_dt.b_date[sizeof( __DATE__ )] (если не нашли название месяца) * - возвращает 0. * -------------------------------------------------------------------------------------------------------- */ static uint8_t mon_num( void ) { #define MON_LEN 3 // длина строки имени месяца #define MON_CNT ( sizeof( build_date_mon ) / sizeof( const char * ) - 1 ) // последний элемент массива static const char * const build_date_mon[] = { "", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; int a, b; for ( a = MON_CNT; a != 0; a-- ) { for ( b = 0; b < MON_LEN; b++ ) if ( build_date_mon[a][b] != r_const.build_dt.b_date[b] ) break; if ( b == MON_LEN ) break; } return( a ); #undef MON_LEN #undef MON_CNT } /* --- rtc_build_date_time_2_struct() --------------------------------------------------------------------- ** * Время создания прошивки в структуры для часов * r_const.build_dt.b_date[sizeof( __DATE__ )]; // "Apr 23 2011" или "Oct 2 2012" * r_const.build_dt.b_time[sizeof( __TIME__ )]; // "14:18:40" * При правильном преобразовании - возвращает 1. * При ошибке в текстовых строках - возвращает 0. * -------------------------------------------------------------------------------------------------------- */ int rtc_build_date_time_2_struct( RTC_DateTypeDef *dat, RTC_TimeTypeDef *tim ) { #define D_POS 4 #define Y_POS 9 #define H_POS 0 #define M_POS 3 #define S_POS 6 if (( dat->RTC_Month = mon_num()) == 0 ) return( 0 ); // неверная текстовая строка в константах dat->RTC_Date = ( r_const.build_dt.b_date[D_POS + 1] - '0' ); if ( r_const.build_dt.b_date[D_POS] != ' ' ) dat->RTC_Date += ( r_const.build_dt.b_date[D_POS] - '0' ) * 10; if ( dat->RTC_Date < 1 || dat->RTC_Date > 31 ) // Число от 1 до 31 return( 0 ); // неверная текстовая строка в константах if ( r_const.build_dt.b_date[Y_POS - 2] != '2' ) // Год должен быть 2ххх return( 0 ); // неверная текстовая строка в константах dat->RTC_Year = ( r_const.build_dt.b_date[Y_POS] - '0' ) * 10 + ( r_const.build_dt.b_date[Y_POS + 1] - '0' ); tim->RTC_Hours = ( r_const.build_dt.b_time[H_POS] - '0' ) * 10 + ( r_const.build_dt.b_time[H_POS + 1] - '0' ); tim->RTC_Minutes = ( r_const.build_dt.b_time[M_POS] - '0' ) * 10 + ( r_const.build_dt.b_time[M_POS + 1] - '0' ); tim->RTC_Seconds = ( r_const.build_dt.b_time[S_POS] - '0' ) * 10 + ( r_const.build_dt.b_time[S_POS + 1] - '0' ); if ( tim->RTC_Hours > 23 || tim->RTC_Minutes > 59 || tim->RTC_Seconds > 59 ) // Часы от 0 до 23, Минуты от 0 до 59, секунды от 0 до 59 return( 0 ); // неверная текстовая строка в константах return( 1 ); // Всё ОК #undef D_POS #undef Y_POS #undef H_POS #undef M_POS #undef S_POS } Где-то так...
  12. Keil uVision

    А toweroff создал раздачу на rutracker.org, там есть 4.74. http://rutracker.org/forum/viewtopic.php?t=2305709
  13. STM32F0 - поднять

    Цитата(toweroff @ Jul 1 2015, 23:39) .... лучше на старой (а где взять под F0)... Сейчас что-то http://www.st.com/ не открывается, но у меня в заначке есть старая stm32f0_stdperiph_lib.v1.4.0.zip
  14. Про библиотеку громко сказано. Вот вкладываю файлик, использую очень давно для 2-х и 4-х строчных символьных индикаторов на HD44780. Сейчас на рынке практически все предлагаемые индикаторы содержат русские буквы. В предлагаемых файлах имеется перекодировка из таблицы win1251 в таблицу, применяемую в ЖКИ.
  15. А я для часиков использую подзаряжаемую батарейку ML1220-TJ1.
  16. STM32F207

    Цитата(ViKo @ Mar 3 2015, 23:58) scifi, я прочитал 2 книги по С, КиР и Шилдта. Ни там, ни там я не видел описанного свойства && ||. Не занудства ради, а пользы для: Керниган и Ричи 2.12. Старшинство и порядок вычисления
  17. CRC32

    Цитата(ViKo @ Mar 2 2015, 12:14) А вы перешлите второй раз прошивку для верификации. Никакая контрольная сумма не даст полной гарантии. Запись же делаете блоками. В бутлоадере функция записи блока номер N. Принимаете структуру "номер блока" и сам блок, записываете, посылаете назад, читая из флэшь. На том конце сравнивается и принимается решение опять этот блок пульнуть или следующий...
  18. CRC32

    Вот 2 функции, одна "железная" для STM32, а вторая программная, из википедии. Результат одинаков. Единственное условие - размер массива в байтах должен быть кратен 4-м. Проверял и сейчас использую первую в "железке" на STM32F205, а вторую в компе. Код/* --- crc32() -------------------------------------------------------------------------------------------- ** *  Контрольная сумма crc32 с использованием "железного" "Блока расчета CRC" STM32F2xx. *  Poly  : 0x04c11db7    x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 *  Init  : 0xffffffff *  Revert: true *  XorOut: 0xffffffff *  Check : 0x5d34eb96 ("123456789012" или { 0x34333231, 0x38373635, 0x32313039 }) *  - обнаружение одинарных, двойных, пакетных и всех нечетных ошибок *    uint32_t arr[]   - указатель на массив 32-х битных слов *    unsigned int num - размер массива в словах!!! *  Возвращает *    unsigned long crc32 массива *  Результат совпадает со стандартной функцией crc32 при условии кратности размера массива 4-м байтам (32-м битам) * -------------------------------------------------------------------------------------------------------- */ unsigned long crc32( uint32_t *arr, uint32_t num ) {   CRC->CR = CRC_CR_RESET;                                         // Reset CRC generator   while ( num-- )     CRC->DR = __rbit( *arr++ );   return( __rbit( CRC->DR ) ^ 0xffffffffUL ); } CODE/* --- crc32() -------------------------------------------------------------------------------------------- ** * Контрольная сумма crc32 * Poly : 0x04c11db7 x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 * Init : 0xffffffff * Revert: true * XorOut: 0xffffffff * Check : 0xcbf43926 ("123456789") * MaxLen: 268 435 455 байт (2 147 483 647 бит) - обнаружение одинарных, двойных, пакетных и всех нечетных ошибок * uint32_t arr[] - указатель на массив 32-х битных слов * unsigned int num - размер массива в словах!!! * Возвращает * unsigned long crc32 буфера * -------------------------------------------------------------------------------------------------------- */ unsigned long crc32( uint32_t *arr, uint32_t num ) { static const uint32_t crc32table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; unsigned long crc = 0xffffffff; BYTE *buf = (BYTE *)arr; num *= 4; // Для совместимости с "железной" функцией crc32 while ( num-- ) crc = ( crc >> 8 ) ^ crc32table[( crc ^ *buf++ ) & 0xff]; return( crc ^ 0xffffffffUL ); }
  19. STM32F4: цифровой фильтр АЦП

    Цитатаможет стоит изменить количество точек? Медианный фильтр не пропускает выбросы длительностью меньше половины ширины фильтра. Т.е. если у Вас 31 точка, то шумовые выбросы длительностью меньше или равно времени 15 отсчетов не пройдут через фильтр. Думайте сами. И после резестивного делителя повторитель поствьте.
  20. STM32F4: цифровой фильтр АЦП

    Вот здесь рассматривалось много разных медиан.
  21. А с защитой от копирования Вы случайно там не баловались? Если не ставили уровень защиты "Level_2" или вообще не баловались с защитой от копирования, тогда можно использовать "STM32 and STM8 Flash loader demonstrator" и стереть Вашу прошивку через RS-232.
  22. аналог FlashMagic для STM32

    Я на разъёме кабеля для связи с компом, на свободные ноги поставил переключатель, в одну сторону - штатная работа, в другую - программирование. Поставил р-канальный полевик, чтобы давать +3.3В на ногу ВООТ, ну и т.д. Если остаётся свободная половинка драйвера RS-232, то вход TTL вешаю на землю, а его выход на своболную ногу разъёма, вход RS-232 на вторую свободную ногу, а выход TTL - на затвор. Замкнул переключатель - можно писать прошивать. Ну и шнурок с переключателем - только у сервисников.
  23. RTX Kernal malloc()

    malloc() выделяет память не в стеке, а в куче (heap). Размер кучи для STM32F2 задаётся в файле "startup_stm32f2xx.s". Учитывайте, что частый вызов malloc(), calloc(), realloc() и free() может привести к фрагментации кучи и невозможности выделить области памяти большого объёма... Для реентабельности (возможности вызова из разных задач) вызов malloc(), calloc(), realloc() и free() должен быть обрамлён функциями rt_tsk_lock() и rt_tsk_unlock(). Примеры функций для CMSIS_RTX кейла во вложенном файле [attachment=88179:rtx_malloc.zip].
  24. Проблема с RTX Kernal !

    Я у себя в проектах использую CMSIS_RTX в исходниках, а не как библиотеку и в самом начале столкнулся с подобным сообщением. Оно вылазит по тому, что в файле "RTX_CM_lib.h" есть определение вида Кодuint32_t       os_tmr = 0; А в исходниках, в файле "rt_Timer.c" есть строка Кодstruct OS_XTMR os_tmr; т.е. двойное определение os_tmr. В файле "RTX_CM_lib.h" я закоментировал определение os_tmr, т.к. везде в исходниках os_tmr используется как структура.