2015-01-16 9 views
0

Я только что начал свои приключения с помощью платы 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

Желаю, чтобы я был Раньше я нашел это где-то в документации.

Надеется, что это помогает кому-то и спасибо всем за вашей помощь

+0

Вы пробовали все возможные скорости на ПК, чтобы узнать, можете ли вы найти какой бы то ни было уровень скорости, на котором он работает? Получение мусора, а не ничего, по крайней мере предполагает, что это работает. – Notlikethat

+0

@Notlikethat: Я не пытался чередовать скорости. Поскольку я установил все это для работы на 9600, и поэтому хотел бы понять первопричину этого не работает – erPe

+0

@artlessnoise: У меня есть логический анализатор уровня, однако полученные данные не имеют никакого смысла. Когда, например, я хочу отправить десятичную цифру 45, которая является ASCII «0»?!Я получаю 254 на Logic Analyzer (установлен в бод rrate 9600) Также я использовал несколько и надежных преобразователей RS232, так что это определенно не проблема – erPe

ответ

1

USART1 на этой плате (штырек TX) имеет конденсатор, который сталкивается с трафиком. Это указано на ST forums.

0

мусора на терминал часто возникают, когда отправитель имеет другую скорость передачи данных, чем приемник.

+0

Я убедился, что мой терминал на ПК работает в точно таких же настройках, как UART при обнаружении (8 бит данных/1 бит стоп/отсутствие контроля четности/без контроля потока) – erPe