man1 0 26 сентября, 2012 Опубликовано 26 сентября, 2012 · Жалоба поставили задачу необходимо задействовать ногу 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 ,тогда не работает. В чем может быть причина? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 26 сентября, 2012 Опубликовано 26 сентября, 2012 · Жалоба Как именно не работает-то? Пин не дрыгается? Уарт не уартит? По коду - переинициализация, включение-выключение UART - лишние. Или хотя бы сначала перенастраивайте пин, потом включайте UART. Иначе, в теории, можно глитч словить: пин переключается на UART, а тот выключен - имеем низкий уровень на выходе, UART включается - уровень становится высокми. PS процессор указывайте точнее, у вас видимо stm32f1xx? Просто в stm32f2, f4, l1 - настройка пинов выполняется по другому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
man1 0 26 сентября, 2012 Опубликовано 26 сентября, 2012 · Жалоба Пин работает , а UART нет. Процессор STM32f100 на плате Discovery. Уберу Enable Disable попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
YAM 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба На таких скоростях я бы вообще не парился с переключениями, а просто бы настроил любой таймер на 104uS и всю работу по передаче делал в прерывании от него. Как-то пришлось делать передачу на 115200, т.к. UART1 был подключен на PB6, а понадобылось выводить еще и отладку на PA9 (STM32F103C8T6)... Все прекрасно работает. p.s. упсь, не заметил что у Вас скорость 250 килобит... Но и 4 uS не предел... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба Сначало я должен ногу 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба Проблема в том что не хочет работать, по отдельности все работает GPIO, UART, а когда приходится переконфигурировать ногу PA9 , то на GPIO , то на UART ,тогда не работает. В чем может быть причина? A LCKR регистры в GPIO вы не трогаете, когда настраиваете процессор? После Lock порт перенастраиваться не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
man1 0 28 сентября, 2012 Опубликовано 28 сентября, 2012 · Жалоба А вот это для вашей задачи не подходит? (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 и сами байты Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 сентября, 2012 Опубликовано 29 сентября, 2012 · Жалоба Заработало я убрал запрет и разрешение UART ... И стало ... Привет библиотеке! Проще в битах управляющих регистров разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться