csm7 0 5 ноября, 2018 Опубликовано 5 ноября, 2018 (изменено) · Жалоба Добрый день форумчане Работаю в CoIDE Пытаюсь передать данные по USARTX Пока ничего не получается в чем проблема #include "misc.h" #include "stm32l_Init.h" #include "stm32l1xx_rcc.h" #include "stm32l1xx_gpio.h" #include "stm32l1xx_usart.h" void RCC_Configuration(){ RCC_HSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); RCC_MSIRangeConfig(RCC_MSIRange_6); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE); /* My Reset USART1, USART3 */ USART_DeInit(USART1); USART_DeInit(USART3); /* My Enable clocks USART3 PB10 -> USART3_TX, PB11 -> USART3_RX */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* Enable PWR, USART3 mngt clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_USART3, ENABLE);//RCC_APB1Periph_COMP | /* Enable ADC & SYSCFG clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG , ENABLE); } void Alt_GPIO_Init(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin){ /* Initialize Leds mounted on STM32L1-DISCOVERY board */ GPIO_InitTypeDef GPIO_InitStructure; /* GPIOB Periph clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); /* Configure Port in output pushpull mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOx, &GPIO_InitStructure); } /****************----------------------------------------------------*******************/ void Alt_UsartInit(USART_TypeDef* USARTx, GPIO_TypeDef* GPIOx, uint32_t GPIO_Pins, uint32_t BaudRate) { /* Конфигурируем порты PB10 - TX, PA11- RX как альтернативную функцию для USART3 */ USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART3 Rx (PB10 PB11) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pins; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOx, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); /* Настраиваем USARTx */ USART_InitStructure.USART_BaudRate = BaudRate; 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; /* Включаем USARTx */ USART_Init(USARTx, &USART_InitStructure); /* Включаем USARTx */ USART_Cmd(USARTx, ENABLE); } #include "stm32l1xx.h" #include "stm32l1xx_rcc.h" #include "stm32l1xx_gpio.h" #include "stm32l1xx_usart.h" #include "stm32l_Init.h" /* Private define ------------------------------------------------------------*/ #define LD_GREEN_GPIO_PIN GPIO_Pin_7 #define LD_BLUE_GPIO_PIN GPIO_Pin_6 /* Private functions ---------------------------------------------------------*/ void Delay(__IO uint32_t nCount); int main(void) { RCC_Configuration(); Alt_GPIO_Init(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN); Alt_UsartInit(USART3, GPIOB, GPIO_Pin_10 | GPIO_Pin_11, 9600); while(1) { GPIO_SetBits(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN); Delay(10000); GPIO_ResetBits(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN); Delay(10000); USART_SendData(USART3, 's'); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);// } return 0; } Ожидает выход со строки while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);// Изменено 5 ноября, 2018 пользователем csm7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 5 ноября, 2018 Опубликовано 5 ноября, 2018 · Жалоба Где-то ошибка: 24 minutes ago, csm7 said: Пытаюсь передать данные по USART1 А передаете байт в USART3 24 minutes ago, csm7 said: USART_SendData(USART3, 's'); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
csm7 0 5 ноября, 2018 Опубликовано 5 ноября, 2018 · Жалоба Я пробовал и в USART1 и в USART3 передавать Ничего нет на выходе точнее не могу выйти со строки while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба Советы: - указывать название чипа. То, что это STM32L1xx, местные ясновидящие уже в курсе, но хотелось бы видеть это явно. - указывать содержимое регистров. Благо у усарта их 3 штуки для управления, 1 для прескалера и 1 статусный. - у SPL (как, впрочем, и у HAL) есть неприятная особенность. В языке си простое объявление структуры не гарантирует того, что поля её будут осмысленно инициализированы (более того, гарантирует, что это НЕ произойдёт, и там будет мусор). И если пользователь а) не заполнил вручную все поля и б) отключил отладочный макрос assert_param(), эта фигня обязательно стрельнет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба Попробуйте инициализировать так: typedef struct { GPIO_TypeDef *GPIO; unsigned short int Pin; unsigned short int PinSource; }TGPIOBind; static void HW_ConsoleInit(void) { TGPIOBind GPIO_UART_RX = {GPIOB, GPIO_Pin_11, 11}; TGPIOBind GPIO_UART_TX = {GPIOB, GPIO_Pin_10, 10}; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); GPIO_PinAFConfig(GPIO_UART_RX.GPIO, GPIO_UART_RX.PinSource, GPIO_AF_USART3); GPIO_PinAFConfig(GPIO_UART_TX.GPIO, GPIO_UART_TX.PinSource, GPIO_AF_USART3); GPIO_InitTypeDef GPIO_Configure; GPIO_Configure.GPIO_Mode = GPIO_Mode_AF; GPIO_Configure.GPIO_OType = GPIO_OType_PP; GPIO_Configure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Configure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Configure.GPIO_Pin = GPIO_UART_RX.Pin; GPIO_Init(GPIO_UART_RX.GPIO, &GPIO_Configure); GPIO_Configure.GPIO_Pin = GPIO_UART_TX.Pin; GPIO_Init(GPIO_UART_TX.GPIO, &GPIO_Configure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); USART_InitTypeDef UART_Configure; UART_Configure.USART_BaudRate = 9600; UART_Configure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; UART_Configure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; UART_Configure.USART_Parity = USART_Parity_No; UART_Configure.USART_StopBits = USART_StopBits_1; UART_Configure.USART_WordLength = USART_WordLength_8b; USART_Init(USART3, &UART_Configure); USART_Cmd(USART3, ENABLE); return; } Если все хорошо - смотрите, в чем различие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
csm7 0 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба Спасибо попробую Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 62 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба 22 часа назад, csm7 сказал: Ожидает выход со строки while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);// У вас не работает передатчик UART - либо он выключен, либо не поступает частота. В отладчике проверить правильность выставленных битов регистров UART. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
csm7 0 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба Не помогло Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 6 ноября, 2018 Опубликовано 6 ноября, 2018 (изменено) · Жалоба Just now, csm7 said: Не помогло Отладчик что говорит? Регистры какие? Регистры включения периферийных частот (тот, где установился флаг RCC_APB1Periph_USART3) в итоге правильный? SPL под этот камень? Кстати, добавьте включение AFIO перед настройкой альтернативных функций GPIO: static void HW_ConsoleInit(void) { TGPIOBind GPIO_UART_RX = {GPIOB, GPIO_Pin_11, 11}; TGPIOBind GPIO_UART_TX = {GPIOB, GPIO_Pin_10, 10}; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); ... } В младших контроллерах совершенно идиотская система переназначения GPIO, в ней AFIO сделан отдельной субстанцией. В старших такого барахла, к счастью, нет. Изменено 6 ноября, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба 2 hours ago, Arlleex said: В старших такого барахла, к счастью, нет. В stm32l1xx тоже нет AFIO IMXO, в коде ничего криминального нет. UART3 настроен, клоки включены, пины настроены, клоки пинов включены. Но висеть здесь while(USART_GetFlagStatus(USART3, USART_FLAG_TXE), как было сказано выше, может в случае если не включен сам уарт(но в коде есть USART_Cmd(USARTx, ENABLE);) либо если переферия не тактируется(но в коде есть RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_USART3, ENABLE);). Тому может быть несколько обьяснений: 1. Приведенный для нас код, отличается от вашего 2. SPL библиотеки были модифицированны и не выполняют соответствующие функции 3. Вроде бы такого нет в CoCoox, но возможно, Вы отлаживаетесь на каком-то симуляторе 4. Ошибочное определение места проблемы while(USART_GetFlagStatus(USART3, USART_FLAG_TXE), возможно, из-за использования оптимизации Вы видите не корректное соответствие кода. Оптимизация включена? 5. Системная проблема с клоками или питанием если это конечно кастомная плата, а не дискавери. 6. Или последнее, моя не внимательность, и в коде реально есть проблема :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
csm7 0 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба Код идентичен По вопросу библиотек не уверен но я туда не лазил Отлаживаю в CoIDE Оптимизацию отключил Плата stm32l-Discovery Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба Если отладка, то может быть вы смотрите на UART3->DR? Тогда отладчик этим чтением сбрасывает флаги. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба 6 minutes ago, AHTOXA said: Тогда отладчик этим чтением сбрасывает флаги. TXE таким образом испортить не получится :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 4 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба On 11/5/2018 at 1:22 PM, csm7 said: Добрый день форумчане Работаю в CoIDE Пытаюсь передать данные по USARTX Пока ничего не получается в чем проблема У Вас знаков препинания на клавиатуре нет? Или в школе не проходили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 6 ноября, 2018 Опубликовано 6 ноября, 2018 · Жалоба Если есть возможность, скиньте сюда скрин значений регистров после инициализации для следующих модулей: 1) GPIOB; 2) RCC->APB1ENR; 3) USART3. Кстати: на отладочной плате выводы PB10 и PB11 подключены к дисплею. Не могут ли влиять и тянуть ноги МК вниз? Потому как, могу предположить, что контроллер, видя, что ножка Tx внизу, думает, что передача не закончена... Попробуйте с другими ножками (они для USART3 на других GPIO тоже доступны). На край - другой модуль USART. Чудес не бывает, все-таки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться