Перейти к содержанию
    

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

поставили задачу необходимо задействовать ногу 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 ,тогда не работает. В чем может быть причина?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сначало я должен ногу 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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот это для вашей задачи не подходит? (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 и сами байты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

...

И стало ...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...