Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » STM32 » UART


UART

Сообщений 61 страница 90 из 98

61

HHIMERA написал(а):

Как по мне... ничего простого... и ничего естественного... даже наоборот... какое-то горе от ума...

Тогда я сформулирую ещё более ужасную сентенцию )
IMHO, всё что может быть сделано программно, следует и делать программно, и только то, что невозможно сделать программно, следует делать аппаратно

62

vt340 написал(а):

IMHO, всё что может быть сделано программно, следует и делать программно, и только то, что невозможно сделать программно, следует делать аппаратно

Мое IMHO полностью обратное))

63

Решил попробовать DMA на USART как прием,так и передачу. Очень интересно,но столько телодвижений :) Да когда много информации.
Сделал по прерываниям окончания передачи и приема DMA. Кажется это оптимально или как ваше мнение?

Код:
void init_usart1(void)
{
	RCC->APB2ENR|=RCC_APB2ENR_AFIOEN; // tatirovanie alternativ
	RCC->APB2ENR|=RCC_APB2ENR_IOPBEN;
	RCC->AHBENR |= RCC_AHBENR_DMA1EN;
	// taktir usart in APB2= 72 Mhz
	RCC->APB2ENR|= RCC_APB2ENR_USART1EN; // tatirovanie usart1
	// remap usart1 na PB6-TX PB7-RX
	AFIO->MAPR |= AFIO_MAPR_USART1_REMAP ;
	
	// output TX- altern push-pull   RX- input float
	GPIOB->CRL&=~GPIO_CRL_MODE7;  // input  00 - input
	GPIOB->CRL&=~GPIO_CRL_CNF7;     
	GPIOB->CRL|=GPIO_CRL_CNF7_0;  // 01- input float
	
	GPIOB->CRL&=~GPIO_CRL_MODE6;  // output  mode=10- max speed 2mhz
	GPIOB->CRL|=GPIO_CRL_MODE6_1;
	GPIOB->CRL&=~GPIO_CRL_CNF6;     
	GPIOB->CRL|=GPIO_CRL_CNF6_1;  // 10-alter push-pull 10= cnf
	
//    // TX-PA9  RX-PA10  
//	
//	
//    GPIOA->CRH&= ~(GPIO_CRH_MODE9);
//    GPIOA->CRH|=GPIO_CRH_MODE9_0|GPIO_CRH_MODE9_1;
//    GPIOA->CRH&= ~(GPIO_CRH_CNF9);
//    GPIOA->CRH|= GPIO_CRH_CNF9_0|GPIO_CRH_CNF9_1;
    
	USART1->BRR = (APBCLK+BAUDRATE/2)/BAUDRATE;
	USART1->CR1 |= USART_CR1_RE|USART_CR1_TE;
	//////////////////////////////////////////////////////////////////////////
	// DMA1 4-TX  5-RX
	// DMA1 4-TX   peredscha i priem po 8 bit
	DMA1_Channel4->CPAR = (uint32_t) &(USART1->DR) ;
	DMA1_Channel4->CMAR = (uint32_t) &tx ;
	DMA1_Channel4->CNDTR = 8;
	DMA1_Channel4->CCR = 0;
	DMA1_Channel4->CCR |= DMA_CCR4_MINC | DMA_CCR4_DIR | DMA_CCR4_TCIE ;
//      //  zapuck kanala
//    DMA1_Channel4->CCR |= DMA_CCR4_EN ;
//	  USART1->CR3 |= USART_CR3_DMAT ;
//    USART1->DR = *tx;
//-----------------------------------------------------
//      // po prerivanie dma1
// pered usart1 tx
//void DMA1_Channel4_IRQHandler(void)
//{
//	if( DMA1->ISR & DMA_ISR_TCIF4)
//	{
//    DMA1->IFCR |= DMA_IFCR_CTCIF4;
//    flag_tx=1;
//	}
//}
//---------------------------------------------------
//    // off channel4 dma1 tx
//    DMA1_Channel4->CCR &= ~DMA_CCR4_EN ;
//	  USART1->CR3 &= ~USART_CR3_DMAT ;
	//---------------------------------------------------------------------------
	// DMA 5-RX  
	// Po DMA TCIF flag end peredchi
	DMA1_Channel5->CPAR = (uint32_t) &(USART1->DR) ;
	DMA1_Channel5->CMAR = (uint32_t) &rx ;
	DMA1_Channel5->CNDTR = 8;
	DMA1_Channel5->CCR = 0;
	DMA1_Channel5->CCR |= DMA_CCR4_MINC|DMA_CCR5_TCIE ;
	//   zapusk kanala
	//-----------------------------------------------------------
    	// on channel5 dma rx
	//	DMA1_Channel5->CCR |= DMA_CCR5_EN ;
	//  USART1->CR3 |= USART_CR3_DMAR ;
	//------------------------------------------------------
	// prerivanie po priemy  DMA1_Channel5->CNDTR = 8;  8 bit
	// priem usart1 rx
	//void DMA1_Channel5_IRQHandler(void)
	//{
	//	if( DMA1->ISR & DMA_ISR_TCIF5)
	//	{
	//    DMA1->IFCR |= DMA_IFCR_CTCIF5;
	//    flag_rx=1;
	//	}
	//}
	//-------------------------------------------------------
        	// off channel5 dma rx
	//    	DMA1_Channel5->CCR &= ~DMA_CCR5_EN ;
	//    	USART1->CR3 &= ~USART_CR3_DMAR ;
	
	
	NVIC_SetPriority(DMA1_Channel4_IRQn ,0);
	NVIC_EnableIRQ(DMA1_Channel4_IRQn);
	
	NVIC_SetPriority(DMA1_Channel5_IRQn ,0);
	NVIC_EnableIRQ(DMA1_Channel5_IRQn);
	
	USART1->CR1 |= USART_CR1_UE ;
}

64

Всем привет!

очередной дурацкий вопрос, теперь правда про uart

Есть у меня устройство, оно шлет некоторые данные по юсб на виртуальный ком порт на ПК. все нормально. Решил я параллельно добавить отправку по блютусу и подключил модуль HC-05 к свободному UART'у. Тоже вроде все нормально.

Но прошивка одна для обоих вариантов устройства ( с блютусом и без.

Но версии без блютуса, я постоянно попадаю в Infinite_Loop . Судя по стеку попадаю туда из ожидание флага TXE ( ну или TC)  uart'а .  Честно говоря пока не совсем понимаю как обойти этот момент. Можно конечно иметь две прошивки, но мне кажется это не совсем правильно. Ткните носом , куда копать...

65

Я бы ДМА использовал. Или используй условную компиляцию.

Отредактировано MasterElectric (2018-05-20 20:52:54)

66

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

Просто мне кажется что что-то я не так делаю или не понимаю... Вот например чем отличается TC от TXE.  TXE это флаг того что сдвиговый регистр пуст и можно в DR загрузить новое значение.  TC это что данные отправлены.  Вот непонятно почему TXE у меня не срабатывает  и на основании чего должен срабатывать TC ?

67

TXE - показывает что данные из DR переданы в сдвиговый регистр и можно записывать новое значение в DR, в то время как данные из сдвигового регистра ещё передаются.
TC же показывает что данные из сдвигового регистра уже переданы.
Наглядно посмотреть когда устанавливаются и сбрасываются эти флаги можно на диаграммах в референсе.

Отредактировано sobs (2018-05-20 22:19:43)

68

sobs написал(а):

TXE - показывает что данные из DR переданы в сдвиговый регистр и можно записывать новое значение в DR, в то время как данные из сдвигового регистра ещё передаются.
TC же показывает что данные из сдвигового регистра уже переданы.
Наглядно посмотреть когда устанавливаются и сбрасываются эти флаги можно на диаграммах в референсе.

Отредактировано sobs (Сегодня 22:19:43)

ну если к юарту ничего не подключено, то почему флаги не срабатывают ?

69

Надо код видеть, иначе это гадание)

70

Итересный момент, вот такой код (F030):

Код:
  RS485_RXTX_SET;
  USART1->CR1 |= USART_CR1_TE;
  USART1->CR3 |= USART_CR3_DMAT;

после разрешения и первой отправкой происходит задержка равная 1 байту, это описано в RM. В итоге перестал запрещать передатчик, работает всегда. (про возможность управления драйвером я знаю, плата от stm32f100)

71

Парни, не могу разобраться, что я делаю не так. В CooCox-е, (закомментированный код) все получается, отправить и принять байт. А в Atollic TrueStudio нет. Отправляется не то что я хочу отправить.

Код:
void USART_default_set()
{
	USART1 -> CR1 &= ~(USART_CR1_M1 | USART_CR1_M0);// 1 Start bit, 8 data bits, n stop bits
	USART1 -> CR1 |= USART_CR1_TE | USART_CR1_RE;
	USART1 -> CR2 &= ~(USART_CR2_STOP1 | USART_CR2_STOP0);
	USART1 -> BRR = 0x09c4;
	USART1 -> CR1 &= ~USART_CR1_PCE;
	USART1 -> CR1 |= USART_CR1_UE;
}
/*void USART_init_struct(int usart_num)
{
	USART_InitTypeDef usart;
	usart.USART_BaudRate = 9600;
	usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	usart.USART_Parity = USART_Parity_No;
	usart.USART_StopBits = USART_StopBits_1;
	usart.USART_WordLength = USART_WordLength_8b;*/

И я так и не понял как получается это значение

APBCLK 48000000UL

Поясните пожалуйста.

Отредактировано valik (2019-09-03 23:10:33)

72

valik написал(а):

И я так и не понял как получается это значение

дефайном, частота шины APB

по остальному не совсем ясно.
в первом варианте ты просто в регистры пишешь.
в нижнем ты создал структуру, заполнил, но самой инициализации нет. (это в коде spl)

Отредактировано Atomic-dm (2019-09-04 10:36:00)

73

В STM32F0x все очень просто. Посмотри на схему тактирования: для задания требуемой скорости, в UARTx->BRR нужно закинуть число тактов шины APB на 1 бод. Если APB настроена на 48МГц, то пишем 48000000/freq, если же она имеет другую скорость, нужно соответствующим образом числитель изменить.
P.S. Не нужно использовать magick numbers! Напиши лучше

Код:
USART1->BRR = 48000000 / 115200;

что прекрасно читается и понимается, нежели USART1->BRR = 416 — и поди догадайся с первого прочтения, нафига там 416! (А уж запись в 16-м формате, вроде твоих 0x09c4, вообще с толку сбивает!)

74

Atomic-dm написал(а):

дефайном, частота шины APB

Это мне понятно. Непонятно вот что если:
http://s5.uploads.ru/t/67Cfd.jpg
и
http://s3.uploads.ru/t/CJpxf.jpg
то частота 8000000. Или я ошибаюсь? Но что меня вообще в ступор вводит, это то что второй вариант, там где я заполнял структуру, то же получается 48000000. Ни чего не настраивал, все по умолчанию!

в первом варианте ты просто в регистры пишешь.

Это вариант в Атолик.
Вот результат:
http://sg.uploads.ru/t/DAPW8.jpg
и
http://sd.uploads.ru/t/OCiEf.png
А вот второй вариант в Кокосе все нормально.
Поэтому я и привел два варианта кода. К слову, структура проинициализирована. Просто я хочу понять, что не так я прописал в регистры в Атолик, а в Кокосе все так? Типа найди отличия, этот момент мне не понятен. В чем разница? Понятно что что-то упустил, а что не понятно.

P.S. Не нужно использовать magick numbers! Напиши лучше

Код:
USART1->BRR = 48000000 / 115200;

Так и было. Просто было подозрение что неправильно записал число в BRR, вот и взял отсюда этот magick number чтоб проверить. Так в этом виде сюда и попало.

75

Есть измеренное напряжение. Как мне это число передать. Скорее как мне число конвертировать в строку?

76

С тактированием разобрался, спасибо.

77

valik написал(а):

Есть измеренное напряжение. Как мне это число передать. Скорее как мне число конвертировать в строку?

И с этим разобрался. Осталось с указателем разобраться. Когда применяю указатель в инфинит луп уходит, почему то.

Отредактировано valik (2019-09-05 16:36:30)

78

Видимо, разыменовываешь неправильный указатель.

79

советую читать Кернигана перед сном. я вот так давно делаю :) (говорю без иронии)

80

Atomic-dm написал(а):

перед сном

Вот только для этого оно и годится, писатель из Кернигана никакой )

Самая прикольная книжка про С - https://b-ok.cc/book/1304662/d3a89c
http://s9.uploads.ru/rdHpg.png

81

да сейчас по любому вопросу с Си в гугле можно все найти,темы обжеваны на сто раз.

82

vt написал(а):

Вот только для этого оно и годится, писатель из Кернигана никакой )
Самая прикольная книжка про С - https://b-ok.cc/book/1304662/d3a89c


спасибо за наводку, куплю , почитаю.
но на счет Кернигана не согласен. по крайней мере на любой вопрос, который у меня возникал, я находил там ответ. Поэтому мне в принципе нравится. Есть у меня и другие книги, но они скорее так - на всякий случай.

CERGEI написал(а):

да сейчас по любому вопросу с Си в гугле можно все найти,темы обжеваны на сто раз.

в этом и штука , что по сто раз и зачастую найти в книги толковое описание быстрее чем в интернете. Хотя не спорю, если книги нет, то конечно все можно найти в интернете. Но опять же - я люблю перед сном почитать обычную книгу.

83

Видимо, разыменовываешь неправильный указатель.

По подробнее, если не затруднит. Пробовал по книге Кернигана, не получается.

Atomic-dm написал(а):

советую читать Кернигана перед сном. я вот так давно делаю  (говорю без иронии)

Читаю перед сном, на работе, по пути на работу если еду в автобусе, книга на телефоне и на компе (тоже без иронии). Да, много тем в интернете, вроде все понятно, а ничего не получается. Пока, не получается...

84

Можно показать где не получается? Как ты это делаешь?
Я проще делал: создавал структуру, привязывал указатель и потом с помощью -> работаешь с указателем или напрямую к структуре через точку.

85

valik написал(а):

вроде все понятно, а ничего не получается

valik , значит не надо инет и Кернигана читать )
Если кульная книжка Гриффитсов не понравится [у неё кстати и перевод есть], то есть ещё книжка Перри "Программирование на С для начинающих"
Ну и начинать программировать лучше на компе, а не на мк

86

K&R — классная книжка, конечно, но сильно устаревшая. Сейчас нет смысла изучать С древней хотя бы С11!
Вот это можно поискать в интернете, скачать и почитать.

87

Изучать ради того чтобы изучать вообще нет смысла, есть смысл изучать чтобы что-то делать
"Ставьте перед собой реальные цели" ) https://www.youtube.com/watch?v=WBsmSRvT_tY

88

vt написал(а):

Изучать ради того чтобы изучать вообще нет смысла, есть смысл изучать чтобы что-то делать
"Ставьте перед собой реальные цели" ) https://www.youtube.com/watch?v=WBsmSRvT_tY


Практика без теории, это все равно что в биться головой о стену, по моему это очевидно. ... "Теория без практики мертва и бесплодна, а практика без теории бесполезна и пагубна» сказал в 19 веке великий русский математик и механик Пафнутий Львович Чебышев.
Все делается для достижения определенной цели и во всем нужна золотая середина,как знать теорию и делать на практике.

89

Кстати, если не ставить точки над ë, то лучше Чебышëва через "о" писать (Чебышов), иначе потом появляются товарищи, которые его фамилию через "е" произносят...
Это примерно как комплéксные числа: ударение ставить перестали, и начал народ его не туда...

90

CERGEI написал(а):

Все делается для достижения определенной цели

И я о том же, но адекватными цели средствами
Иначе получается высокое искусство на кафедре бубна ) https://www.youtube.com/watch?v=j1X-vT3cWiQ


Вы здесь » Микроконтроллеры » STM32 » UART