Перейти к содержанию
    

VAI

Модераторы
  • Постов

    1 079
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о VAI

  • Звание
    Профессионал
    Профессионал

Контакты

  • Сайт
    Array

Посетители профиля

26 832 просмотра профиля
  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. Вот проверено http://electronix.ru/forum/index.php?showt...p;#entry1318905
  4. На вскидку, у Миландра есть 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. Есть древние приборы, уже 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 я считаю программно. /* --- 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. Всё равно кое-какие телодвижения делать придётся... У меня STM32F205 и stm32f2xx_stdperiph_lib.v1.1.0 Я делаю так (понавыдирал куски кода из проекта, немного подправил, удалил, что не касается темы...): В *.h-файле с описаниями данных описываю структуру с калибровочными константами прибора #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-файле, где инициализирую данные: #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 В сишном файле делаю функции... /* --- 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. STM32F0 - поднять

    Сейчас что-то http://www.st.com/ не открывается, но у меня в заначке есть старая stm32f0_stdperiph_lib.v1.4.0.zip stm32f0_stdperiph_lib.v1.4.0.zip
  13. Про библиотеку громко сказано. Вот вкладываю файлик, использую очень давно для 2-х и 4-х строчных символьных индикаторов на HD44780. Сейчас на рынке практически все предлагаемые индикаторы содержат русские буквы. В предлагаемых файлах имеется перекодировка из таблицы win1251 в таблицу, применяемую в ЖКИ. lcd.zip
  14. А я для часиков использую подзаряжаемую батарейку ML1220-TJ1.
×
×
  • Создать...