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

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

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


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


STM32 UART

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

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)


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