Я только что начал свои приключения с помощью платы STM32f407 Discovery. Я использую последнюю стабильную версию CoIDE и использую современные инструментальные средства/библиотеки.STM32F407 UART дает мусор на терминале
мне удалось написать следующий код, чтобы использовать USART1 с доски
int main(void){
GPIO_InitTypeDef GPIO_InitStructure; // Definicja struktury do inicjalizacji PINOW
USART_InitTypeDef USART_InitStructure;
// Initialize pins as alternating function
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
// Modify USART_InitStructure for non -default values , e.g.
// USART_InitStructure.USART_BaudRate = 38400;
USART_InitStructure.USART_BaudRate = 9600;
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_Tx|USART_Mode_Rx;
USART_Init(USART1 ,&USART_InitStructure);
USART_Cmd(USART1 , ENABLE);
while(1)
{
while (USART_GetFlagStatus(USART1 , USART_FLAG_TXE) == RESET);
USART1 ->DR = (uint16_t)(45 & 0x01FF);
Delay(0x3FFFFF);
}
}
Кроме того, я удостоверился, часы настроены правильно, установив HSE и другие детали часов
#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
А также
/************************* PLL Parameters *************************************/
/* PLL_VCO = (HSE_VALUE or HSI_VALUE/PLL_M) * PLL_N */
#define PLL_M 8
#define PLL_N 336
/* SYSCLK = PLL_VCO/PLL_P */
#define PLL_P 2
/* USB OTG FS, SDIO and RNG Clock = PLL_VCO/PLLQ */
#define PLL_Q 7
/******************************************************************************/
В консоли я просто получить мусор и я сделал следующее, чтобы удостовериться, что настройки правильно: - Проверено USB-RS232 конвертер - переключение между преобразователем и платы STM32 - Switched преобразователь - Сгенерированный код, используя STM32CubeMX для сравнения это и кажется последовательным (логика мудрая конечно :))
с моей точки зрения новичка это своего рода «остановит всю работу» :(Я cannnot, кажется, найти причину этого
Любая помощь будет оценена
ОБНОВЛЕНИЕ 1: Чтобы найти первопричину, я решил попробовать один из других модулей USART. Ниже мой код для USART3, и этот РАБОТАЕТ В КОРОБКЕ, который приведет меня к некорректному инициализации USART1 в первоначальном вопросе?
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
/* Enable UART clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
/* Connect PXx to USARTx_Tx*/
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3);
/* Connect PXx to USARTx_Rx*/
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3);
/* Configure USART Tx as alternate function */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Configure USART Rx as alternate function */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOC, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
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 configuration */
USART_Init(USART3, &USART_InitStructure);
/* Enable USART */
USART_Cmd(USART3, ENABLE);
SysTick_Config(SystemCoreClock/1000);
while(1)
{
for (int var = 45; var < 128; var++)
{
USART_SendData(USART3, var);
Delay_SysTick(500); // 1 sek
}
}
}
Разрешение: После того, как много рытье и пытается несколько вещей кажется, что USART1 будет сталкиваться с компонентами USB и есть конденсатор, который сталкивается с передача link to answer on ST forums
Желаю, чтобы я был Раньше я нашел это где-то в документации.
Надеется, что это помогает кому-то и спасибо всем за вашей помощь
Вы пробовали все возможные скорости на ПК, чтобы узнать, можете ли вы найти какой бы то ни было уровень скорости, на котором он работает? Получение мусора, а не ничего, по крайней мере предполагает, что это работает. – Notlikethat
@Notlikethat: Я не пытался чередовать скорости. Поскольку я установил все это для работы на 9600, и поэтому хотел бы понять первопричину этого не работает – erPe
@artlessnoise: У меня есть логический анализатор уровня, однако полученные данные не имеют никакого смысла. Когда, например, я хочу отправить десятичную цифру 45, которая является ASCII «0»?!Я получаю 254 на Logic Analyzer (установлен в бод rrate 9600) Также я использовал несколько и надежных преобразователей RS232, так что это определенно не проблема – erPe