реклама на сайте
подробности

 
 
> проблема с UART в STM32
man1
сообщение Sep 26 2012, 17:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 11-01-08
Пользователь №: 34 008



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

CODE
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

CODE
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 ,тогда не работает. В чем может быть причина?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
M_Andrey
сообщение Sep 27 2012, 08:49
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376



Цитата(man1 @ Sep 26 2012, 21:31) *
Сначало я должен ногу 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


Go to the top of the page
 
+Quote Post
man1
сообщение Sep 28 2012, 09:16
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 11-01-08
Пользователь №: 34 008



Цитата(M_Andrey @ Sep 27 2012, 12:49) *
А вот это для вашей задачи не подходит? (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 и сами байты
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01415 секунд с 7
ELECTRONIX ©2004-2016