Pitonbl4 0 20 декабря, 2014 Опубликовано 20 декабря, 2014 · Жалоба Всем доброго времени суток! Столкнулся с такой проблемой. Запускаю UART, передаю биты, но увы и ах.. Комп принимает биты, но какие-то другие. Не могу понять в чем дело. Код по инициализации и передаче символа, прикрепил. При передаче символа H получаю 88, при передаче 0xAA, получаю 0x6A. При передаче 0xFF получаю 0xFF (но там то тупо все нули, поэтому очевидно, что должны были прийти все эти нули). P.S. При работе stm32 L0 избавиться ерунды помог system_clock_config, который просто взял из примера. P.S. МК stm32 f401C #include "stm32f4xx_hal.h" void INIT_GPIO(void); void INIT_UART(void); void SEND_DATA_UART(uint8_t data); GPIO_InitTypeDef GPIO; UART_HandleTypeDef UART; int main() { HAL_Init(); INIT_GPIO(); INIT_UART(); while(1) { // Проверка UART SEND_DATA_UART('H'); } } void INIT_GPIO() { __GPIOB_CLK_ENABLE(); //UART GPIO.Pin = (GPIO_PIN_6) | (GPIO_PIN_7); GPIO.Mode = GPIO_MODE_AF_PP; GPIO.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOB, &GPIO); } void INIT_UART() { __USART1_CLK_ENABLE(); UART.Instance = USART1; UART.Init.Mode = UART_MODE_TX_RX; UART.Init.BaudRate = 9600; UART.Init.WordLength = UART_WORDLENGTH_8B; UART.Init.Parity = UART_PARITY_NONE; UART.Init.StopBits = USART_STOPBITS_1; HAL_UART_Init(&UART); } //Функция отправляющая байт в UART void SEND_DATA_UART(uint8_t data) { //Если TC=1, то передача завершена и можно опять что-то записывать в регистр данных USART_DR while(!(USART1->SR & USART_SR_TC)); //Отсылаем байт через UART USART1->DR = data; } Изначально инициализировал ножки так: void INIT_GPIO() { __GPIOA_CLK_ENABLE(); //UART GPIO.Pin = (GPIO_PIN_9) | (GPIO_PIN_10); GPIO.Mode = GPIO_MODE_AF_PP; GPIO.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO); } Но там на осциллографе увидел, что фронты имеют вид, как-будто бы к этим пинам подключили конденсатор. Залез в схематику, действительно так и есть. Спрашивается зачем там емкость? Что разработчики туда закладывали? P.S. Советы типа поменяйте baudrate не катят. Т.к. уже перепробовал всевозможные(адекватные) настройки (не только baudrate). MCU_Datasheet.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
seniorandre 0 20 декабря, 2014 Опубликовано 20 декабря, 2014 · Жалоба При передаче символа H получаю 88, при передаче 0xAA, получаю 0x6A. При передаче 0xFF получаю 0xFF (но там то тупо все нули, поэтому очевидно, что должны были прийти все эти нули). Когда принимается по USART не то, то это скорее всего проблема настройки тактирования, но у Вас вроде библиотека HAL, и если вы генерили тактирование в CubeMx, то ошибиться трудно. Чем генерили код настройки тактирования и где он? Ну и соотв что за чип, кварц и т.п.? Я когда веселился с этим смотрел осцилом с анализатором USART, поэтому быстро понял что ядро не на той частоте работает. Вам в качестве теста можно вывести на какой нибудь вывод тактирование или сигнал с таймера и проверить частоту. Успехов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pitonbl4 0 21 декабря, 2014 Опубликовано 21 декабря, 2014 (изменено) · Жалоба Чем генерили код настройки тактирования и где он? Все это настраивается в проекте IAR. Я настроил на 84 МГц. (В datasheet, вроде написано, что он на 84МГц). Ну и соотв что за чип, кварц и т.п.? Из datasheet: 1) STM32F401VCT6 microcontroller featuring 256 KB of Flash memory, 64 KB of RAM in an LQFP100 package 2) Вроде там 84 МГц 3) System_Clock_Config с помощью PLL работает от 8МГц кварца. Вот код для /** * @brief System Clock Configuration * The system Clock is configured as follow : * System Clock source = PLL (HSE) * SYSCLK(Hz) = 84000000 * HCLK(Hz) = 84000000 * AHB Prescaler = 1 * APB1 Prescaler = 2 * APB2 Prescaler = 1 * HSE Frequency(Hz) = 8000000 * PLL_M = 8 * PLL_N = 336 * PLL_P = 4 * PLL_Q = 7 * VDD(V) = 3.3 * Main regulator output voltage = Scale2 mode * Flash Latency(WS) = 2 * @param None * @retval None */ static void SystemClock_Config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; /* Enable Power Control clock */ __PWR_CLK_ENABLE(); /* The voltage scaling allows optimizing the power consumption when the device is clocked below the maximum system frequency, to update the voltage scaling value regarding system frequency refer to product datasheet. */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); /* Enable HSE Oscillator and activate PLL with HSE as source */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 7; if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } Изменено 21 декабря, 2014 пользователем shtunder Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
seniorandre 0 21 декабря, 2014 Опубликовано 21 декабря, 2014 · Жалоба Осталось теперь убедиться что этот код вызывается, т.к. иногда инициализация клока вызывается из startup.c, иногда надо явно вызвать в main. C IAR не работал, не могу сказать, все от реализации начальной загрузки зависит. Самый простой путь это поставить точку останова в нем и убедиться что он все таки отрабатывает. А так вроде все правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться