IgnatiusF

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

20 posts in this topic

IgnatiusF    2

Не удается проинициализировать работу 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
yof    0

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

Share this post


Link to post
Share on other sites
IgnatiusF    2

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

Edited by IgnatiusF

Share this post


Link to post
Share on other sites

Старт складской программы по Wi-Fi/ Bluetooth-чипам от Espressif

На склад КОМПЭЛ поступили чипы, модули и отладочные платы от компании Espressif Systems на базе ESP8266 и ESP32. Стоимость всех изделий данной линейки – в 2-3 раза ниже ближайших аналогов, чипы занимают минимальное место на плате, энергоэффективны и универсальны в применении

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

IgnatiusF    2

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

С 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

Вебинар Литиевые ХИТы FANSO или что нужно знать инженеру о батарейках»

20 июня компания Компэл приглашает всех желающих принять участие в вебинаре, посвященном литиевым батарейкам FANSO. На вебинаре будет рассказано о параметрах батареек, их зависимости от режима работы и эксплуатации. Будет дана информация о том, на какие параметры следует обращать внимание, выбирая литиевый ХИТ, и как избежать некоторых проблем.

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

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

 

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

 

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites
IgnatiusF    2

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

Share this post


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

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

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

 

01.jpg

Share this post


Link to post
Share on other sites
IgnatiusF    2

Ой, ахаха, простите, смотрю в книгу, вижу...:
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
tar    39
8 минут назад, yof сказал:

От SPL до CMSIS 1 шаг

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites
IgnatiusF    2

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

Цитата

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

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

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

Share this post


Link to post
Share on other sites
IgnatiusF    2

Бодрейт 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
IgnatiusF    2

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

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

Работает.

Share this post


Link to post
Share on other sites
IgnatiusF    2

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

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

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

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoticons maximum 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 small girl
      Привет, ребят! Кто возьмется написать на С протокол взаимодействия для сети микроконтроллеров. База: STM32 с bluetooth модулем HC-06,- slave. ПК - master?

      За вознаграждение
    • Guest Semen
      By Guest Semen
      Пользуюсь платой stm32f103vet6. Пытался запустить ацп и мерить напряжение на PA0 через потенциометр (10к) напряжение. Опорное = 3,3 волтта.  При подачи на  PA0 любого напряжения результат счета = 2000 +/-. И на ноге PA0 всегда висит 1.6 вольт если она никуда не подключена. Режим работы ацп - регулярный.  Помоги пожалуйста.
    • By COKPOWEHEU
      Захотелось сделать устройство с минимальным потреблением. Первоначально хотел попробовать на f103, но глянул в даташит и ужаснулся: в любом режиме сна у него потребление больше, чем у AVR-ок. Ну хорошо, в standby сравнимо, но этот режим мне не подходит. Поискал аналоги, вроде бы серия L1 больше подходит для автономных устройств. Да еще там есть вкусности вроде сенсорных кнопок и управления ЖКИ (не то чтобы необходимо, но поиграться стоит).
      Собрал макетную плату с высокочастотным (8 МГц) и низкочастотным (32768) кварцами, стабилизатором, кнопками и светодиодами (из кода понятно что где висит). Запускаю RTC с пробуждением раз в секунду (в финальном устройстве просыпаться будет еще чаще) и пытаюсь увести в режим stop. Но вместо потребления в единицы микроампер получаю пол-миллиампера. Либо я какую-то периферию не отключил (да я их и не включал вроде...), либо как-то неправильно увожу в сон (вроде все по даташиту...), либо лыжи не едут.
      Вот ключевые моменты кода (остальное во вложении):
      void enable_btn(){ RCC->AHBENR |= RCC_AHBENR_GPIOBEN; GPIO_config(JBTN); //настройка на вход с минимальной скоростью, без подтяжке } void disable_all(){ GPIOA->MODER = 0xFFFFFFFF; //all to analog in GPIOB->MODER = 0xFFFFFFFF; //all to analog in GPIOC->MODER = 0xFFFFFFFF; //all to analog in GPIOD->MODER = 0xFFFFFFFF; //all to analog in GPIOA->OSPEEDR = 0; //all to low speed (наверное, неважно) GPIOB->OSPEEDR = 0; //all to low speed (наверное, неважно) GPIOC->OSPEEDR = 0; //all to low speed (наверное, неважно) GPIOD->OSPEEDR = 0; //all to low speed (наверное, неважно) GPIOA->OTYPER &=~ 0x0000FFFF; GPIOB->OTYPER &=~ 0x0000FFFF; GPIOC->OTYPER &=~ 0x0000FFFF; GPIOD->OTYPER &=~ 0x0000FFFF; RCC->AHBENR &=~ (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIODEN); clock_MS(); } void go_sleep(){ RCC->APB1ENR |= RCC_APB1ENR_PWREN;//вкл тактирование PWR SCB->SCR |= SCB_SCR_SLEEPDEEP; //для M3 разрешаем sleepdeep PWR->CR &=~PWR_CR_PDDS;//выбираем режим Power Down Deepsleep PWR->CR &=~PWR_CR_CWUF ; //очищаем wakeup flag PWR->CR |= PWR_CR_LPSDSR; //уменьшаем voltage regulator __WFI(); } ... //когда нужно заснуть disable_all(); go_sleep(); enable_btn(); Пробовал совсем не переключаться с MSI на HSE, это влияет только на рабочий режим, во сне как было 500 мкА так и остается.
      L1_sleep.rar
    • By IgnatiusF
      Появилась надобность в микроконтрллере STM32 для проектирования устройства. И вопрос вот в чем - в программировании этих стм-ов. Прочитал несколько статей по их программированию - что вообще для этого нужно. Выяснил, что в них (во всех?) есть вшитый bootloader, который может сам прошить МК.
      То есть для этого необходимо подключить какой-либо ...to UART преобразователь, а именно TX, RX, VCC и gnd к соответсвующим ногам микроконтроллера и все? Или надо еще куда-то подавать управляющий сигнал?
      Еще вопрос по поводу бутлоадера - если он занимает 8 КБ (или по разному?), то МК с 16 КБ памяти, по сути, будет иметь 8 КБ для программ?
      Datasheet я только начинаю читать и пока еще не нашел точной информации, так что за помощь буду очень признателен
  • Сообщения

    • Я тоже когда то бился за ультралинейность УНЧ...    А потом просто подумал.  Ну есть сейчас и схемы и модули которые перекрывают требуемые к прослушиваемому материалу параметры, за глаза и ж..у. А с учётом моих текущих ресурсов - могу собрать вообще практически ВСЁ. И буквально утонуть в звуке. Только вот смысл? Слушать музыку? Или производить "около спортивные соревнования"?  Германий я бы с удовольствием послушал. Любопытно. Ленинград 002 тем более очень для меня ностальгичен. А он на германии был собран. И лампы я люблю. Хотя они искажают безбожно. И CD и FLAC имеют большее качество чем пластинка, но пластинка - приятнее звучит.  Я давно перестал смотреть на необходимость высокой верности воспроизведения как на постулат. Ибо даже на студии нет такого оборудования, чтобы передать все нюансы живого исполнения. А если мы имеем студийный материал среднего качества, то нафига нам сверх-делализированное воспроизведение?  Конечно Bars прав в том, что задача УНЧ - донести до нас сигнал без искажений и приукрашиваний. Но правда как всегда по-средине. И она очень проста. Как нравится - так и слушай. Нравится лампа - однотактники вам в помощь. Нравится HI-END деньги решат всё. Нравится германий - привет паяльник и мультисим. Хочется просто услышать наиболее близкий студийный материал и при этом не платить тысячи долларов - ищи достойную для тебя плату УНЧ и паяй. А дальше - улучшай хоть до бесконечности. Хоть серебром цельнотянутым межблочники тащи. Лишь бы ты был ДОВОЛЕН. Потому все эти срачи и не имеют смысла. Музыка - это не программа для ЧПУ станка. Это то, что каждый воспринимает по-своему. 
    • А почему бы не попробовать химический метод переноса тонера?   
    • Это на стр 28. Речь идет про резистор нагрузки (R33 - 3 ком), который нужно подключать ДО шунта. Но во всех схемах он так и остался подключен после шунта.
    • Тогда, наверное, будет все-таки лучше испробовать/проэкспериментировать гремучую смесь спирт:ацетон = 8:3. Пишет, что использует такую консистенцию смеси более 15 лет. И молчал, и хихикал тихонько в уголке, пока братья славяне грели утюги и ложили электростанции от потребляемой энергии. Относительно второго видео:  на 2:40 видим, что Гарет использовал увлажняющую жидкость для снятия лака для сухих и ломких ногтей. Про витамины говорить не стоит. А вот какие-либо смягчающие и сохраняющие жидкость компоненты наверное все-таки присутствуют. На вскидку, по быстрому, приходит на ум глицерин. Т.е. как-то ослабленный ацетон с глицерином. И скорее всего, с тем же спиртом. Т.е. снова приходим к варианту 8:3. Все это догадки. Нужно пробовать. Тем более, что ничего не теряется. Платы все те же остаются нерезанные и нанесенный или размазанный тонер легко смыть тем же ацетоном. Если кто опробует какой-либо вариант - отпишитесь. Жизнь у друзей-радиолюбителей станет легче, жить станет веселей. ПыСы: Сам в данный момент не могу испробовать. Занят с утра до ночи. Да и рабочего места у меня нет пока кроме табуретки. А ночью на кухне разводить химлабораторию для всей семьи уже не камильфо. Воздух очищен и охлажден кондишкой. Так что я пока диванный радиолюбитель. Метод можно будет назвать вашим именем. По крайней мере - название пока вакантно. Ну, например Лазерно-Химический метод/способ Петрова (по аналогии с ЛУТ). Т.е. ЛХМ или ЛХС Петрова. Шучу. А результат все же интересен. С уважением
    • Я поясню, почему нет смысла спорить по статье в ссылке: - Для того, чтобы написать статью в негативном свете, нужно  доходчиво обьяснить  причину быстрого износа тех или иных узлов или деталей и аргументированно обьяснить, почему это произошло при эксплуатации на газу и почему этого не происходит на бензине.  И с этими обьяснениями сложно спорить  потому, что факты предьявляются простые и всем понятные -  раньше присутствовала смазка за счет несгоревших смол, а теперь ее нет итд.  Но все эти износы и прогары на практике не происходят и ходят детали в полтора-два раза дольше.  Поэтому спор будет не о том, что клапан не смазывается, а о том, чтобы такой пострадавший от газа клапан был вообще в природе. И зазоры не уходят. На вазах нет компенсаторов и поэтому ответственные люди приезжают на регламентные работы строго по пробегу, а им говорят, чтобы еще столько же поездили, тогда и можно будет подрегулировать и масло поменять(полтора-двойной пробег). Свечи еще гораздо реже менялись. Про экономию бензина нет смысла говорить. Если кто спросит, а какие все-таки недостатки у газа, ведь без них ничего не бывает, то скажу, что это запах (для некоторых, мне пофиг), немногочисленность заправок  и невозможно с собой в канистре взять. Но у меня одним разьемом подключался второй баллон. Зимой его не снимал для загрузки задней оси.  В день проезжал 65-70 км на работу, заправки хватало на месяц.
    • Кому такая дурь известна? Если только в палате номер 6? АМ имеет плохую помехозащищённость, если в радиовещании  -  соглашусь. Но в остальном полнейшая ересь.    Осциллограммы где?? Что что то там "звучит" это никому не интересно. Где осциллограммы? И тупить не надо. Цитатами и вырезками решил стрелки перевести. ОСЦИЛЛОГРАММЫ ДАВАЙ!
    • Нормальные. Сюда пойдут. Почти похожи на мотороллы MJ15003 - понизкочастотнее, но крепкие. Всем кажется, что так лучше. Но это не факт. При однополярке не нужна защита АС от постоянки на выходе например. В этой схеме уже есть стабилизатор. А выходной каскад не так чуствивтелен к пульсациям.