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
Posted (edited)

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

Edited by IgnatiusF

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

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

Подробнее

Простите за откровенное вранье с моей стороны, быстро собирался перед написанием поста и кое-что подкорректировал. Запускаю я не 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

С 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
                     

Материалы вебинара STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

На вебинаре были продемонстрированы современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0, проведено их подробное сравнение. Мы подготовили для вас материалы. Вы можете посмотреть видеозапись вебинара, ознакомиться с ответами на вопросы, загрузить код для тестирования, прочитать статьи по теме

Подробнее...

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

 

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

 

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

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

Share this post


Link to post
Share on other sites
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
Posted (edited)

Да все работает уже, даже как надо, без глюков и прочих приколов.
Регистры вернул в прежнее состояние, то есть в то, которое сам выставлял. Байты идут в обе стороны, прерывания работают, тактирование тактирует исправно. 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...

  • Similar Content

    • By svd
      Предлагаю печатные платы для паяльной станции на STM32 и OLED дисплее 1,3" версии 2.1S
      Плата делалась под китайский алюминиевый корпус.
      Тема, где обсуждается данная станция T12 , опубликована на сайте radiokot.ru
      Фото платы


      Схема немного доработана:
      1) добавлены блокировочные конденсаторы 0,1 мкФ в цепях микроконтроллера;
      2) добавлен резистор в цепи буззера для возможности снижения громкости;
      3) есть возможность подключать жала JBC (для Т12 в разъеме паяльника запаивается перемычка)

      Большинство элементов типоразмера 0603. DC/DC преобразователь PSR-7805LF можно заменить на любой китайский аналог или микросхему 7805
      Ссылки на возможные замены:
      DC/DC аналог 7805 №1
      DC/DC аналог 7805 №2

      Во вложениях схема и расположение элементов на ПП, чертеж передней панели и прошивка под дисплей 1.3" с контроллером SH1106.

      Цена за одну плату 400 руб c учетом стоимости пересылки по РФ. Количество плат ограничено.
      По всем вопросам просьба обращаться в личку.
       
      STM32_T12_2.1S_SSH1106_1.3_v2_.pdf передняя панель.pdf T12_HW21S_Encryption-SH1106.zip
    • By ART_ME
      Здравствуйте.
      Рискну спросить: не завалялась ли у кого в хозяйстве для STM32F103xx: 
      - AC induction motor IFOC software library V1.0
      либо 
      - ACIM and PMSM motor control software libraries release 2.0
      ?
      Просьба поделиться если вдруг такой раритет найдется. 
       
    • By Илья Юрченко
      Добрый день, уважаемые форумчане! Для научной работы хотел собрать данные о том, насколько микроконтроллеры stm32 удовлетворяют нужды и требования программистов и разработчиков продуктов на нем. Если не сложно, ответьте, пожалуйста, важны данные)
      Разумеется "очень средне" неадекватная метрика, но в рамках работы нужна именно средняя удовлетворённость, и определение существует ли необходимость в создании другой серии универсальных плат на базе МК.
    • By n_angelo
      Привет. Хочу узнать ваше мнение. Я новичок в embedded. Можно сказать, что пришел с веба. Малость Python, JS, C. Меня, конечно, предупреждали начать с AVR, но я уверенный в себе решил сразу залезть на STM32. Вынашивая идею для проекта, параллельно курив Reference Manual и Data Sheet по STM32, я понял что его будет слишком жирно для проекта. Я перескочил на STM8L. И тут меня начал огорчать мир embedded. При переходе между stm8 и stm32 нужно менять IDE (TrueStudio на STVD). Во избежание таких курьёзов я пересаживаюсь на IAR. В процессе подключения родной библиотеки от ST, понимаю что библиотека от IAR для того же самого STM8L152C6T6 дико отличается (макросы, структуры). Привет веб-разработка. Как такое могло произойти, что под один и тот же контроллер ST даёт одну библиотеку, а IAR другую. И нигде в уроках тебя не предупредят об этом. Ну, ребят, у меня всего одна жизнь. Вы уже договоритесь там между собой? Придите к единому стандарту. Или они так решили новичков завендерлочить? Моё мнение (не претендует на правильное): пробираясь сквозь тернии популярной архитектуры ARM, инфраструктуры, инструментария, забываешь про бизнес-логику устройств. А еще просто пропасть между "я ничего не понимаю" и "господи, я зажег светодиод". Речь не о копипастерах с уроков, а действительно понимая что ты делаешь, в каком регистре, что меняешь. Это путь в 2000 (а то и больше) страниц на английском перечитанных по несколько раз, чтобы отоложилось. И в конце тебя ждут разные версии одной и той же библиотки в разных IDE. И сидишь вдупляешь... ну почему... я же в правильный регистр кладу правильную маску... ох, наболело. Такое ощущение что не для людей это всё делали, не для людей.
      Ваше мнение?
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
  • Сообщения

    • Чем? Нормально останется.  Китай, 0.25. Там не надо 25, 16 хватит.  Та ладно, я делаю ЛУТом 0.5 спокойно. Травить надо зряче, в режиме онлайн, а не бросить плату в раствор и придти через полсуток, так конечно перетравится. Это да, тото это от оно.  
    • И багажник закрыть потом тоже чем-то надо.
    • В голове эта мысля сидела Спасибо за пинок В общем хочу платы раскидать на шлейфы, завтра подумаю какие штекера приобрести, думаю так удобней будет. А вод об этом не подумал.... мучился в формате пдф... что не очень удобно...
    • 1. Дорожки "продетые" между ногами это крайне плохо. Ноги МС толщиной 1 мм., а у вас пятаки всего 1.8 мм. диаметром. Что останется для припаивания?  Тоненькое колечко. 2. Что за резисторы у вас использованы?  Если между дырками всего 7 мм. то МЛТ 0.125 в них не встанут никак.  3. Конденсаторы 2200 мкф.\ 25 в.  и диаметром всего 10 мм. это надо ещё поискать. 4. Тонкие дорожки шириной всего 0.6 мм. "перетравить" такие очень легко, да и ток нормальный по ним не пропустить.  В общем "печатка" так себе. Слабых мест очень много. Я бы такую паять точно не стал.
    • Когда схема объёмная и не простая, я распечатываю листы и склеиваю в единую схему. С таким материалом легче работать, весь маршрут перед глазами. Можно и карандашиком трассу пометить. Потом беру генератор с установленной частотой 1 кГц 250 мВ подаю на AUX. И щупом осциллоскопа с хорошо заточенной иголочкой продвигаюсь по отмеченному маршруту. На мой взгляд, это самый оптимальный режим поиска.
    • Тем что спереди он машину приподнял.
    • А, спереди, слабо пакетик повесить.
  • Покупай!

×
×
  • Create New...