STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: STM32 новичку в ARM что к чему

Сообщение aam »

В общем, после многочисленных попыток запустить UART с использованием SPL плюнул, и попробовал код dosikus'а. Все сразу заработало. Спаибо! :beer: С ногами пока так и не понял где надо включать подтягивающий резистор, а где нет. В коде dosikus вообще только альтернативная функция задается для пинов и никакие резисторы не затрагиваются. Однако же RX (PA10) у меня повисает в воздухе (там становится ноль вместо 1) после отключения источника информации, после чего проц видит ошибку УАРТа и генерит соответстсвующее прерывание. Почему не включен резистор к VCC?
После всех этих экспериментов с SPL и наблюдением за объемом кода, получаемого в результате его использования я начинаю приходить к выводу, что SPL - это все же зло, даташит все равно читать приходится внимательно, кроме того, никакого переносимого кода не получается, а раз так - то зачем оно вообще нужно?, Не проще ли забить в регистры значения по даташиту и осовободить кучу памяти под полезный код и точно знать чего у меня написано?
Еще тупой вопрос: что такое CMSIS? Если я хочу без всяких кривых библиотек работать с МК через регистры, то какие файлы надо подключить к проекту? (на подобие AVR, где подключался всего 1 файл типа "mega8.h")
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32 новичку в ARM что к чему

Сообщение Мурик »

aam писал(а):В общем, после многочисленных попыток запустить UART с использованием SPL плюнул
Код запуска USART в F030 в режиме HalfDuplex (TXD и RXD соединены с PA.2).

Код: Выделить всё

    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);    // Подаем тактирование на GPIOA,
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // и USART1.

    RCC_USARTCLKConfig(RCC_USART1CLK_SYSCLK);  // USART тактируется от ядра МК.

    // USART TX
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;        // Настройка вывода PA.2.
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;     // Альтернативная функция вывода.
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;   // Выход с открытым стоком.
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // Подтягивающие резисторы отключены.
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); // GPIOA.2 это вывод USART1.

    // Настройка USART.
    USART_InitStructure.USART_BaudRate = 115200;                // Скорость обмена.
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8 бит данных.
    USART_InitStructure.USART_StopBits = USART_StopBits_1;      // 1 стоп бит.
    USART_InitStructure.USART_Parity = USART_Parity_No;         // Нет проверки четности.
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // Настраиваем приемник и передатчик.

    USART_Init(USART1, &USART_InitStructure);

    USART_SetAddress(USART1, 0);          
    USART_HalfDuplexCmd(USART1 , ENABLE); // Разрешение работы USART в полудуплексном режиме.
    USART_Cmd(USART1, ENABLE);            // Включаем USART.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

aam писал(а):В коде dosikus вообще только альтернативная функция задается для пинов и никакие резисторы не затрагиваются. Однако же RX (PA10) у меня повисает в воздухе (там становится ноль вместо 1) после отключения источника информации, после чего проц видит ошибку УАРТа и генерит соответстсвующее прерывание. Почему не включен резистор к VCC?
В коде dosikusа нормально проинициализирован только MODER, OTYPER там вообще пропущен, в результате на TX может быть постоянно ноль(open-drain + pull-down), AFR накатан поверх, что тоже чревато, подтяжки на RX нет, а OSPEEDR лично я всегда на максимум ставлю.
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: STM32 новичку в ARM что к чему

Сообщение scorpi_0n »

Reflector писал(а): В коде dosikusа нормально проинициализирован только MODER, OTYPER там вообще пропущен, в результате на TX может быть постоянно ноль(open-drain + pull-down), AFR накатан поверх, что тоже чревато, подтяжки на RX нет, а OSPEEDR лично я всегда на максимум ставлю.
Правила хорошего тона гласят, что подобные вещи должны обеспечиваться хардварно, т.е. внешними резисторами, а не внутренними подтяжками МК. OSPEEDR в данном случае не имеет особого значения. А вообще, по хорошему, все режимы порта для периферии должны настраиваться полностью и соответственно, и независимо от того, перехватывает управление портом периферия или нет.
Реклама
Эиком - электронные компоненты и радиодетали
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

scorpi_0n писал(а):Правила хорошего тона гласят, что подобные вещи должны обеспечиваться хардварно, т.е. внешними резисторами, а не внутренними подтяжками МК.
Тем не менее внутренней подтяжки во многих случаях хватает, а без нее можно начать отлавливать глюки еще в процессе тестирования такого кода, что мы на примере aam и наблюдаем.
OSPEEDR в данном случае не имеет особого значения.
Согласен, но для USART скорости порядка 2MHz и выше не такая и редкость, потому оставлять ее на минималке смысла не много. Типичный шаблонный код должен инициализировать OSPEEDR тоже, хуже от этого точно не будет, по крайней мере человек будет знать, что такой регистр там есть и может иметь значение :)
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

aam писал(а):Если я хочу без всяких кривых библиотек работать с МК через регистры, то какие файлы надо подключить к проекту?.
для F0: #include "stm32f0xx.h"
a5021 писал(а):А вот нафига вы на новичковые впоросы прибежали с мультиусартом, имеет только одно объяснение.
Забыл спросить вашего соизволения куда мне прибегать. Еще, примерчик применения бита TC из RM:
A.19.3 USART transfer complete code example

Код: Выделить всё

if ((USART1->ISR & USART_ISR_TC) == USART_ISR_TC)
{
  if (send == sizeof(stringtosend))
  {
    send=0;
    USART1->ICR |= USART_ICR_TCCF; /* Clear transfer complete flag */
  }
  else
  {
    /* clear transfer complete flag and fill TDR with a new char */
    USART1->TDR = stringtosend[send++];
  }
}
Будете дальше кривляться?(c)
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Reflector писал(а): В коде dosikusа нормально проинициализирован только MODER, OTYPER там вообще пропущен, в результате на TX может быть постоянно ноль(open-drain + pull-down), AFR накатан поверх, что тоже чревато, подтяжки на RX нет, а OSPEEDR лично я всегда на максимум ставлю.
Согласен, но как и писал ранее- код набросок и думалось, что у нубов все равно возникнут вопросы. Так и так придется объяснять- что и зачем.
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: STM32 новичку в ARM что к чему

Сообщение aam »

scorpi_0n писал(а):Правила хорошего тона гласят, что подобные вещи должны обеспечиваться хардварно, т.е. внешними резисторами, а не внутренними подтяжками МК.
Но это смотря в каком случае. Если RX/TX наружу торчат - то да, согласен. А если они идут в соседнюю микросхему на той же плате? Зачем там внешний резистор на RX МК? А вот на TX у меня стоит резистор 10 кОм. И стоит для того, чтобы RX микросхемы не висел ввоздухе, пока STM грузится.
Reflector писал(а):для USART скорости порядка 2MHz и выше не такая и редкость, потому оставлять ее на минималке смысла не много.
В моем конкретном случае мне и 9600 бод должно хватить. Какой смысл настраивать ногу на бОльшую рабочую частоту? Кстати, во всех примерах, что я видел почему-то выбирают 50МГц.

Еще такой вопрос: насколько правильно делать UART без кварца в случае, если устройство предназначено для эксплуатации в бытовых условиях помещении? В даташите на МК написано, что точность RC +/-5% от -40 до 85C и 1% при 25С и калибровке пользователя. Про последнее не совсем понятно. Что такое "калибровка пользователя" в данном случае?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

oleg110592 писал(а):
a5021 писал(а):А вот нафига вы на новичковые впоросы прибежали с мультиусартом, имеет только одно объяснение.
Забыл спросить вашего соизволения куда мне прибегать.
Проблемы с восприятием прочитанного? Акцент был не на "куда", но "с чем".
Еще, примерчик применения бита TC из RM:
A.19.3 USART transfer complete code example
Точно проблемы. Там написано "пример завершения передачи", где _TC употреблен ровно по месту, т.к. именно для этого и предназначен -- отслеживать ситуацию, когда данные благополучно ушли в линию.
Будете дальше кривляться?(c)
А вот с обезьянничанием никаких проблем нет. Получается у вас отлично, хоть и не в тему.
scorpi_0n писал(а):Правила хорошего тона гласят, что подобные вещи должны обеспечиваться хардварно, т.е. внешними резисторами, а не внутренними подтяжками МК.
Расскажите, каково это ощущать себя законодателем "правил хорошего тона" ? Ну, типа, толкать всякую бредовую отсебятину с важным видом.
aam писал(а):В даташите на МК написано, что точность RC +/-5% от -40 до 85C и 1% при 25С и калибровке пользователя. Про последнее не совсем понятно. Что такое "калибровка пользователя" в данном случае?
В регистре RCC_CR есть пять бит HSITRIM, меняя состояние которых можно "тьюнить" частоту HSI. Любопытства ради, я как-то "промерил" выход 8192гц DS3231 с помощью таймера МК для всех значений HSITRIM. Со значением по умолчанию (а оно для HSITRIM равно 16) получалось 8197 гц, что как-бы показывало "уход" HSI на 0.061%. Любой шаг вверх или вниз от дефолтных значений HSTRIM только увеличивал данную "погрешность", из чего я сделал вывод, что HSI калиброван относительно точно и при комнатной температуре лучших показателей добиться проблематично.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

a5021 писал(а):Точно проблемы. Там написано "пример завершения передачи", где _TC употреблен ровно по месту, т.к. именно для этого и предназначен -- отслеживать ситуацию, когда данные благополучно ушли в линию.
Т.е. оказывается можно применять бит TC - в примере то можно и строку передать отслеживая только бит TC. Проблемы у вас.
Будете дальше кривляться?(c)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

oleg110592 писал(а):Т.е. оказывается можно применять бит TC - в примере то можно и строку передать отслеживая только бит TC.
Не хотите определиться, что именно и кому вы доказываете? Если у вас склероз, то смею напомнить, что вы и встряли после мой фразы о том, что "нет никакого смысла при передаче ждать, пока весь байт вытолкнется в линию". Вы видите в этой фразе прямое утверждение, что "отслеживая только бит TC" нельзя передать строку? Если видите, то у вас когнитивные нарушения и с этим, пожалуй, уже ничего не поделать.
Проблемы у вас.
Дадад. Сначала вы приписываете мне то, чего я не говорил, а потом на основании этого "рисуете" мне мои "проблемы". Чего ж тут непонятного ? Все просто и незатейливо.
Будете дальше кривляться?(c)
Похоже я ошибся и вы отнюдь не кривляетесь. Скорее следовало бы сочувствующе поинтересоваться, что это за мощный затуп, который вас никак не отпускает.
Последний раз редактировалось a5021 Вт ноя 01, 2016 09:05:52, всего редактировалось 1 раз.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

Фраза: "Нет никакого смысла при передаче ждать, пока весь байт вытолкнется в линию" совершенно неверна - смысл есть (имхо).
Далее уподоблюсь автору фраз, перейду на личности в споре, не нашел ничего тупее, не удивляйтесь, фразу верну обратно:
у вас когнитивные нарушения и с этим, пожалуй, уже ничего не поделать(с)
Скорее это некий мощный затуп, который вас никак не отпускает(с)
Все просто и незатейливо(c)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

oleg110592 писал(а):Фраза: "Нет никакого смысла при передаче ждать, пока весь байт вытолкнется в линию" совершенно неверна - смысл есть (имхо).
Не хотите рассекретить этот тайный смысл?
Далее уподоблюсь автору фраз, перейду на личности в споре, не нашел ничего тупее, не удивляйтесь, фразу верну обратно:
у вас когнитивные нарушения и с этим, пожалуй, уже ничего не поделать(с)
Скорее это некий мощный затуп, который вас никак не отпускает(с)
Все просто и незатейливо(c)
Вполне ожидаемо. Своего-то у вас ничего нет.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

a5021 писал(а):Не хотите рассекретить этот тайный смысл?
уже
a5021 писал(а):Вполне ожидаемо. Своего-то у вас ничего нет.
а зачем мне такое: когнитивные нарушения, мощный затуп, который никак не отпускает
У кого что болит, тот о том и говорит.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

oleg110592 писал(а): можно применять бит TC
Можно только то что Наполеон51 разрешает, шаг вправо шаг влево... :)))
Он счас настрочит "открытий", да закопирастит...
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

oleg110592 писал(а):У кого что болит, тот о том и говорит.
Выходит, что у вас больше всего болит необходимость приписать мне то, чего я не говорил?
dosikus писал(а):Он счас настрочит "открытий", да закопирастит...
Вы практикуетесь в предсказаниях будущего?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

a5021 писал(а): Любопытства ради, я как-то "промерил"
Все на глаз да на прикус? Все время и силы уходят на болтовню, на вменяемый инструмент уже не заработать? :)))
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

oleg110592 писал(а):
a5021 писал(а):Не хотите рассекретить этот тайный смысл?
уже
Вы существуете в какой-то альтернативной реальности и с вами там происходят события, о которых вы тут сообщаете? Только так можно объяснить ваше "уже", т.к кроме "смысл есть" от вас более не последовало никаких пояснений.

На самом деле ваше "уже" могло бы выглядеть следующим образом: отсылая очередной байт в регистр данных, ориентируясь исключительно на флаг _TC передача в линию идет с паузами. Данная пауза возникает вследствие того, что вся обработка начинается даже не после того, отправлен последний бит данных, а лишь после окончания стоп-бита (If a frame is transmitted (after the stop bit) and the TXE bit is set, the TC bit goes high. An interrupt is generated if the TCIE bit is set in the USARTx_CR1 register). Линия уже в idle, вызывается прерывание, вход в которое не происходит мгновенно. Внутри обработчика случается очередная задержка, которая обусловлена проверкой флагов и пересылкой данных в TDR. Еще короткая пауза наблюдается в процессе пересылки данных из TDR в выходной буфер (сдвиговый регистр) перед фронтом старт-бита. На протяжении этого времени линия передачи не активна, хотя ничего вроде бы не мешает в это время уже вести передачу. На фоне времени передачи единственного фрейма, дополнительная задержка может и не кажется большой, но она предшествует каждому фрейму и при передаче длинных последовательностей все задержки суммируются, что однозначно скажется увеличении общего времени передачи.

Передача без пауз между фреймами возможна, если отправлять данные в TDR не по флагу/прерыванию TC, а по TXE. В этом случае TDR будет заполняться данными в то время, когда предыдущий байт еще передается. На высоких скоростях выигрыш может оказаться невелик, т.к. вполне можно ожидать, что байт будет уходить раньше, чем закончится выполнение обработчика, но передача фрейма на 115200 бод занимает 78 микросекунд, а это 3750 тактов на частоте 48мгц и соответствующее число команд, которые могут быть выполнены за это время. Тут успеет отработать даже довольно "толстый" обработчик, а сама передача будет происходить бесшовно.

Можно ли сказать, что организация передачи по TXE дает значительные преимущества по сравнению с TC ? Насчет значительности можно поспорить, но вот то, что преимущества имеются, отрицать бессмысленно. Сопутствуют ли преимуществами какие-либо недостатки? Практически нет. Притянутый за уши пример с мультиусартом и тут может быть легко реализован путем организации слежения за флагом TC после отправки в TDR последнего байта в пакете.

Следует ли цепляться исключительно за организацию передачи по TC ? Вряд ли. Разве что лишь по причины полного непонимания того, как это работает.
dosikus писал(а):Все на глаз да на прикус? Все время и силы уходят на болтовню, на вменяемый инструмент уже не заработать? :)))
Вы обнаружили какую-то ошибку в описанной методике или просто цепляетесь за любую возможность поупражняться в глупостях? Указанной точности возможно добиться и без "вменяемого инструмента", а если вы этого не понимаете, то встает вопрос насчет вашей квалификации и становится не совсем понятно, зачем вам вообще "вменяемый инструмент". Для фетиша, может быть?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

a5021 писал(а):
На самом деле ваше "уже" могло бы выглядеть следующим образом: отсылая очередной байт в регистр данных, ориентируясь исключительно на флаг _TC передача в линию идет с паузами. Данная пауза возникает вследствие того, что вся обработка начинается даже не после того, отправлен последний бит данных, а лишь после окончания стоп-BLA....BLA...BLA...
дополнительная задержка может и не кажется большой, но она предшествует каждому фрейму и при передаче длинных последовательностей все задержки суммируются, что однозначно скажется увеличении общего времени передачи.
Тебе лучше молчать чем болтать. Где задержки, Наполеон???


Изображение

Дергаем строб после передачи С TC и TXE

Изображение

Изображение
Последний раз редактировалось dosikus Вт ноя 01, 2016 11:39:50, всего редактировалось 1 раз.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Ну значит точно для фетиша, раз вы этой картинкой тычете, предлагая поискать на ней задержки.
Ответить

Вернуться в «ARM»