Jump to content
IgnatiusF

Инициализация UART1, не работает

Recommended Posts

Не удается проинициализировать работу UART2 на скорость 19200 бод.

Не вызывается прервание совсем, отсылаются постоянно нули на всех скоростях, если ставить System clock switch в 01 (HSE). При работе от RC генератора выдает уже просто не то, что нужно. 

Кварц рабочий, и вообще все работает, при использовании библиотек HAL.

SysTick выключил потому, что были подозрения на конлфикт приоритетов.

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

Скрытый текст

#include "stm32f10x.h"					//HDE_VALUE = 20 MHz, defined STM32F10X_CL
										//defined USE_STDPERIPH_DRIVER
//==============INIT==============//
void HSE_ini() {
	RCC->CR |= RCC_HSE_ON;				//Внешний кварц 20 MHz
	//RCC->CFGR &= ~RCC_CFGR_SW_1;			//Переключение системы на тактирование от HSE
	//RCC->CFGR |= RCC_CFGR_SW_0;			//
	//if(SysTick_Config(20000000/1000)) {	//Инициализация SysTick
	//	while(1);}
}
void PORT_ini() {
	RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;		//Тактирование порта A - USART
	RCC->APB2ENR|=RCC_APB2ENR_IOPBEN;		//Тактирование порта B - сигнальные выходы
	GPIOB->CRL = 0x11110000;			//сигнальные выходы PB7 - PB4
}
void USART1_ini() {
	RCC->APB2ENR |= RCC_APB2ENR_USART1EN;	//Тактирование USART 1
	RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;	//Тактирование блока альт. функций
	USART1->BRR = 0x412;					//20MHz/16/19200 = 65,104
	USART1->CR1 = USART_CR1_UE|USART_CR1_TE|USART_CR1_RE|USART_CR1_RXNEIE; //Инициализация UART
	GPIOA->CRH |= 0x000004B0;				//RX(PA10) - Floating Input, TX(PA9) - Alternate Push-Pull 50MHz
	GPIOA->ODR |= GPIO_ODR_ODR9;			//TX на питание.
	NVIC_EnableIRQ(USART1_IRQn);			//Вкл. прерывание USART1
}
//============END_INIT============//

//==============VOID==============//
/*static __IO uint32_t delay_count = 0;
void SysTick_Handler(void) {
	if (delay_count > 0) {
		delay_count--;}}
void delay_ms(__IO uint32_t delay_temp) {
	delay_count = delay_temp;
	while(delay_count>1){}}*/
/*--------------------------------*/
void USART1_IRQHandler(void) {				//Прерывание USART1
	if (USART1->SR & USART_SR_RXNE) {		//Если RX не пуст
		USART1->DR = USART1->DR + 1;		//Эхо + 1
		GPIOB -> ODR |= GPIO_ODR_ODR6;		//Сигнал на выход PB6
	}
	GPIOB -> ODR |= GPIO_ODR_ODR5;			//Сигнал на выход PB5
}
void delay_for() {				//Задержка
    for (int u = 0; u < 650000; u++){}     	 //на for
}
//============END_VOID============//

//==============MAIN==============//
int main() { 
	HSE_ini();
	PORT_ini();
	USART1_ini();
	while (1) {
		GPIOB->ODR |= GPIO_ODR_ODR7;		//Мигалка
		delay_for();
		USART2->DR = 0b10000001;
		USART1->DR = 0b00011000;
		GPIOB->ODR &= ~GPIO_ODR_ODR7;		//Мигалка
		delay_for();
		USART2->DR = 0b00011000;
		USART1->DR = 0b10000001;
	}
}
//============END_MAIN============//

 

Проект скоро сдавать, а использовать готовую библиотеку HAL не хочется совсем, уже несколько дней парюсь и не могу найти проблему. Попробовал разобраться что пишет в регистры HAL, однако не смог т.к. не хватает знаний, значения регистров все такие же, кроме PLL (не используется) и RCC_CR1 (в HAL почему-то полностью равен 0). Проверял передачей данных по UART. Регистр BRR не удалось считать т.к. он только для записи. У меня записано так:

USART1->BRR = 0x412;  //20MHz/16/19200 = 65,104.

Где искать следует ошибку?

Share this post


Link to post
Share on other sites

А где в программе команда глобального разрешения прерываний: __enable_irq (); ?

Share this post


Link to post
Share on other sites

Насколько я знаю, это не обязательно, они же и так разрешены, не верно? SysTick тикает и без этого. В любом случае самое важное - бодрейт и тактирование, с ними реально что-то не так. По UART идет совсем не то, что нужно, точно не помехи и пр. т.к. это подключается вообще через MOXA по RS-485 и работает с HAL.
При включении битов SW в 01 (HSE SysCLK) UART вообще ничего кроме нулей не отправляет

Edited by IgnatiusF

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Экономичные решения МЕAN WELL для надежных разработок» (30.09.2021)

Компания Компэл приглашает 30 сентября на вебинар посвященный экономичным решениям МЕAN WELL. На вебинаре мы рассмотрим, как решения MEAN WELL позволяют сэкономить при выборе недорогого источника питания. Будут представлены основные группы источников питания по конструктивным признакам и по областям применения в контексте их стоимости или их особенностей, позволяющих снизить затраты на электропитание конечного устройства.
Подробнее

Простите за откровенное вранье с моей стороны, быстро собирался перед написанием поста и кое-что подкорректировал. Запускаю я не USART1, а USART2, и для него не расписано прерывание, поэтому перед отправкой откорретировал вопрос. А так прерывание работает, оказывается.
Однако работа все равно идет странным образом. UART1, подключенный через USBtoTTL на клоке 20 МГц при посылке сплошных единиц результат такой: (E0 F0 F0 E0 E0 E0 F0 F0 F8 F8 E0 F0 E0 E0 F0 F0 F0). Возможно это помехи, идут одним двухжильным проводом. Однако всего-то 10 см с пайкой.
Через UART2, подключенный через MOXA по RS-485 (4w), при посылке сплошных единиц идет: (FE FE FE FE FE FE)

Share this post


Link to post
Share on other sites

Модульные RJ-соединители KLS — масштабное пополнение склада Компэл

Продуктовая линейка компании KLS на складе Компэл пополнилась модульными соединителями типа RJ. Ассортимент представлен неэкранированными соединителями RJ11, RJ12 и RJ45 для построения базовых информационных сетей, а также экранированными RJ45 с трансформатором для реализации систем передачи данных между узлами ЛВС.

Подробнее

С HAL'ом я не работаю, все просто можно настроить с помощью SPL (StdPeriphLibrary), если не хочется особо вникать в регистры. Настройка UART через SPL не сложна. Все настраивается через две функции:

void USART_Init(USART_TypeDef * USARTx, USART_InitTypeDef * USART_InitStruct) и

void USART_ITConfig(USART_TypeDef * USARTx, uint16_t USART_IT, FunctionalState NewState).

Требуемые значения, которые необходимо ввести в структуру подробно описаны в файле .chm.

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

Насколько я знаю, это не обязательно, они же и так разрешены, не верно?

С этой формулировкой я не уверен на 100%. Надо пробывать.

Share this post


Link to post
Share on other sites

Вебинар «Microchip и современный подход к искусственному интеллекту. Разворачиваем нейронную сеть на 32-битном микроконтроллере» (13.10.2021)

Приглашаем всех желающих 13 октября 2021 г. посетить вебинар, посвященный искусственному интеллекту, машинному обучению и решениям для их реализации от Microchip. Современные среды для глубинного обучения нейронных сетей позволяют без детального изучения предмета развернуть искусственную нейронную сеть (ANN) не только на производительных микропроцессорах и ПЛИС, но и на 32-битных микроконтроллерах. А благодаря широкому портфолио Microchip, включающему в себя диапазон компонентов от микроконтроллеров и датчиков до ПЛИС, средств скоростной передачи и хранения информации, возможно решить весь спектр задач, возникающий при обучении, верификации и развёртывании модели ANN.
Подробнее

1 час назад, yof сказал:

 

С HAL'ом я не работаю, все просто можно настроить с помощью SPL (StdPeriphLibrary)

 

Главный вопрос - зачем нужен SPL когда есть HAL? 

Человек же написал что на HAL все работает, но он хочет получить результат на цимисе.

Share this post


Link to post
Share on other sites

STMicroelectronics: электростатический разряд больше не проблема

Защита от статического электричества необходима каждому современному устройству. Компания STMicroelectronics представляет решения, соответствующие стандарту IEC61000-4-2, а также специальное приложение PROTECTION FINDER, которое поможет легкого и эффективно подобрать необходимые компоненты. Рассмотрим практические примеры защиты от ESD, отраслевые стандарты и ряд ключевых параметров важных при проектировании электростатической защиты устройств.
Подробнее

4 минуты назад, tar сказал:

но он хочет получить результат на цимисе

От SPL до CMSIS 1 шаг. Если отчетливо понимаешь API функции SPL, тогда напрямую писать в регистры не составит труда.

Share this post


Link to post
Share on other sites

Вот только вся проблема в том, что писать в регистры я вполне умею, но все равно что-то идет не так. Хотел посмотреть что HAL выставляет в BRR, однако, судя по дадашиту, чтение этого регистра запрещено. А очень жаль(
А вот в SPL я не заглядывал еще. Надеюсь, увижу там что ищу

Share this post


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

судя по дадашиту, чтение этого регистра запрещено

Почему запрещено? В даташите явно указано "rw" - чтение и запись.

 

01.jpg

Share this post


Link to post
Share on other sites

Ой, ахаха, простите, смотрю в книгу, вижу...:
image.png.a293b8f37b2d0e58c27f2e32d0adbfd3.png

Кстати, почему-то регистр RCC->CR у меня содержит все нули, проверяю вот так:
str[8] = RCC->CR>>24;
str[9] = RCC->CR>>16;
str[10] = RCC->CR>>8;
str[11] = RCC->CR;

HAL_UART_Transmit(&huart2,str,12,0xFFF);

Не может же такого быть, верно?

Share this post


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

От SPL до CMSIS 1 шаг

А от HAL до CMSIS сколько шагов? Приехали. HAL такой же абстрашн лейр что и SPL. Причем SPL как и HAL построены по одной идеологической архитектуре. Те же структуры, те же функции. Иногда при беглом взгляде даже не сразу заметишь что это SPL а не HAL. Или что по вашему HAL оперирует не регистрами а магическими шарами?

Share this post


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

Кстати, почему-то регистр RCC->CR у меня содержит все нули, проверяю вот так:

А не проще под отладчиком  в точке останова посмотреть состояние этого регистра?

Share this post


Link to post
Share on other sites

#define  USART_APB1_BAUDRATE_CALC(xVal)  ((uint32_t) APB1_CLK / xVal)
#define  USART_APB2_BAUDRATE_CALC(xVal)  ((uint32_t) APB2_CLK / xVal)

USART1->BRR = USART_APB2_BAUDRATE_CALC(19200);

 

Share this post


Link to post
Share on other sites

STM32F107RCT6. Из "анализаторов" лишь терминал и светодиоды. Иного не дано. Тактирование стабильное, если про железо, проблема, возможно, в его конфигурации, ведь с HAL проблем нет.
Отладчик тоже нема - только:

Цитата

...терминал и светодиоды...

Бедненько, да.

А разве не надо еще на 16 делить? image.png.1a1e7e77c2fdde79dd009991adde5939.png

Share this post


Link to post
Share on other sites

Бодрейт HAL'ом ставится такой же. Попробую завтра на SPL запустить. Посмотрим, что выйдет.
RCC_CR все таки прочитался, значения тоже завтра проанализирую. А сейчас скопировал значение регистра с HAL в мой пример - фига. Однако, если кому понадобится, вот такие значения получились: 0x30035A83 или 0b0011.0000.0000.0011.0101.1010.1000.0011.

Share this post


Link to post
Share on other sites

Ну как купите себе анализатор за 5 баксов и J-Link будет попроще.

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

 

А разве не надо еще на 16 делить? image.png.1a1e7e77c2fdde79dd009991adde5939.png

Регистр BRR приводили выше

Share this post


Link to post
Share on other sites

Содрал временно состояния этих регистров:

RCC->CR = 0x30035A83;
USART2->CR1 = 0x0000200C;
RCC->CFGR = 0x04000005;

Работает.

Share this post


Link to post
Share on other sites

Ну вот и опять не работает:(

Прерывание приема работает очень странно. Если присылать данные - то прерывание не вылазит, а если сделать простое подключение через терминал, то есть нажать кнопочку "Connect", то прерывание срабатывает, и выплевывает в терминал 0. Помогите пожалуйста, столько нервов убил, а результат все тот же.

Пробовал RX настраивать на floating, pull-up и pull-down, все равно одно и тоже

Еще странность какая-то с MOXA uport 1150. Подключал по мануалу, TX+ к RX+, RX- к TX- и так далее, однако пришлось в итоге подключать с точностью до наоборот, TX к TX, минус к плюсу, и только тогда прием работает.

Share this post


Link to post
Share on other sites

Мозг мой из соломы, uPort 1150 еще и настраивается. А я, блин, все это время сидел с обычным rs-232 и воображал, что это rs-485 4w.

Share this post


Link to post
Share on other sites

Кварц какой? 20 Мгц F103 вроде не тянет, если я не ошибаюсь - максимальная частота 16.
При включении источника частоты необходимо проверять завелся ли он. Флаг - HSE_RDY
Только после этого можно переключать на HSE через SW.

Регистры это хорошо,  но для правильной инициализации нужно слово за словом читать документацию. Смотрите примеры. В лоб включить, как правильно, ничего просто так не удастся.

Обычно при настройки UART бывает либо в 2 раза больше, либо в 2 раза меньше. Пробуйте

Share this post


Link to post
Share on other sites

Да все работает уже, даже как надо, без глюков и прочих приколов.
Регистры вернул в прежнее состояние, то есть в то, которое сам выставлял. Байты идут в обе стороны, прерывания работают, тактирование тактирует исправно. 20 МГц, МК F107, а не 103.

То есть почти вся "неработа" заключалась в не настроенном переходнике MOXA usb - rs-485

Edited by IgnatiusF

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...

  • Сообщения

    • С осликом соглашушь, но ЛАТР не на столько обязателен. Я без него обхожусь Да и у большинства здесь собирающих его нет, как и ослика
    • Рафик правильно говорит. До Навального был например Немцов, он даже фракцию в Думе возглавлял, такая демократия в России была. У них с Хакамадой и реальная программа развития страны была. Налог 13 процентов это они придумали, ЕР позже просто списали эту идею. У сегодняшних партий даже предвыборных программ нет, за исключением КПРФ. Но народ не хотел правых и не голосовал за них. Многие откровенно смеялись над идеями Немцова об господдержке автопрома, сейчас и эта затея использована партией власти и народ её одобряет.  
    • @golcold  Сложно чего посоветовать, не представляя всей конструкции устройства.
    • Чуть меньше 30%.  При этом, что его тогда никто не знал и его рейтинг поднялся с единиц до максимума за месяц дебатов на всего одном канале ТВ, а собянин как заводной участвовал почти во всех телешоу и по всем каналам, нарушая тем самым предвыборную рекламу. С тех пор, с 2013года,  рейтинг Навального сильно возрос, а у путина скатился до 35% по опросу подконтрольной кремлю Леваде. То-есть, на самом деле ещё ниже и  шансов у путина нет даже призрачных. Еще этот низкий рейтинг подтверждает тот факт, что в тех избирательных участках, где был осуществлен контроль, который не смогли сломать, путин собрал по 15- 25%. Такой же результат можно услышать и от знакомых училок, задействованных на голосовании в избирательных участках.  Но после тех выборов 18 года, путин обосрался перед людьми не один раз. Че-то кажется, он не дотянет до 24 года. Война у них там идет. Министра устранили, теперь охрану полностью меняют.
    • Поможет угробить прожектор. Ставьте новые светодиоды.
    • диоды только оставь. Вообще если человек занимается импульсной техникой, ему обязательно нужно ЛАТР и ослик Иа и развязывающий трансформатор. Первый пуск делаешь через ЛАТР и развязывающий трансформатор с пониженным напряжением на вход. Медленно умеличиваю напряжение смотришь осликом на Сток Исток. Если всплески в пределах разумного то оставляешь как есть
    • А если при вкручивании жала резьбу смазать графитной смазкой или просто обильно натереть графитом, выкручивание старого в будущем создает на много меньше проблем.
  • Similar Content

    • By Uhbif
      Хочу сделать вольтамперметр на базе STM32L151, есть ли какие нибудь особенности при разводке платы? Свой вариант прикрепляю ниже. Буду благодарен за дельные комментарии. 
      ВА-30.dch
    • By dim21841
      Добрый день.
      Прошу помощи в выборе контроллера stm32 под следующую задачу:
      Bluetooth HC-05 (1 uart) необходимо связывать по uart с:
      1) MAX232 (2 uart) по 9600, иногда 115200,
      2) с Atmega328 (3 uart) по 115200.
      Задача stm32 выставлять скорость на hc-05 и соединять между собой нужные uart в соответствии с выбором (4 switch в dip-8 корпусе).
      Кто может что-то посоветовать?
      В stm32 пока совсем начинающий.
      STM32 выбрал потому что в перспективе хочу добавить возможность параллельно  выводить данные и на lcd.
      Зарание благодарен за помощь.
    • By Serhii Serheiev
      Помогите пожалуйста советом. Бьюсь несколько дней с опцией ADC.
      Я использую двухканальный АЦП IN0 и IN1 на микроконтроллере STM32L010RB через библиотеку HAL.
      Если проверять по отдельности, все в порядке, но когда я проверяю вместе, у меня все время одна и та же проблема: первый канал перезаписывает данные на втором канале, и у меня одинаковые данные на IN0 и IN1 в терминале
      Функция для выбора IN0.
      void ADC_Select_CH0(void) { ADC_ChannelConfTypeDef sConfig_0 = {0}; sConfig_0.Channel = ADC_CHANNEL_0; sConfig_0.Rank = 0; if (HAL_ADC_ConfigChannel(&hadc, &sConfig_0) != HAL_OK) { Error_Handler(); } } Функция для выбора IN1
      void ADC_Select_CH1(void) { ADC_ChannelConfTypeDef sConfig_1 = {0}; sConfig_1.Channel = ADC_CHANNEL_1; sConfig_1.Rank = 0; if (HAL_ADC_ConfigChannel(&hadc, &sConfig_1) != HAL_OK) { Error_Handler(); } } основной цикл
      while(1) { ADC_Select_CH0(); HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 100); Axis[0] = HAL_ADC_GetValue(&hadc); HAL_ADC_Stop(&hadc); ADC_Select_CH1(); HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 100); Axis[1] = HAL_ADC_GetValue(&hadc); HAL_ADC_Stop(&hadc); sprintf(Tx_Data, "Axis X: %d;\r\nAxis Y: %d;\r\n\n\n", Axis[0], Axis[1]); HAL_UART_Transmit(&huart2, (uint8_t*)Tx_Data, strlen(Tx_Data), 1000); } ADC конфигурация:
      static void MX_ADC_Init(void) { hadc.Instance = ADC1; hadc.Init.OversamplingMode = DISABLE; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.SamplingTime = ADC_SAMPLETIME_160CYCLES_5; hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED; hadc.Init.LowPowerAutoWait = DISABLE; hadc.Init.LowPowerFrequencyMode = DISABLE; hadc.Init.LowPowerAutoPowerOff = DISABLE; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } }  
    • By Родион Евченко
      Здравствуйте! Не могу понять, почему на дисплей выводятся только черные квадраты, если смотреть прямо, а если под углом, то видно строку, которую я вывожу. Как убрать эти квадраты, а строку сделать видимой?
    • By SWAP
      Доброго времени суток, форумчане. Вопрос хотел задать на робофоруме, однако, похоже там сон-час (последние лет 5).
      На моих роботах стоят raspberryPi с помощью которых я в эклипсе удаленно дебажу и прогаю находящиеся на борту STMки через "openocd": https://www.instructables.com/Wireless-Programming-and-Debugging-With-STM32-and-/
      Однако, есть серьезное неудобство. При включении робота, требуется вручную подключаться к пишке по ssh и запускать команду: "sudo openocd", после чего все работает.
      Пробовал различные варианты автозапуска команды "sudo openocd" при старте пишки, выпавшие в первых страницах гугла, но результата не получил.
      Быть может, кто-нибудь из местных имеет опыт запуска "openocd" при старте системы?
      (p.s.: мои распбианы без десктопа)
       
       
       
       
×
×
  • Create New...