Jump to content

    
Sign in to follow this  
man1

проблема с UART в STM32

Recommended Posts

поставили задачу необходимо задействовать ногу PA9, (на ней висит TX USART1) в двух вариантах, это обычный GPIO сконфигурированный на выход и выход UART. Сначало я должен ногу PA9 опустить в низкий уровень на 200us, потом поднять до единицы на 100us, а дальше посылать через TX данные по USART, и это все в цикле. По отдельности у меня все работает нога управляется , по UART передается, но когда пытаюсь совместить , т.е. сначало нога сконфигурирована как GPIO, а потом как UART, то не работает. Вот инициализация UART вызывается один раз перед вызовом процедуры arraysend();

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);

// TX: выход push-pull //
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
gpio.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOA, &gpio);

// RX: высокоимпендансный вход 
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpio.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &gpio);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitTypeDef USART_InitStructure;
// Параметры по умолчанию: 9600 бод, 8 бит данных, 1 стоп-бит 
//---------------------------------------
         USART_InitStructure.USART_BaudRate            = 250000;
         USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
         USART_InitStructure.USART_StopBits            = USART_StopBits_1;
         USART_InitStructure.USART_Parity              = USART_Parity_No ;
         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
         USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;

//----------------------------------------
USART_Init(USART1, &USART_InitStructure);
         USART_Cmd(USART1, ENABLE);

 

Теперь процедура которая вызывается переодически в цикле сначало дрыгает ногой потом шлет 50 байт по UART

 

void arraysend (void) 
{//0
unsigned int i,d;
unsigned char startcode;
//unsigned char temp;
 GPIO_InitTypeDef gpio;
 USART_InitTypeDef USART_InitStructure;

amount_channels=50;
startcode=0;
//-----запретил UART----------
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, DISABLE);    
// дрыгаю ногой PA9 перед посылкой по UART  
//----Cконфигурировал пин PA9 как GPIO------------------ 
 gpio.GPIO_Pin =  (GPIO_Pin_9 );// LED
 gpio.GPIO_Speed = GPIO_Speed_50MHz;
 gpio.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_Init( GPIOA, &gpio);
 GPIO_ResetBits( GPIOA, GPIO_Pin_9);  
delay(4);  //низкий уровень 200us

GPIO_SetBits( GPIOA, GPIO_Pin_9);  
delay(1);  //высокий уровень 100us
//---------------------------------------------

// переконфигурировал ногу на посылку по UART
// TX: выход push-pull //
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
gpio.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOA, &gpio);
//--------------Разрешил UART------------------------
USART_Init(USART1, &USART_InitStructure);
         USART_Cmd(USART1, ENABLE);
//----------------------------------------------
// -----------Сама посылка по UART------------------

putchar_UART1(startcode);

for (i=0; i<amount_channels; i++) //+2 becouse +curtime, +curwait
    {//2
      putchar_UART1(DATA_BUFFER_SEND[i]);
    }//2

}//end regime 1

 

Проблема в том что не хочет работать, по отдельности все работает GPIO, UART, а когда приходится переконфигурировать ногу PA9 , то на GPIO , то на UART ,тогда не работает. В чем может быть причина?

Share this post


Link to post
Share on other sites

Как именно не работает-то? Пин не дрыгается? Уарт не уартит?

По коду - переинициализация, включение-выключение UART - лишние. Или хотя бы сначала перенастраивайте пин, потом включайте UART. Иначе, в теории, можно глитч словить: пин переключается на UART, а тот выключен - имеем низкий уровень на выходе, UART включается - уровень становится высокми.

PS процессор указывайте точнее, у вас видимо stm32f1xx? Просто в stm32f2, f4, l1 - настройка пинов выполняется по другому.

Share this post


Link to post
Share on other sites

На таких скоростях я бы вообще не парился с переключениями, а просто бы настроил любой таймер на 104uS и всю работу по передаче делал в прерывании от него.

Как-то пришлось делать передачу на 115200, т.к. UART1 был подключен на PB6, а понадобылось выводить еще и отладку на PA9 (STM32F103C8T6)...

Все прекрасно работает.

 

p.s. упсь, не заметил что у Вас скорость 250 килобит... Но и 4 uS не предел... :)

Share this post


Link to post
Share on other sites
Сначало я должен ногу PA9 опустить в низкий уровень на 200us, потом поднять до единицы на 100us, а дальше посылать через TX данные по USART

А вот это для вашей задачи не подходит? (RM0008_STM32F10XXX.pdf стр.771)

 

26.6.4 Control register 1 (USART_CR1): Bit 0 SBK: Send break.

 

This bit set is used to send break characters. It can be set and cleared by software. It should be set by software, and will be reset by hardware during the stop bit of break.

 

 

0: No break character is transmitted

1: Break character will be transmitted

 

 

 

Share this post


Link to post
Share on other sites
Проблема в том что не хочет работать, по отдельности все работает GPIO, UART, а когда приходится переконфигурировать ногу PA9 , то на GPIO , то на UART ,тогда не работает. В чем может быть причина?

A LCKR регистры в GPIO вы не трогаете, когда настраиваете процессор? После Lock порт перенастраиваться не будет.

Share this post


Link to post
Share on other sites
А вот это для вашей задачи не подходит? (RM0008_STM32F10XXX.pdf стр.771)

 

26.6.4 Control register 1 (USART_CR1): Bit 0 SBK: Send break.

 

This bit set is used to send break characters. It can be set and cleared by software. It should be set by software, and will be reset by hardware during the stop bit of break.

 

 

0: No break character is transmitted

1: Break character will be transmitted

 

Спасибо по мойму это то что надо, break я пошлю как вы посоветовали, а как быть с высоким уровнем после break?

 

Заработало я убрал запрет и разрешение UART

т.е. эту строку

USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, DISABLE);

и эту

USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);

 

И стало передаваться и break и MaB и сами байты

Share this post


Link to post
Share on other sites
Заработало я убрал запрет и разрешение UART

...

И стало ...

Привет библиотеке! Проще в битах управляющих регистров разобраться.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.

Sign in to follow this