Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 13.11.2016, 16:12  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,033
Сказал спасибо: 2,559
Сказали Спасибо 11,881 раз(а) в 5,958 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Сообщение от Ioann_II Посмотреть сообщение
Какой Вы алгоритм считаете оптимальным?
Для меня оптимально: проект - Кубом, начальный инит - ХАЛом, остальное - руками.
Кстати, если устраивает то, что есть у ХАЛа, использую его.
По УАРТу. У меня своя библа. Принимаю и передаю через буфер, как в CV. По образу и подобию запилил в СТМ.
Реклама:
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 13.11.2016, 16:21  
Ioann_II
Временная регистрация
 
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Ioann_II на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Я пока что так и делаю.
Ioann_II вне форума  
Непрочитано 13.11.2016, 16:30  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Сообщение от Ioann_II Посмотреть сообщение
Какой Вы алгоритм считаете оптимальным?
Я уже написал в сообщении #2.
Если прием идет не через DMA, то отслеживать символы конца строки лучше сразу же в прерывании по приему. Иначе зачем проделывать одну и ту же работу дважды. А размер буфера строки надо назначать в расчете на самое длинное сообщение.
С GPS всё понятно, там вообще только текстовая инфа шлется.
Сообщение от akegor Посмотреть сообщение
проект - Кубом, начальный инит - ХАЛом
хе, я тут попробовал кубом сгенерировать начальный инит МК. Капец, честно вам скажу. Вначале попробовал для "семерки". Глаза на лоб полезли, пока пытался разобраться. Потом попробовал на хорошо знакомой "сотке". Тоже, долго удивлялся, как это можно было так запутать такие простые и очевидные вещи.
Хотя, Куб и ХАЛ активно продвигается производителем, и в сфере мощных МК он уже как мастдайка - типа пофик, сотни мегагерц частоты проглотят всё. Совсем недавно вышла новая, еще более скоростная серия 32H, на 400 МГц.. Там наверно уже альтернативы Кубу ваапще нету...

Вот вам и "прелесть" дешевых МК и отладочных плат. Дешевый старт, зато... Либо пилите всё сами, либо мучайтесь с корявыми заготовками и автогенератором кода.

Последний раз редактировалось NewWriter; 13.11.2016 в 16:33.
NewWriter вне форума  
Непрочитано 13.11.2016, 16:44  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,033
Сказал спасибо: 2,559
Сказали Спасибо 11,881 раз(а) в 5,958 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Сообщение от NewWriter Посмотреть сообщение
я тут попробовал кубом сгенерировать начальный инит МК
Сообщение от NewWriter Посмотреть сообщение
долго удивлялся, как это можно было так запутать такие простые и очевидные вещи.
Что запутано в структурах в ините? Функции - да, там полный пинцет. Но, опять же, если ресурсы позволяют, то почему бы и не воспользоваться готовым, которое выполняет то, что требуется?
Но это уже, скорее, религиозные предпочтения и самоудовлетворение.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 13.11.2016, 16:50  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Угу, сгенерировал проект и смотрел пошагово, как же блин долго МК мечется по функциям на 16 МГц внутреннего осциллятора, пока наконец-то не дойдет до переключения на 216 МГц PLL. Довольно сумбурное составление.
Скорее всего сфера применения этого автогенератора - МК серии F7 или H7... Да и то лишь потому, что разработчики проталкивают, не давая достойной альтернативы.
NewWriter вне форума  
Непрочитано 13.11.2016, 18:25  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,662
Сказал спасибо: 185
Сказали Спасибо 3,183 раз(а) в 2,063 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

на сайте стм есть генератор фаила инита клока на экселе.
мне понравилось. вполне компактно вроде делает.
правда почему то там ф100 нету.

Нажмите, чтобы открыть спойлер


/** @addtogroup CMSIS
* @{
*/

/** @addtogroup stm32f0xx_system
* @{
*/

/** @addtogroup STM32F0xx_System_Private_Includes
* @{
*/

#include "stm32f0xx.h"

/**
* @}
*/

/** @addtogroup STM32F0xx_System_Private_TypesDefinitions
* @{
*/

/**
* @}
*/

/** @addtogroup STM32F0xx_System_Private_Defines
* @{
*/
/**
* @}
*/

/** @addtogroup STM32F0xx_System_Private_Macros
* @{
*/

/**
* @}
*/

/** @addtogroup STM32F0xx_System_Private_Variables
* @{
*/
uint32_t SystemCoreClock = 8000000;
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};

/**
* @}
*/

/** @addtogroup STM32F0xx_System_Private_FunctionPrototypes
* @{
*/

static void SetSysClock(void);

/**
* @}
*/

/** @addtogroup STM32F0xx_System_Private_Functions
* @{
*/

/**
* @brief Setup the microcontroller system.
* Initialize the Embedded Flash Interface, the PLL and update the
* SystemCoreClock variable.
* @param None
* @retval None
*/
void SystemInit (void)
{
/* Set HSION bit */
RCC-›CR |= (uint32_t)0x00000001;

/* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */
RCC-›CFGR &= (uint32_t)0xF8FFB80C;

/* Reset HSEON, CSSON and PLLON bits */
RCC-›CR &= (uint32_t)0xFEF6FFFF;

/* Reset HSEBYP bit */
RCC-›CR &= (uint32_t)0xFFFBFFFF;

/* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
RCC-›CFGR &= (uint32_t)0xFFC0FFFF;

/* Reset PREDIV1[3:0] bits */
RCC-›CFGR2 &= (uint32_t)0xFFFFFFF0;

/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
RCC-›CFGR3 &= (uint32_t)0xFFFFFEAC;

/* Reset HSI14 bit */
RCC-›CR2 &= (uint32_t)0xFFFFFFFE;

/* Disable all interrupts */
RCC-›CIR = 0x00000000;

/* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
SetSysClock();
}

void SystemCoreClockUpdate (void)
{
uint32_t tmp = 0, pllmull = 0, pllsource = 0, prediv1factor = 0;

/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC-›CFGR & RCC_CFGR_SWS;

switch (tmp)
{
case 0x00: /* HSI used as system clock */
SystemCoreClock = HSI_VALUE;
break;
case 0x04: /* HSE used as system clock */
SystemCoreClock = HSE_VALUE;
break;
case 0x08: /* PLL used as system clock */
/* Get PLL clock source and multiplication factor ----------------------*/
pllmull = RCC-›CFGR & RCC_CFGR_PLLMULL;
pllsource = RCC-›CFGR & RCC_CFGR_PLLSRC;
pllmull = ( pllmull ›› 1 + 2;

if (pllsource == 0x00)
{
/* HSI oscillator clock divided by 2 selected as PLL clock entry */
SystemCoreClock = (HSI_VALUE ›› 1) * pllmull;
}
else
{
prediv1factor = (RCC-›CFGR2 & RCC_CFGR2_PREDIV1) + 1;
/* HSE oscillator clock selected as PREDIV1 clock entry */
SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;
}
break;
default: /* HSI used as system clock */
SystemCoreClock = HSI_VALUE;
break;
}
/* Compute HCLK clock frequency ----------------*/
/* Get HCLK prescaler */
tmp = AHBPrescTable[((RCC-›CFGR & RCC_CFGR_HPRE) ›› 4)];
/* HCLK clock frequency */
SystemCoreClock ››= tmp;
}

/**
* @brief Configures the System clock frequency, AHB/APBx prescalers and Flash
* settings.
* @note This function should be called only once the RCC clock configuration
* is reset to the default reset state (done in SystemInit() function).
* @param None
* @retval None
*/
static void SetSysClock(void)
{
/************************************************** ****************************/
/* HSI used as System clock source */
/************************************************** ****************************/

/* At this stage the HSI is already enabled and used as System clock source */

/* Enable Prefetch Buffer and Flash 0 wait state */
FLASH-›ACR = FLASH_ACR_PRFTBE;

/* HCLK = SYSCLK / 16 */
RCC-›CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV16;

/* PCLK = HCLK / 1 */
RCC-›CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

}

/**
* @}
*/

/**
* @}
*/

/**
* @}
*/

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/












__________________
кагмаподэ магмаподэ

Последний раз редактировалось индюк; 13.11.2016 в 18:37.
индюк вне форума  
Непрочитано 13.11.2016, 18:44  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию

Сообщение от индюк Посмотреть сообщение
чо там переписывать то???
весь прием занимает 2 строки

void USART1_IRQHandler(void)
{
USART1-›SR&=~USART_SR_RXNE;

rx[x] = USART1-›DR;
}

Сие зачем?
Цитата:
USART1-›SR&=~USART_SR_RXNE;
Сообщение от akegor Посмотреть сообщение
Но, опять же, если ресурсы позволяют, то почему бы и не воспользоваться готовым, которое выполняет то, что требуется?
Но это уже, скорее, религиозные предпочтения и самоудовлетворение.
Блажен кто верует.
Калокуб даже вреднее ардуньи, но у тебя видно иной путь...
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 13.11.2016, 18:53  
Ioann_II
Временная регистрация
 
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Ioann_II на пути к лучшему
По умолчанию

NewWriter, я вот таки делаю - отслеживание символа в прерывании, размер буфера на максимальную строку и при обнаружении символа конца строки вызов функции для обработки строки.

В плане куба и фирменных библиотек, тоже полагаю, что без них никуда, особенно если не самая простая задача... Например, то-т же USB сделать с кубом....

dosikus & индюк: по поводу Вашего кода - а в прерывании кто проверять будет что за событие явилось источником прерывания? - Это в AVRе делать не надо - на каждое событие свой обработчик.... это так, к слову...

Посмотрите топик внимательно - проблема не в том, чтобы прерывание обработать, а в том, что при обработке 1-го символа конца строки, ещё до конца самого обработчика, затирается начало буфера, как будто-бы не закончившись, прерывание получилось снова, по приходу 2-го символа конца строки.
Как будто-бы символы обрабатываются не по очереди... именно на пару 0x0d 0x0a из гипертерминала.

Потому я и упомянул в вопросе про idle UARTа - с таким сам ранее не сталкивался.

Последний раз редактировалось dosikus; 13.11.2016 в 19:16.
Ioann_II вне форума  
Непрочитано 13.11.2016, 19:08  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Сообщение от Ioann_II Посмотреть сообщение
dosikus & индюк: по поводу Вашего кода - а в прерывании кто проверять будет что за событие явилось источником прерывания? - Это в AVRе делать не надо - на каждое событие свой обработчик.... это так, к слову...

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

Код:
void USART1_IRQHandler(void)
{
	uint8_t rx;
	if(USART1-›ISR & USART_ISR_RXNE)
	{

 
           rx = (uint8_t)(USART1-›RDR); // Receive data, clear flag 
 
            fifo_write(RxFifo, &rx, 1); // Place in reception fifo
		 if(rx==0x0D) 
		 {
			ReadStat= 1;
		 }
	}
}
И это для старых линеек, у F0 есть более совершенные способы вычленить пакет.
Вам же остается только IDLE , но снова таки без калокуба иначе будет ж**па с ручкой а не работа.
Заводится DMA на максимально возможный размер пакета, в прерывании по IDLE стартуем захват .
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 13.11.2016 в 19:11.
dosikus вне форума  
Непрочитано 14.11.2016, 03:41  
Ioann_II
Временная регистрация
 
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Ioann_II на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Часть проблемы решил - пришлось сделать прямую проверку, хотя должно-бы и без неё работать (во всяком случае на атмегах работало)

Функции
USART1_IRQHandler(void)
HAL_UART_IRQHandler(&huart1)
оставлены без изменений, они просто вызываются цепочкой и обрабатывают ошибки и вызывают
UART_Receive_IT(huart); в случае приёма байта

А вот в функции вся обработка ситуации с приёмом байта.
static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{
uint16_t* tmp;
uint32_t tmp_state = 0;
uint16_t temp;

tmp_state = huart-›State;
if((tmp_state == HAL_UART_STATE_BUSY_RX) ||
(tmp_state == HAL_UART_STATE_BUSY_TX_RX))
{
// читаем символ из приёмника
temp = huart-›Instance-›DR;

// проверка на завершающий символ
// завершающий символменяем на символ завершения строки
if(temp == huart-›Terminator1) temp = 0x00;
if(temp == huart-›Terminator2) temp = 0x00;

// та самая дополнительная проверка - в начале строки не
// должно быть завершающего кода 0x00
if((temp != 0x00) || (huart-›pRxBuffPtr != huart-›pRxBuffSave))
{
if(huart-›Init.WordLength == UART_WORDLENGTH_9B)
{
tmp = (uint16_t*) huart-›pRxBuffPtr;
if(huart-›Init.Parity == UART_PARITY_NONE)
{
*tmp = (uint16_t)(temp & (uint16_t)0x01FF);
huart-›pRxBuffPtr += 2;
}
else
{
*tmp = (uint16_t)(temp & (uint16_t)0x00FF);
huart-›pRxBuffPtr += 1;
}
}
else
{
if(huart-›Init.Parity == UART_PARITY_NONE)
{
*huart-›pRxBuffPtr++ = (uint8_t)(temp & (uint8_t)0x00FF);
}
else
{
*huart-›pRxBuffPtr++ = (uint8_t)(temp & (uint8_t)0x007F);
}
}
}

// теперь, если был завершающий символ, надо сбросить
// счётчик, указатель и вызвать Callback
if(temp == 0x00) huart-›pRxBuffPtr = huart-›pRxBuffSave,
huart-›RxXferCount = huart-›RxXferSize,
HAL_UART_RxCpltCallback(huart);

// проверка на заполнение буфера - при полном буфере
// указатель и счётчик сбросить, Callback не вызывать
if(--huart-›RxXferCount == 0)
huart-›pRxBuffPtr = huart-›pRxBuffSave,
huart-›RxXferCount = huart-›RxXferSize;

return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
Ioann_II вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хочу собрать схемку, не могу понять что за транзисторы sobyninsk Электроника - это просто 10 27.09.2013 12:37
Помогите разобраться со схемой. я не могу понять что не так. sofist Источники питания и свет 17 15.11.2007 15:52
Ошибка ISP режима (ISP Mode Error) Не могу понять в чём дело zhan99999 Микроконтроллеры, АЦП, память и т.д 4 11.01.2007 02:21
[Решено] Всем эмбеддерам посвящается... Decan Отвлекитесь, эмбеддеры! 0 24.10.2005 14:43
Не могу понять про float в PicBasicPro Raushan Микроконтроллеры, АЦП, память и т.д 3 13.06.2005 13:57


Часовой пояс GMT +4, время: 22:21.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot