Stm32 узнать частоту шины
Тахометр stm32f1x
Автор: K.A., 3 мая 2018 в STM32
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы оставляете комментарий в качестве гостя. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.
Сообщения
Похожие публикации
Добрых времени суток, недавно начал изучать микроконтроллер STM32. Уже собрал контроллер в виде схемы, но не могу понять пару моментов а именно с подключением к нему датчиков. (буду благодарен если картинками кинете ещё).
Микроконтроллер я как понял он питается и управляется с помощью 3.3В а 5В нежелательно, поскольку мк может сгореть. Хотя многие говорят можно подать, а в дотушите нету упоминания, можете разъяснить этот момент. (знаю можно устранить с помощью подтягивающего резистора, но всё же, хочу знать от мнение асов и кто уже просветлён).
Есть датчики температуры, уровень жидкости и её температура, скорости вращения. Их я как понимаю можно подключить на МК через усилитель, ФНЧ и комутатор аналоговых сигналов а затем на МК пустить. (питание через гальваническую развязку сделаю), так можно делать? Интересует схема этих датчиков которые я перечислил, желательно для промышленности поскольку не могу выбрать а какие-то не могу найти потому что не знаю что поставить.
Ещё читал что аналоговые датчики можно подключать напрямую из датчиков к МК (через делитель). Что скажите?
И такой момент, на МК есть вводы и выводы. Т.е. программно в них можно прописать какой пин будет вводом а какой выводом? Дискретным или аналоговым, можете рассказать? Или на статью с разъяснением скиньте.
Здравствуйте, товарищи форумчане!
У меня вот такая проблемка: есть такая схема:
По сути тут stm32 на который подаётся некоторое постоянное напряжение, а именно на вход PA1. МК получает его, приводит в цифровую форму (разрядность АЦП равна восьми) и выводит их при помощи восьми GPIO выводов, а именно PB0-PB7. Эти выводы соединены со схемой ЦАП, которая преобразует значение, полученное от stm32 обратно в аналоговую форму и выводит в пробнике R2(1).
Проблема в том результат выводится не верный. Точнее говоря не всегда верный. Когда я подаю 1В, то на выходе получаю 0,99В, что верно. Но когда, например, подаю 300мВ, то получаю 1.8В, что совсем не верно. Код прошивки предельно прост:
while (1)
<
HAL_ADC_Start_IT(&hadc1);
HAL_Delay(10);
>
Код колбека прерывания:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
<
if(hadc->Instance == ADC1) //check if the interrupt comes from ACD1
<
int adc = HAL_ADC_GetValue(&hadc1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,(adc>>0)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(adc>>1)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(adc>>2)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,(adc>>3)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,(adc>>4)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,(adc>>5)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,(adc>>6)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,(adc>>7)&1);
>
>
На всякий случай вот настройка АЦП в stm32:
STM Урок 161. LL. USART. Передача данных. Часть 1
Продолжая изучать возможности библиотеки LL, на данном уроке мы начнём освоение аппаратной реализации шины USART (Universal synchronous asynchronous receiver transmitter) в контроллере STM32F1.
С данным интерфейсом мы работаем постоянно, но реализация его с помощью функционала библиотеки LL нами пока не рассматривалась. Поэтому изучать подробно работу шины USART, её протокол, режимы её работы, мы не будем. Подробно работа шины и подключение устройств друг к другу с помощью неё описана вот в этом уроке по контроллерам AVR.
Технические характеристики USART контроллере STM32F1 мы также рассматривать не будем, с ними мы будем постепенно знакомиться уже на этапе создания проектов, скажу лишь, что по сравнению с аналогичной шиной в контроллере AVR есть ряд отличий, в том числе в контроллере STM32 уже можно организовать аппаратное управление потоком с помощью специальных ножек RTS и CTS. Порой данные ножки используются ещё для некоторых целей. Но об этом в будущем.
Посмотрим сначала блок-схему шины USART в нашем контроллере
Прежде чем начать работу с интерфейсом USART с применением библиотеки LL, мы сначала подробно изучим его регистры, все их биты и битовые поля, организованные в контроллере STM32F1.
По традиции начнём с регистров управления.
Первый рассматриваемый нами регистр – регистр управления 1 (control register 1)
Теперь поподробнее о битах данного регистра
UE (USART enable): бит разрешения работы USART
0 – шина выключена
1 – шина включена.
M (Word length): бит длины слова
0 – 8 бит данных
1 – 9 бит данных.
WAKE (Wakeup method): способ пробуждения
0 – по свободной линии
1 – по маркеру адреса.
PCE (Parity control enable): бит контроля чётности
0 – чётность не контролируется
1 – контроль чётности включен.
PS (Parity selection): тип контроля чётности
0 – проверка на чётность
1 – проверка на нечётность.
PEIE (PE interrupt enable): бит включения прерываний по чётности
0 – прерывания запрещены
1 – прерывания разрешены.
TXEIE (TXE interrupt enable): бит включения прерываний по опустошению буфера передатчика
0 – прерывания запрещены
1 – прерывания разрешены.
TCIE (Transmission complete interrupt enable): бит включения прерываний по окончанию передачи
0 – прерывания запрещены
1 – прерывания разрешены.
RXNEIE (RXNE interrupt enable): бит включения прерываний по заполнению буфера приёмника
0 – прерывания запрещены
1 – прерывания разрешены.
IDLEIE (IDLE interrupt enable): бит включения прерываний по окончанию приёма (освобождения линии)
0 – прерывания запрещены
1 – прерывания разрешены.
TE (Transmitter enable): бит включения передатчика
0 – передатчик выключен
1 – передатчик включен.
RE (Receiver enable): бит включения приёмника
0 – приёмник выключен
1 – приёмник включен.
RWU (Receiver wakeup): бит перевода приёмника в спящий режим
0 – режим активный
1 – режим спящий.
SBK (Send break): бит включения передачи символов BREAK. После передачи символа (вернее кода символа) бит очищается автоматически
0 – нет передачи Break
1 – передача Break.
Следующий регистр – регистр управления 2 (control register 2)
Назначение битов регистра.
LINEN (LIN mode enable): бит включения режима LIN.
LIN (Local Interconnect Network) – это специальный стандарт промышленной сети, в котором также умеет работать наш USART.
0 – режим LIN не используется
1 – режим LIN включен.
STOP (STOP bits): битовое поле управления стоповыми битами
00 – 1 стоповый бит
01 – 0.5 стоповых бит
10 – 2 стоповых бита
11 – 1.5 стоповых бита
CLKEN (Clock enable): бит разрешения работы линии синхронизации (контакт CK)
0 – синхронизация не используется
1 – синхронизация включена.
CPOL (Clock polarity): бит полярности линии CK
0 – уровень готовности линии CK – низкий
1 – уровень готовности линии CK – высокий.
CPHA (Clock phase): бит фазы линии CK
0 – данные пойдут по фронту первого тактового импульса
1 – данные пойдут по фронту второго тактового импульса.
LBCL (Last bit clock pulse): данный бит позволяет выбрать, должен ли тактовый импульс, связанный с последним битом данных (MSB), выводиться на вывод CK в синхронном режиме
0 – последний бит не выводится на линию CK
1 – последний бит выводится на линию CK.
LBDIE (LIN break detection interrupt enable): разрешение прерываний от шины в режиме LIN по обнаружению прерывания (в буквальном смысле или перерыва) на линии
0 – прерывания запрещены
1 – прерывания разрешены.
LBDL (lin break detection length): бит длительности прерывания (перерыва) на линии в режиме LIN
0 – 10 бит
1 – 11 бит.
ADD[3:0] (Address of the USART node): битовое поле адреса на шине в для мультипроцессорной коммуникации.
Следующий регистр – регистр управления 3 (control register 3)
Назначение битов регистра:
CTSIE (CTS interrupt enable): разрешение прерывания от линии CTS
0 – прерывания запрещены
1 – прерывания разрешены.
CTSE (CTS enable): разрешение использования линии CTS
0 – линия не используется
1 – линия включена.
RTSE (RTS enable): разрешение использования линии RTS
0 – линия не используется
1 – линия включена.
DMAT (DMA enable transmitter): Включение DMA для передатчика
0 – DMA не используется
1 – DMA включен.
DMAR (DMA enable receiver): Включение DMA для приемника
0 – DMA не используется
1 – DMA включен.
SCEN (Smartcard mode enable): режим работы со смарткартами
0 – режим работы со смарткартами не используется
1 – режим работы со смарткартами включен.
NACK (Smartcard NACK enable): бит разрешения передачи условия NACK (нет подтверждения) в случае ошибки в режиме работы со смарткартами
0 – передача NACK не используется
1 – передача NACK включена.
HDSEL (Half-duplex selection): Включение полудуплексного режима (режим однопроводной передачи данных в оба направления
0 – полудуплексный режим не используется
1 – полудуплексный режим включен.
IRLP (IrDA low-power): бит выбора режима работы в режиме ИК
0 – обычный режим
1 – режим пониженного энергопотребления.
IREN (IrDA mode enable): бит включения режима ИК (передачи по инфракрасному порту)
0 – режим ИК не используется
1 – режим ИК включен.
EIE (Error interrupt enable): бит разрешения прерываний в случае ошибки. Генерация прерываний в случае ошибки кадрирования, ошибки переполнения или шумовой ошибки (флаги FE, ORE и NE)
0 – прерывания запрещены
1 – прерывания разрешены.
Следующий регистр – регистр состояния (Status register)
Назначение битов данного регистра:
CTS (CTS flag): бит обнаружения изменения уровня на линии CTS (если такая включена). Сбрасывается программно
0 – изменения состояния линии CTS не происходило
1 – произошло изменение состояния линии CTS.
LBD (LIN break detection flag) – флаг перерыва (прерывания) на шине LIN. Сбрасывается программно
0 – перерыва не происходило
1 – произошел перерыв (прерывание) на шине LIN.
TXE (Transmit data register empty): флаг опустошения буфера передатчика. Сбрасывается с помощью записи в регистр DR
0 – опустошения буфера передатчика не было
1 – произошло опустошение буфера передатчика.
TC (Transmission complete): флаг завершения передачи. Отличие от TXE в том, что не только буфер очищен, но ещё и сдвиговый регистр отработал. Сбрасывается программно записью 0 в данный бит.
0 – завершения передачи не происходило
1 – произошло завершение передачи.
RXNE (Read data register not empty): флаг заполнения буфера приёмника. Сбрасывается чтением регистра DR
0 – заполнения буфер приёмника не было
1 – произошло заполнение буфера приёмника.
IDLE (IDLE line detected): линия свободна. Сбрасывается чтением сначала регистра SR, потом DR
0 – линия занята
1 – линия свободна.
ORE (Overrun error): флаг переполнения буфера. Сбрасывается чтением сначала регистра SR, потом DR
0 — переполнение буфера не обнаружено
1 — обнаружено переполнение буфера или новые данные в буфере пытаются перезаписать старые, которые ещё не были прочитаны.
NE (Noise error flag): флаг обнаружения шума на линии. Сбрасывается чтением сначала регистра SR, потом DR
0 – шума не обнаружено
1 – обнаружен шум на линии.
FE (Framing error): флаг ошибки кадра. Сбрасывается чтением сначала регистра SR, потом DR
0 – ошибки кадра не обнаружено
1 – обнаружена ошибка кадра.
PE (Parity error): ошибка при проверке чётности, например, дважды пришёл нечётный кадр. Сбрасывается чтением сначала регистра SR, потом DR. Только перед чтением надо подождать, когда установится бит RXNE
0 – ошибки чётности не обнаружено
1 – обнаружена ошибка чётности.
Следующий регистр – регистр настройки скорости передачи данных или бит-рейта (Baud rate register)
Здесь всего два битовых поля:
DIV_Mantissa[11:0] (mantissa of USARTDIV): мантисса или целая часть.
DIV_Fraction[3:0] (fraction of USARTDIV): дробная часть.
Чуть позже мы узнаем, как производится настройка бит-рейта шины USART.
А теперь следующий регистр – регистр времени защиты и предделителей (Guard time and prescaler register)
Здесь также два битовых поля:
GT[7:0] (Guard time value): значение времени защиты в тактах. Используется только в режиме работы со смарткартами.
PSC[7:0] (Prescaler value): значение коэффициента предделителя. Используется только в режиме работы со смарткартами и в режиме ИК
Для режима ИК в режиме пониженного энергопотребления
00000001 – деление на 1
00000010 – деление на 2
В нормальном режиме ИК всегда 00000001.
В режиме работы со смарткартами используются только биты 4:0:
00000 – не используется
00001 – деление на 2
00010 – деление на 4
00011 – деление на 6.
Следующий регистр – регистр данных (Data register)
Используются только 9 младших бит, в данный регистр мы записываем данные для их последующей передачи в шину или читаем из него пришедшие данные.
Давайте теперь рассмотрим, как настраивается скорость работы шины USART.
Для этого существует формула в Reference Manual
где fCK – частота тактирования периферии (PCLK1 для USART2, 3, 4, 5 или PCLK2 для USART1), а USARTDIV, это коэффициент деления, который содержится в двух битовых полях регистра BRR.
Также в той же технической документации приведены аж целых 3 примера расчёта этого самого коэффициента деления из двух полей.
Нам, думаю хватит и одного. За основу берём 1 пример.
Если в целой части (DIV_Mantissa) находится десятичное число 27, а в дробной 12, то целая часть коэффициента у нас и будет 27, а дробная считается делением числа в дробной части регистра на 16, то есть в нашем случае 12/16 – это 0.75. Таким образом, коэффициент у нас получился 27.75.
Дальше мы уже подставляем этот коэффициент в вышеприведенную формулу и, в зависимости от нашей установленной частоты тактирования шины, рассчитываем наш битрейт.
Так как стандартные общепринятые скорости (9600, 115200 и т.д.) мы не всегда сможем получить точно из формулы, то мы можем рассчитать процент ошибки (или погрешности), в технической документации в качестве примеров расчёта приведена вот такая таблица
Хотя точного значения мы не всегда сможем добиться, но надо стремиться к тому, чтобы погрешность была наименьшей.
В следующей части нашего занятия мы закрепим наши знания, приобретенные в прошлой части занятия, на практике.
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Переходник USB to TTL можно приобрести здесь ftdi ft232rl
Логический анализатор 16 каналов можно приобрести здесь
Смотреть ВИДЕОУРОК (нажмите на картинку)