Jump to content
IgnatiusF

Программирование микроконтроллеров STM32 по UART

Recommended Posts

Появилась надобность в микроконтрллере STM32 для проектирования устройства. И вопрос вот в чем - в программировании этих стм-ов. Прочитал несколько статей по их программированию - что вообще для этого нужно. Выяснил, что в них (во всех?) есть вшитый bootloader, который может сам прошить МК.

То есть для этого необходимо подключить какой-либо ...to UART преобразователь, а именно TX, RX, VCC и gnd к соответсвующим ногам микроконтроллера и все? Или надо еще куда-то подавать управляющий сигнал?

Еще вопрос по поводу бутлоадера - если он занимает 8 КБ (или по разному?), то МК с 16 КБ памяти, по сути, будет иметь 8 КБ для программ?

Datasheet я только начинаю читать и пока еще не нашел точной информации, так что за помощь буду очень признателен^_^

Share this post


Link to post
Share on other sites
25 минут назад, IgnatiusF сказал:

Прочитал несколько статей по их программированию - что вообще для этого нужно.

А надо было даташит.

 

25 минут назад, IgnatiusF сказал:

есть вшитый bootloader, который может сам прошить МК.

Есть.

 

26 минут назад, IgnatiusF сказал:

Или надо еще куда-то подавать управляющий сигнал?

Надо совершать манипуляции выводами BOOT и RESET при старте. Статьи явно не читались, а пролистывались.

 

26 минут назад, IgnatiusF сказал:

Еще вопрос по поводу бутлоадера - если он занимает 8 КБ (или по разному?), то МК с 16 КБ памяти, по сути, будет иметь 8 КБ для программ?

Нет, бутлоадер там аппаратный и память не занимает.

Share this post


Link to post
Share on other sites

Есть такой документ на сайте STM AN2606 Application note почитайте. Там для каждого чипа расписано какой интерфейс используется, схема подключения и пр.

Share this post


Link to post
Share on other sites

Время – деньги и наноамперы: применение часов реального времени Maxim Integrated

Зачем использовать внешнюю микросхему часов реального времени (RTC), а не внутренние RTC микроконтроллера? Хотя бы потому, что у RTC MAX31342 производства Maxim Integrated типовое потребление составляет 150 нА при 3 В и температуре 25°С, а у встроенных RTC одного из самых малопотребляющих микроконтроллеров при тех же условиях – примерно 370 нА.

Читать статью

Ага, спасибо, статьи "перелистал", все это нашел и запомнил. AN тоже штука хорошая, я эту инфу искал, да не нашел. Просто параллельно изучаю несколько вещей и поэтому делаю это бегло и, бывает, не внимательно)

Share this post


Link to post
Share on other sites

Советую использовать именно программатор, а не бутлоадер. отладчик невероятно полезная вещь

Share this post


Link to post
Share on other sites
                     

Чип-резисторы Panasonic - технология мягких выводов и сертификация AEC-Q200

Технология мягких выводов чип-резисторов производства компании Panasonic. Обзор серий с оптимизированными параметрами: прецизионных тонкопленочных, токоизмерительных, антисерных, резисторов с повышенной стойкостью к статике и импульсным нагрузкам, резисторных сборок.

Читать статью

8 hours ago, IgnatiusF said:

Datasheet я только начинаю читать и пока еще не нашел точной информации

ну надо значит продолжать читать и искать более точную информацию. А еще можно использовать поиск по форуму, чтобы не задавать одни и те же обмусоленные 55 раз вопросы заново. А ты судя по всему вообще ничего толком то и не читал, а с уже с вопросами. Труда не приложил


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

На счет программатора и отладки это ясно, но это уж только если договорюсь об уго покупке. Деньги-то не мои)

На счет поиска по форуму - да искал. На счет труда не приложил - соглашусь от части, поскольку я сказал, что занят параллельно несколькими делами. Завтра (сегодня) уже надо все обсудить, заказать все что надо.

Share this post


Link to post
Share on other sites

в теме для начинающих все до атомов расписано, даже искать не надо


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites
3 часа назад, IgnatiusF сказал:

Деньги-то не мои)

Китайский клон ST-Link V2  стоит 3 бакса

Share this post


Link to post
Share on other sites
6 часов назад, BARS_ сказал:

Китайский клон ST-Link V2  стоит 3 бакса

Ну, вроде стоит купить. Одна проблема - пока приедет, может оказаться уже не нужен. По крайней мере для этой задачи.

Share this post


Link to post
Share on other sites

А вы оптимистично надеетесь отладить с нуля через UART быстрее чем дойдет отладчик?


Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Share this post


Link to post
Share on other sites
7 часов назад, COKPOWEHEU сказал:

А вы оптимистично надеетесь отладить с нуля через UART быстрее чем дойдет отладчик?

Я и раньше не полагался на отладчики. Живут же как-то люди?) Хотя у меня код никогда особо сложным и не был. Думаю, моргалок и небольшого "подобия дебага" через UART мне пока хватит.

Share this post


Link to post
Share on other sites

ну да, само то под кортекс диодиком помигать


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

дело не только в отладчике. Не придется дергать BOOT1 и ресет, да и скорость у JTAG/SWD выше


Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Share this post


Link to post
Share on other sites

К сожалению выбора нет. Устройство должно быть уже готово меньше чем через месяц. Так что придется дергать бут и делать ресет.

Вот вопрос, ндаа... Толи понял, то ли ничего не понял. Читаю AN2606 на счет того, где этот boot1 находится, увидел что в таблице это не пин, а бит, и теперь не понимаю где выставляется. И еще какой интерфейс (UART, I2C, SPI, 1,2,3...) используется для программирования. Нашел блок схему: USART.png.5a7d738297af79f471e56722d27e4865.png

То есть притягиваем boot0 к питанию (Pattern2 | Boot0(pin) = 1 and nBoot1(bit) = 1), жмем RESET, и через любой USART передаем прошивку? Простите если туплю и не понимаю, для меня это и вправду не очевидно...

Edited by IgnatiusF

Share this post


Link to post
Share on other sites
1 час назад, IgnatiusF сказал:

где этот boot1 находится, увидел что в таблице это не пин, а бит, и теперь не понимаю где выставляется

Посмотрите описание порта PB2. К сожалению, вы не написали какой контроллер вы используете. Если stm32f103c8t6 в 48-выводном корпусе, то 20-й вывод.

На практике достаточно притянуть BOOT0 и BOOT1 к земле через резистор. Плюс поставить перемычку, замыкающую BOOT0 на питание. Тогда для перепрошивки надеваете перемычку, дергаете ресет (или питание) и запскаете прошивку. После окончания снимаете перемычку и дергаете ресет (питание) для проверки прошитого.

2 часа назад, IgnatiusF сказал:

И еще какой интерфейс (UART, I2C, SPI, 1,2,3...) используется для программирования.

UART1: PA9, PA10, которые 30, 31 выводы в 48-выводном корпусе.


Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Share this post


Link to post
Share on other sites
27 минут назад, COKPOWEHEU сказал:

Посмотрите описание порта PB2. К сожалению, вы не написали какой контроллер вы используете. Если stm32f103c8t6 в 48-выводном корпусе, то 20-й вывод.

Контроллер STM32F378RTC6. Без платы, имеется ввиду, если что.

Цитата

На практике достаточно притянуть BOOT0 и BOOT1 к земле через резистор...

BOOT0 я на распиновке вижу, а где находится BOOT1? Я ни в одном документе его не видел, ни на одной схеме, однако на отладочных он присутствует. А в N2606 вообще пишут, что это бит, а не пин для F378. Можете немного разъяснить?

UPD: Ясно, после ресета BOOT1 работает на ноге PB2 на F103, однако в моем варианте после ресета такого нет.

Edited by IgnatiusF

Share this post


Link to post
Share on other sites

BOOT1 это действительно бит. Почитать можно в Reference manual секция 3.5.7  Option byte register (FLASH_OBR)

Как с ним работать есть в stm32f37x_flash.c. В самом начале описана работа с флэш памятью.

Share this post


Link to post
Share on other sites

Судя по тому, что я понял - работать с этим битом требуется только при использовании самописного бутлоадера, а при использовании аппаратного он выставляется автоматически?

Share this post


Link to post
Share on other sites

Не нашел что записано в этом бите в чистом МК. Попробуйте просто подключиться к UART1 и попробуйте загрузить любую программу. Для загрузки используют Flash Loader Demonstrator.

Share this post


Link to post
Share on other sites

Если ты ничего не умеешь зачем тебе STM32F378RCT6, Ардуино тебе самое то будет.

Edited by Oxford

Share this post


Link to post
Share on other sites

Если ты такой умный помоги человеку, нет желания помогать иди мимо.

Share this post


Link to post
Share on other sites

elki, ты коней своих притормози. Желание есть, нет времени. У тебя есть время, помогай. Я ему помог, пусть делает на Arduino так он сделает очень быстро проект.

Цитата

Устройство должно быть уже готово меньше чем через месяц

Я уже начал отсчет времени, понаблюдаю прошло 9 дней, как успехи?

 

Edited by Oxford

Share this post


Link to post
Share on other sites

Тогда лучше промолчать и пройти мимо. Вопрос стоял про стм, надо было бы на ардуине так и вопрос про нее был бы.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • @ARV Ну можно слушать придворного экономиста Кудрина хотя-бы, всё лучше чем жрать дерьмо в виде политического перевёртыша Соловьёва и конспирологов Михалкова, Прокопенко, в прочем последних двух смотрят только альтернативно одарённые.  
    • @finn32 штыря  должно хватить. Можно волновой канал сделать, если направление важно.
    • я предлагаю сверятся со всеми - и только так вы чтот просекете - другово варианта - нет, вам под когнитивом это не понять - выкиньте телек на месяц - и после включите - будете в шоке - уверяю - как эту дрянь я смотрел)), ес вы будете запрешать свободу голоса кому-то - то рано или поздно ее прикроют и вам - потому да я смотрю и на мнение ходоркосвкого , и чичваркина - наверняка тоже плохо и к нему относитесь) 
    • Whiskey Blues | Best of Slow Blues  
    • А посчитают так как надо, чтобы править и воровать вечно. И сохранить наворованное, тут и за рубежом.
    • Я в том смысле, что у Вити Жуковского достаточно на форуме достойных усилителей. Пусть они требуют легкого допиливания и где-то сыроваты, но они есть. Когда у Вас что-то подобное получится, можно вступать в подобные дискуссии (если уж так хочется убить время), по крайней мере, не рискуя выглядеть нелепо. А лучше вообще с ВЖ не дискутировать, дорого выйдет (выше живой убедительный пример на 52 страницы). Лучше - потратить время на развитие навыков и знаний.  
    • @Cergej Вам надо понять что Вы настраиваете и как Вы настраиваете. Есть такой металлоискатель. Терминатор Трио. Это тот же Терминатор 3, но в нем добавлен еще один канал , с помощью которого можно озвучить железо другим тоном. Этот канал включается переключателем Если тут разомкнуто, то  Это хорошо. И все будет работать в режиме тройки. Но если Вам сильно хочется что бы работало и озвучивалось двумя тонами, то нужно включить вышеуказанный переключатель и приблизительно по центру регулятора баланса грунта искать точку отсечения феррита. То есть с одной стороны регулятора будет звучать черным металлом , с другой цветным, а по центру - молчать. 
  • Similar Content

    • By Timofey Shilov
      Пытаюсь разобраться в программировании этого контроллера и при попытке настроить USART для приема/передачи данных возникла проблема:
      Пытаюсь принять байт и после нажатия кнопки отправить его обратно, но на выходе получается совсем не то что ожидаю.

      При отправке 0 должно вернуть 0, но возвращает вот это. В чем может быть проблема?
      ASCII                                BIN                   DEC         HEX

      Подозрения падают на настройку baud rate, но вроде всё как в мануалах.

      Полный код:
      #include "stm32f4xx.h" #include "stm32f4xx_hal_gpio.h" #include "stm32f4xx_hal_rcc.h" #include "stm32f4xx_hal_cortex.h" #include "stdint.h" #include "math.h" //define Internal RC frequencies #define XTAL 16000000UL //define busses prescalers #define AHB_PRE 1 #define APB1_PRE 2 #define APB2_PRE 1 #define SysTicksClk 10000 //calculate peripheral frequencies #define SYSCLK 84000000 #define AHB SYSCLK/AHB_PRE #define APB1 AHB/APB1_PRE #define APB1_TIM APB1*2 #define APB2 AHB/APB2_PRE #define APB2_TIM APB2*1 #define SysTicks AHB/SysTicksClk #define USART_BAUDRATE 19200 #define BUF_LEN 1 struct Data { char Msg[BUF_LEN]; } Message; void USART2_IRQHandler(void) { if (!(USART2->SR & USART_SR_TXE)) { if (Message.Msg[0] == (char)0x00) GPIOA->ODR |= 1 << 1; if (Message.Msg[0] == (char)0x01) GPIOA->ODR |= 0 << 1; } if (USART2->SR & USART_SR_RXNE) { Message.Msg[0] = USART2->DR; } } int main() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN; GPIOA->MODER |= 1 << 1*2; //Set GPIOA pins output mode GPIOB->MODER |= 0 << 0*2; GPIOA->MODER |= 0xA0; GPIOA->AFR[0] |= 0x7700; RCC->APB1ENR |= RCC_APB1ENR_USART2EN; USART2->CR1 |= USART_CR1_UE; //usart enable USART2->CR1 |= USART_CR1_TE; //transmitter enable USART2->CR1 |= USART_CR1_RE; //receiver enable float div = (float)APB1 /(16*(float)USART_BAUDRATE); int integer = APB1 / (16*USART_BAUDRATE); float flo = (div - (float)integer)*16; int floatt = round(flo); USART2->BRR = (( integer << 4 ) + floatt); NVIC_EnableIRQ(USART2_IRQn); USART2->CR1 |= USART_CR1_TXEIE; USART2->CR1 |= USART_CR1_RXNEIE; int i; while(1) { if (!(GPIOB->IDR & GPIO_IDR_ID0)) { i = 1; } else { if(i == 1) { USART2->DR &= Message.Msg[0]; while(!(USART2->SR & USART_SR_TC)); i = 0; } } } }  
      Сама схема:

    • By Igor1
      Помогите разобраться, как совместить (X-NUCLEO-GNSS1A1 + Nucleo-STM32L053).
      На st.com  скачал СТАНДАРТНЫЙ пакет X-CUBE-GNSS1  для  Nucleo-STM32L073, отличие L053 & L053, в памяти, но при компиляции памяти хватает (с запасом).
      Вероятно необходимо пересобрать все исходники, как новый проект с  Микроконтроллером ..L053 взамен ..L073. 
      Немного освоил STM32CubeIDE.  Ничего не получается, очень мало знаний.
      Подскажите порядок действий ?
      1/- создаю новый проектSTM32CubeIDE (с Nucleo-STM32L053),
      2/- далее переписываю папки из стандартного проекта на МК Nucleo-STM32L073,
      3/-далее корректирую main.c ?....?   
      Или  (вместо нового проекта) импортировать стандартный проект МК Nucleo-STM32L073,  далее откорректировать на новый МК .. L053 ?  
      Спасибо. Игорь.
       
      P.S.
      1. Запускаем ГЛОНАСС-плату X-NUCLEO-GNSS1A1: пошаговая инструкция :  https://www.compel.ru/lib/126482
      2. Стандартный Проект X-CUBE-GNSS1:  https://www.st.com/en/embedded-software/x-cube-gnss1.html
      3. Есть софт mbed.com , для  Nucleo-STM32F401 :   https://os.mbed.com/users/etiene32/code/GNSS1A1_FINAL/     для Ардуино:   https://github.com/stm32duino/X-NUCLEO-GNSS1A1 в т.ч.
       
    • By Стальной
      Приветствую. Не получается запустить I2C на STM32F030F4P6 для общения с EEPROM. Использую StdPeriph. Сначала пробовал сам писать, потом взял код отсюда. Результат одинаков: На линиях активности нет, висит 3В. Через CubeMX все работает.
      Последний код, который я пробовал:
      void I2C_EEPROM_Init(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1; // Режим альтернативной функции GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10; // Открытый коллектор GPIOA->OSPEEDR |= 0xFF<<18; // Максимальная скорость // Выбор альтернативной функции GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); // I2C1_SCL GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); // I2C1_SDA I2C_InitTypeDef I2C_InitStruct; I2C_InitStruct.I2C_Timing = 0x00402D42; I2C_InitStruct.I2C_AnalogFilter = I2C_AnalogFilter_Disable; I2C_InitStruct.I2C_DigitalFilter = 0x00; I2C_InitStruct.I2C_Mode = I2C_Mode_I2C ; I2C_InitStruct.I2C_OwnAddress1 = 0xDD; I2C_Init( I2C1, &I2C_InitStruct); I2C_Cmd(I2C1, ENABLE); } int main() { /* * ВКЛЮЧЕНИМЕ IWDG */ // включаем LSI RCC_LSICmd(ENABLE); while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); // разрешается доступ к регистрам IWDG IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // устанавливаем предделитель IWDG_SetPrescaler(IWDG_Prescaler_256); // значение для перезагрузки IWDG_SetReload(0xEA); // перезагрузим значение IWDG_ReloadCounter(); // LSI должен быть включен //IWDG_Enable(); /* * ВКЛЮЧЕНИМЕ IWDG ЗАВЕРШЕНО */ /* * Запуск ФАПЧ * Основная частота 48 МГц * UART от HSI */ RCC->CFGR |= 0xAA<<18; //pll mul = 12 RCC->CFGR |= 5<<8; //APB prescaller = 4 RCC->CFGR3 |= 3; //USART clock from HSI RCC->CR |= RCC_CR_PLLON; while ((RCC->CR | RCC_CR_PLLRDY) == 0); RCC->CFGR |= 2; //PLL as SYSCLK /* * Настройка ФАПЧ завершена */ //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // I2C_Initialization(); I2C_EEPROM_Init(); while (1) { I2C_TransferHandling(I2C1, 0xA0, 1, I2C_Reload_Mode, I2C_Generate_Start_Write);//devAddr while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXE) == RESET);//TXDR empty I2C_SendData(I2C1, 0);//memAddr while(I2C_GetFlagStatus(I2C1, I2C_ISR_TCR) == RESET);//transmition complete I2C_TransferHandling(I2C1, 0xA0, 1, I2C_AutoEnd_Mode, I2C_No_StartStop); while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXE) == RESET); I2C_SendData(I2C1, 25); while(I2C_GetFlagStatus(I2C1, I2C_ISR_STOPF) == RESET); I2C_ClearFlag(I2C1, I2C_ICR_STOPCF); for (long int i = 0; i < 30000; i++) IWDG_ReloadCounter(); } }  
      Прошу помощи с этой проблемой. Спасибо.
    • By Стальной
      Доброго времени суток!
      Сделал отладочную (тестовую) плату с микроконтроллером STM32F722VCT6. Плата моя, целостность проверена, как топологии, так и пайки, мелкие дефекты были исправлены. Программирую через ST-Link на плате VLDiscovery. ST-Link Utility корректно распознает МК, читает и пишет память. При попытке прошить через IAR вылетает ошибка, что целевой камень не соответствует ожидаемому. Я пробовал написать мигалку и прошить двоичный файл через ST-Link Utility. Стирание, программирование и верификация проходят успешно, но мигание не наблюдается.
      Проблема с неверным определением МК уже была, но в тот раз причиной были разработчики IAR, баг в одной из версий, что они сами подтвердили и прислали патч. Однако в тот раз собранная прошивка работала, если ее зашить через утилиту.
      Помогите разобраться. Прикреплю проект платы, вдруг где ошибка. 
       

      bench.dch f7 bench.dip
    • Guest NickL
      By Guest NickL
      Всем привет.
      Имеется датчик давления под управлением микрухи MLX90308. Микруха сия собирает показания с 4-х включенных мостом тензометрических датчиков, и отдает обработанное значение в виде аналогового сигнала. Так же есть пин для получения данных в цифре и калибровки/прошивки этой микрухи. Производитель микрухи предлагает бесплатный софт и свою отладочно-прошивочную плату (EVB90308) за 250 бакинских (дорого), которую ждать 8 недель (долго)
      Судя по докам, там обычный UART, но с другими уровнями. Логический 0 = 0.3*Uвх, т.е. 1.5в, Логическая 1 = 0.7*Uвх, т.е. 3,5в. И всё это засунуто в единственный пин и на прием и на передачу.
      Универ был давно, да и учился я плохо, подскажите пожалуйста пример схемы чтобы 1) свести tx и rx на одну ногу 2)согласовать уровни для чтения/записи сей микрухи доступными средствами. Например, FTDI.
      Даташит микрухи:
      https://www.melexis.com/-/media/files/documents/datasheets/mlx90308-datasheet-melexis.pdf
      Спасибо заранее! Это датчик из блока АБС мотоцикла, замены нет, б/у запчастей нет, а новый блок стоит как сам мотоцикл.
×
×
  • Create New...