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
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

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

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
       
  • Сообщения

    • @serzhant808 Одним словом, молодец! Оригинальное и правильное решение. Я как-то пропустил эту часть в теме защиты. А германиевых транзисторов у меня как грязи. Я с них начинал, переходя с лампы на транзисторы. Хотя их и сняли с производства, но в них всё же есть прелесть. Из-за малого падения напряжения на переходах думаю, что долгая жизнь, как транзисторам, так и диодам обеспечена. 
    • вы еще типы ключей обсудите и какой рукой лучше накидывать и какой крутить, стоя или сидя, после перекура или размявшись, а так же пункты инструктажа по технике безопасности и каску не забыть одеть и после всего этого я обещаю продолжать думать о вас как о нормальных людях
    • Кто это такие? Почему в печенках у тебя сидят? Расскажи
    • да нахрен он вообще нужен? покрасить и выкинуть, а так электролиты, дросселя из порошка, аккумуляторы
    • Мне очень запала эта схемка,кто бы ее правильно на кварц.стабилизацию качнул!?Хотя жалоб о стабильности от меня.Просто хотелось бы увести его из этого диапазона.  представляю мощного жука #1²  и #1³ Т1 КТ3130Б; Т2 Bfr93; Т3 Bfr93. Т1 КТ3107Л; Т2 КТ368; КТ913Б.     Для антенн буду использовать посеребренный провод. .ля,как же я доволен вашей схемкой! Всем огромное благодарное!
    • Вопрос следовало задать в теме защиты акустики, так так собственно к усилителю она имеет опосредованное отношение. По вопросу, я делаю так       
    • Здарова друзья!Ну что пробовал я собирать как и обещал,эту схему!Так как на схемке. Работает жучек,но мощность сильно падает,до 150метров,катушку на выходе делал так :L3 3+3витка(2катушки)спаивал в одну катушку,получался центральный выход на коллектор s9018,и катушечка L4 на 2виточка, от которой идет уже конкретно антенна,своими двумя витками помещалась посредине L3,3миллиметровый латунный сердечник плотно проходил внутри,и это не добавляло особо мощности,только взлетала частота до 145мГц что немножко упрощало его поиск и все. Потому я от этого каскада отказался.Просто перед антенной поставил конденсатор от 10--22pf!
  • Покупай!

×
×
  • Create New...