Я на прошлой работе использовал терминал RealTerm, мне нравилось в нем что можно смотреть прием-передачу в HEX-формате с пробелами между байтами и цветовой разметкой по RX-TX. К сожалению, проект не развивается, но в отладке он мне помогает до сих пор.
Да я даже не знаю. С одной стороны это ускорило бы её печать в хорошей типографии, а это не дёшево, а с другой написание руками не заменит. Если хотя бы люди спонсировали канал по закладке "Полный доступ", а это не дорого вовсе, это со временем значительно улучшило ситуацию с выпуском книги.
у меня вопросик, работаю с двумя ЮАРТ в прерывании с подсчетом кол-ва данных по приему (IDLE). так вот, все работает нормально. но если включаешь обмен по 2м юартам то все. происходят сбои и потери данных. может что то посоветуйте. как реализовать корректный обмен по 2м каналам без сбоев., да скорости разные. 19200 и 115. связано с особенностями устройства.
Посмотрите сначала еррату на ваш мк, нет ли там особенностей работы одновременно юартов с вашими номерами и раскидайте их по DMA. Не вижу проблем с одновременной работой, да ещё и с низкими такими скоростями.
Большое спасибо за уроки. Один вопрос, суть функций callback, их назначение и правила применения. В общих чертах примерно можно понять, но все таки есть вопросы. Ну хотя бы форма записи в функции main - void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);. Насколько я понимаю, в си так записывают объявление функций, но это не делается в main. Это только один вопрос, а их много. Возможно у Вас есть урок по теме, так как к примеру то, что написано в википедии, меня только еще больше запутало.
Попробовал на черной таблетке - при попытке перейти к определению HAL_UART_ErrorCallback или HAL_UART_Receive_IT "No browther information available in 'UART1\UART1'/ Check - [Target-Options] [Output] [Browther Information] then Rebuild the target!" Галочка Browther Information стоит. Подскажите куда копать?
ЕСли это кто то прочитает) Почему на 22 минуте при переполнении буфера приема не выкидывается соответствующая ошибка? Ведь обработчик ошибок в самом начале видео показан)
добавил 2 строки __HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR); HAL_UART_RegisterCallback(&huart2, HAL_UART_ERROR_CB_ID, HAL_UART_ErrorCallback); и включил USE_HAL_UART_REGISTER_CALLBACKS в ..hal_config.h. Обработчик заработал, но почему-то только если шагать в отладочном режиме. При номальной работе все-равно не срабатывает(
Добрый день, Я программирую по вашем урокам. Подскажите как можно в cubeMX включить авто дополнение слов, например как вижуал студио. ЧТо бы при написании выпадало меню с вариантами выбора что дописать?
Спасибо за уроки! Сейчас не могу решить одну проблемку, может подскажете? После отправки данных линия TX остается в активном состоянии (1), а как сделать низкое состояние между пакетами, не могу сообразить. Пытаюсь реализовать протокол DMX-512, в котором между пакетами должен образоваться на линии низкий уровень (break). В даташите на МК серии F есть бит SBK, а моём МК серии G030 его нет, вот и застопорился...
Пожалуйста. Юарт таким образом работает, оставляя линию поднятой, в графиках видео это показано. Я бы вам советовал сделать юарт софтверный, на выводах GPIO, там вы смогли бы задать использование линии тх при не использовании в нуле...
Да, видимо придется пробовать делать софтверный юарт. Делал как-то софтверный spi, получилось, правда там по поводу скорости передачи данных не заморачивался, а тут с юартом надо 250кб/с, буду разбираться. Спасибо за совет. Кстати, нашёл документ от ST, UM0792, там тоже интересный вариант получать низкий уровень на линии, может кому пригодиться.
Пожалуйста за совет. Я просто с DMX-512 communication protocol не работал, поэтому не знаю как его формировать, в классическом юарте такого нельзя делать, с понижением линии.
Добрый день. В КубЭМиксе -> ProjectManager-> Advanced Settings , справа есть колонка с кучей КоллБеков, (у вас они не видны потому что окно растянуто ), вы ими не пользуетесь ? я пытался разобраться , но чёто никак ))) Как я понял, они только для HALLa , активируют коллбеки в файле stm32f0xx_hal_conf.h . Где они включаются с библиотекой LL не нашёл . Интересно было бы узнать как ими правильно пользоваться.
Они там есть. Учитесь больше руками писать и понимать. По включению тех колбэков полезного я ничего не нашёл. RM и HAL Description как я уже говорил наше всё.
@@NRelectronics Снова здрасти ))) Я совсем запутался с этими коллбеками. Сижу мучаю уже несколько часов АЦП на STM32F0 . Пошагав по брекпоинтам в программе открыл для себя америку ))) попав в обработчик прерываний нас кидает в функцию коллбека , по завершению коллбека очищаются флаги и мы снова попадаем в обработчик прерываний (но уже в конец). Какой смысл от этого колбека ? ))) написано в Даташите что это неблокирующая функция . Или тут весь смысл в том что пока выполняется коллбек ,контроллер может принимать и ставить в очередь другие прерывания ??? А если бы мы работали в самом обработчике то другие прерывания прошли бы мимо ???
Молодцы что в отладке смотрите, не ленитесь, так и нужно. Просто когда мы попадаем в обработчик мы то не знаем по каким свойствам попали, колбэки нам помогают понять по заполнению всего буфера или половины, по передачи или по приему, если флаги ошибок то какие и т.д. в соответствии с RM. Мы сами понимаем что происходит, так устроен хал. Можно и в обработчике, в первом видео я так делал на примере в конце видео, но так обычно не делают все же.
19:25 Рекурсия+свойство функции ReceiveToIdle. Главное не вводить в терминале количество символов, превышающее число символов из функии HAL_UARTEx_ReceiveToIdle_IT.
@@NRelectronics Я вообще запутался. При добавлении задержки в Event Каллбек вообще всё перестаёт работать. Хотел проверить взаимодействие терминала и Event Каллбек. Задержка не важно какая. Или на ХАЛ или на систик.
HAL_UARTEx_RxEventCallback() собственно как и саму HAL_UARTEx_ReceiveToIdle_IT где найти ? Ее нет Hal у меня почему-то(отладочная плата Discovery STM32F407
Хорошее кино делаете, спасибо.
Спасибо, стараюсь)
Я на прошлой работе использовал терминал RealTerm, мне нравилось в нем что можно смотреть прием-передачу в HEX-формате с пробелами между байтами и цветовой разметкой по RX-TX. К сожалению, проект не развивается, но в отладке он мне помогает до сих пор.
Рекомендую терминалку MobaXterm
Огромное спасибо!
Скорее бы книга Ваша вышла!
Может быть организовать сбор средств на нее?
Да я даже не знаю. С одной стороны это ускорило бы её печать в хорошей типографии, а это не дёшево, а с другой написание руками не заменит. Если хотя бы люди спонсировали канал по закладке "Полный доступ", а это не дорого вовсе, это со временем значительно улучшило ситуацию с выпуском книги.
у меня вопросик, работаю с двумя ЮАРТ в прерывании с подсчетом кол-ва данных по приему (IDLE). так вот, все работает нормально. но если включаешь обмен по 2м юартам то все. происходят сбои и потери данных. может что то посоветуйте. как реализовать корректный обмен по 2м каналам без сбоев., да скорости разные. 19200 и 115. связано с особенностями устройства.
Посмотрите сначала еррату на ваш мк, нет ли там особенностей работы одновременно юартов с вашими номерами и раскидайте их по DMA. Не вижу проблем с одновременной работой, да ещё и с низкими такими скоростями.
добрый день, а с ардуины на стм32 по uart можно передать информациюб, и эту информацию вывести на дисплей ?
Да, можно конечно. В соответствии с вашим протоколом.
Большое спасибо за уроки. Один вопрос, суть функций callback, их назначение и правила применения. В общих чертах примерно можно понять, но все таки есть вопросы. Ну хотя бы форма записи в функции main - void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);. Насколько я понимаю, в си так записывают объявление функций, но это не делается в main. Это только один вопрос, а их много. Возможно у Вас есть урок по теме, так как к примеру то, что написано в википедии, меня только еще больше запутало.
Спасибо за похвалу. В скобках разыменовывание конкретного использованного номера юарта. Читайте нормального автора по Си лучше, Дейтелов или Прата.
Попробовал на черной таблетке - при попытке перейти к определению HAL_UART_ErrorCallback или HAL_UART_Receive_IT "No browther information available in 'UART1\UART1'/ Check - [Target-Options] [Output] [Browther Information] then Rebuild the target!" Галочка Browther Information стоит. Подскажите куда копать?
После того как поставили галочку сделали Rebuild проекта?
@@NRelectronics Не делал. С ребилдом стало открывать. Реально туплю - было же написано - Rebuild... Спасибо!
Пожалуйста!)
ЕСли это кто то прочитает) Почему на 22 минуте при переполнении буфера приема не выкидывается соответствующая ошибка? Ведь обработчик ошибок в самом начале видео показан)
Прочитали, но обработчик не вылетает. Надо это попробовать в режиме отладки проделать...
@@NRelectronics у меня то же самое, обработчик при переполнении не срабатывает. Ставлю breackpoint на HAL_UART_ErrorCallback и глухо(
добавил 2 строки __HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
HAL_UART_RegisterCallback(&huart2, HAL_UART_ERROR_CB_ID, HAL_UART_ErrorCallback); и включил USE_HAL_UART_REGISTER_CALLBACKS в ..hal_config.h. Обработчик заработал, но почему-то только если шагать в отладочном режиме. При номальной работе все-равно не срабатывает(
Добрый день, Я программирую по вашем урокам. Подскажите как можно в cubeMX включить авто дополнение слов, например как вижуал студио. ЧТо бы при написании выпадало меню с вариантами выбора что дописать?
Добрый день. Спасибо что занимаетесь по мои видео. В кейле это комбинация клавишь при наборе ctrl+space.
@@NRelectronics visual st тоже ctrl+space
Спасибо за уроки! Сейчас не могу решить одну проблемку, может подскажете? После отправки данных линия TX остается в активном состоянии (1), а как сделать низкое состояние между пакетами, не могу сообразить. Пытаюсь реализовать протокол DMX-512, в котором между пакетами должен образоваться на линии низкий уровень (break). В даташите на МК серии F есть бит SBK, а моём МК серии G030 его нет, вот и застопорился...
Пожалуйста. Юарт таким образом работает, оставляя линию поднятой, в графиках видео это показано. Я бы вам советовал сделать юарт софтверный, на выводах GPIO, там вы смогли бы задать использование линии тх при не использовании в нуле...
Да, видимо придется пробовать делать софтверный юарт. Делал как-то софтверный spi, получилось, правда там по поводу скорости передачи данных не заморачивался, а тут с юартом надо 250кб/с, буду разбираться. Спасибо за совет. Кстати, нашёл документ от ST, UM0792, там тоже интересный вариант получать низкий уровень на линии, может кому пригодиться.
Пожалуйста за совет.
Я просто с DMX-512 communication protocol
не работал, поэтому не знаю как его формировать, в классическом юарте такого нельзя делать, с понижением линии.
Добрый день. В КубЭМиксе -> ProjectManager-> Advanced Settings , справа есть колонка с кучей КоллБеков, (у вас они не видны потому что окно растянуто ), вы ими не пользуетесь ? я пытался разобраться , но чёто никак ))) Как я понял, они только для HALLa , активируют коллбеки в файле stm32f0xx_hal_conf.h . Где они включаются с библиотекой LL не нашёл . Интересно было бы узнать как ими правильно пользоваться.
Они там есть. Учитесь больше руками писать и понимать. По включению тех колбэков полезного я ничего не нашёл. RM и HAL Description как я уже говорил наше всё.
@@NRelectronics Учусь помаленьку. Спасибо вам за труды
Правильно делаете и на правильном канале 👍
@@NRelectronics Снова здрасти ))) Я совсем запутался с этими коллбеками. Сижу мучаю уже несколько часов АЦП на STM32F0 . Пошагав по брекпоинтам в программе открыл для себя америку ))) попав в обработчик прерываний нас кидает в функцию коллбека , по завершению коллбека очищаются флаги и мы снова попадаем в обработчик прерываний (но уже в конец). Какой смысл от этого колбека ? ))) написано в Даташите что это неблокирующая функция . Или тут весь смысл в том что пока выполняется коллбек ,контроллер может принимать и ставить в очередь другие прерывания ??? А если бы мы работали в самом обработчике то другие прерывания прошли бы мимо ???
Молодцы что в отладке смотрите, не ленитесь, так и нужно. Просто когда мы попадаем в обработчик мы то не знаем по каким свойствам попали, колбэки нам помогают понять по заполнению всего буфера или половины, по передачи или по приему, если флаги ошибок то какие и т.д. в соответствии с RM. Мы сами понимаем что происходит, так устроен хал. Можно и в обработчике, в первом видео я так делал на примере в конце видео, но так обычно не делают все же.
19:25
Рекурсия+свойство функции ReceiveToIdle.
Главное не вводить в терминале количество символов, превышающее число символов из функии HAL_UARTEx_ReceiveToIdle_IT.
А можно не вводить, а если всё же вводить?)
@@NRelectronics
Я вообще запутался.
При добавлении задержки в Event Каллбек вообще всё перестаёт работать.
Хотел проверить взаимодействие терминала и Event Каллбек.
Задержка не важно какая. Или на ХАЛ или на систик.
А почему я посылаю на териенал 1.9 а у меня козябрики в терменале выводят?
Телепаты в отпуске. Посмотреть что со скоростями.
HAL_UARTEx_RxEventCallback() собственно как и саму HAL_UARTEx_ReceiveToIdle_IT где найти ? Ее нет Hal у меня почему-то(отладочная плата Discovery STM32F407
В Description HAL pdf.
@@NRelectronics спасибо уже нашел. Оказывается HAL_UARTEx_ReceiveToIdle_IT появился в новых версиях HAL в старых версиях не было
Так бывает, ст добавляет новый функционал.
👍🏼
если есть DMA, зачем вообще нужны прерывания? Хотя даже при использовании dma у stm нужно сбрасывать флаги, бред
void Usart2::send(uint8_t *data, uint8_t len)
{
uint8_t i;
while(DMA1_Stream6->CR & DMA_SxCR_EN); //wait transmit all data
DMA1->HIFCR |= DMA_HIFCR_CTCIF6; //clear flag transmit
for(i = 0; i < len; i++)
{
txData[i] = *data++; //copy data to buff
}
DMA1_Stream6->NDTR = len; //Set len
DMA1_Stream6->CR |= DMA_SxCR_EN; //enable DMA
}
Прерывания ведь есть, нужно знать их и уметь пользоваться. Спасибо за пример кода.
@@NRelectronics void Usart2::init(uint32_t baud)
{
//Enable clock
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //Port A clock
RCC->APB1ENR |= RCC_APB1ENR_USART2EN; //Usart clock
RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; //DMA1 clock
//Port config PA2 - TX PA3 - RX
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2 | GPIO_OSPEEDER_OSPEEDR3; //OSPEED 11 - very high speed
GPIOA->MODER |= GPIO_MODER_MODER3_1 | GPIO_MODER_MODER2_1; //MODER 10
GPIOA->AFR[0] |= GPIO_AFRL_AFRL3_2 | GPIO_AFRL_AFRL3_1 | GPIO_AFRL_AFRL3_0; //AF7 PA3
GPIOA->AFR[0] |= GPIO_AFRL_AFRL2_2 | GPIO_AFRL_AFRL2_1 | GPIO_AFRL_AFRL2_0; //AF7 PA2
//Uart config
USART2->BRR = (42000000UL + (baud >> 1))/baud; //Set baud
USART2->CR3 |= USART_CR3_DMAT | USART_CR3_DMAR; //Enable DMA Transmitter, Resiver
USART2->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; //Enable Transmitter, Resiver USART2
//DMA TX Config
DMA1_Stream6->CR |= DMA_SxCR_CHSEL_2 | DMA_SxCR_PL_0 | DMA_SxCR_MINC | DMA_SxCR_DIR_0; // Chanel 4, increment mode, mem to periphery
DMA1_Stream6->PAR = (uint32_t)&(USART2->DR);
DMA1_Stream6->M0AR = (uint32_t)txData;
//DMA RX Config
DMA1_Stream5->CR |= DMA_SxCR_CHSEL_2 | DMA_SxCR_PL_0 | DMA_SxCR_MINC; // Chanel 4, increment mode, periphery to men
DMA1_Stream5->PAR = (uint32_t)&(USART2->DR);
DMA1_Stream5->M0AR = (uint32_t)rxData;
DMA1_Stream5->NDTR = BUF_SIZE; //Set len
DMA1_Stream5->CR |= DMA_SxCR_EN; //enable DMA
}
void Usart2::send(uint8_t *data, uint8_t len)
{
uint8_t i;
while(DMA1_Stream6->CR & DMA_SxCR_EN); //wait transmit all data
DMA1->HIFCR |= DMA_HIFCR_CTCIF6; //clear flag transmit
for(i = 0; i < len; i++)
{
txData[i] = *data++; //copy data to buff
}
DMA1_Stream6->NDTR = len; //Set len
DMA1_Stream6->CR |= DMA_SxCR_EN; //enable DMA
}
uint8_t Usart2::read(uint8_t *data)
{
uint8_t i, len = 0;
if(!(USART2->SR & USART_SR_IDLE)) return len; //return if read not finished
DMA1_Stream5->CR &= ~DMA_SxCR_EN; //disable DMA
len = BUF_SIZE - (DMA1_Stream5->NDTR); //Read len
for(i = 0; i < len; i++)
{
*data++ = rxData[i]; //copy data to buff
}
DMA1_Stream5->NDTR = BUF_SIZE;
DMA1->HIFCR |= DMA_HIFCR_CTCIF5; //clear flag recive
DMA1_Stream5->CR |= DMA_SxCR_EN; //enable DMA
return len;
}
@@NRelectronics вот полностью
Это на f407?