c - USART接收废话(STM32F0)

标签 c interrupt stm32 baud-rate usart

我有一个从 GPS 模块到 STM32F091 微 Controller 的 USART 通信实现。 出于某种原因,我只收到废话。我已经尝试设置不同的波特率,但没有一个给我正确的结果。

现在我不确定预分频器设置是否有问题或我忘记的其他内容。

相关代码如下:

peripherals.c

/* Clock settings */
void clock_init(void)
{
    /* Enable HSI clock */
    RCC->CR |= RCC_CR_HSION;

    /* Enable clocks on Port A, B, F */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);

    /* Enable USART clocks */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}

/* Select Alternate Port Functions */
void alt_init(void)
{
    /* Port A: USART1 */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

    /* Port B: USART3 */
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_4);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_4);
}

usart.c

USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* Baud rate */
uint32_t bd = 9600;

void usart_init(void)
{

    /* ##################### USART 1 ##################### */
    /* USART GPIO Settings */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* USART Settings */
    USART_InitStructure.USART_BaudRate = bd;
    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);

    /* Enable USART because it's disabled in USART_Init */
    USART_Cmd(USART1, ENABLE);

    /* ##################### USART 2 ##################### */

    /* ##################### USART 3 ##################### */
    /* Disable USART3 in order to use SWAP */
    USART_Cmd(USART3, DISABLE);

    /* Swap TX and RX pins */
    USART3->CR2 |= USART_CR2_SWAP;

    /* Enable USART3 */
    USART_Cmd(USART3, ENABLE);

    /* USART GPIO Settings */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* USART Settings */
    USART_InitStructure.USART_BaudRate = bd;
    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(USART3, &USART_InitStructure);

    /* Enable USART because it's disabled in USART_Init */
    USART_Cmd(USART3, ENABLE);

    /* Enable USART Interrupts */
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART3, USART_IT_TXE, ENABLE);

    /* Enable external interrupts */
    NVIC_InitStructure.NVIC_IRQChannel = USART3_8_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    /* ##################### USART 4 ##################### */

}

stm32f0xx_it.c

#include <main.h>

void USART3_8_IRQHandler(void)
{
    char t[] = "U";
    uint16_t byte = 0;
    if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) != RESET) // Data reception
    {
        byte = USART_ReceiveData(USART3);
        (*pRXD3).Buffer[(*pRXD3).wr] = byte;
        (*pRXD3).wr = ((*pRXD3).wr + 1);

        USART_SendData(USART1, t[0]);

        USART_GetFlagStatus(USART3, USART_IT_ORE);
        USART_ClearITPendingBit(USART3, USART_IT_RXNE);
    }
    return;
}

USART_SendData 位用于与我的 PC 通信,因此我可以查看我是否收到字母 U 或更多废话。

我还直接检查了 USART3 的 DR 寄存器的内容(通过检查我写入其内容的缓冲区),所以我知道 STM32F091 接收(或更确切地说,interperts)我的 GPS 输出错误。

GPS 模块使用默认波特率 9600,我没有更改。

如果有任何其他信息,请告诉我

最佳答案

经过大量查找和大家在评论中的建议,我发现系统时钟设置不正确。 除了“clock_init”中已有的代码之外,还需要以下代码。

peripherals.c

/* Clock settings */
void clock_init(void)
{
    ....

    /* Select System Clock to be HSI */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

    /* Select USART clock source to be System Clock */
    RCC_USARTCLKConfig(RCC_USART1CLK_SYSCLK);
    RCC_USARTCLKConfig(RCC_USART3CLK_SYSCLK);

    ....

}

感谢大家的帮助。

关于c - USART接收废话(STM32F0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49279000/

相关文章:

c - 我可以使用哪种现代 C 编译器来构建这个 1992 MS-DOS 程序?

c - switch 语句即使在 break 之后也执行 case 2

c++ - 中断 arduino 例程以运行基于缓慢延迟的进程

调用信号处理程序但仍然忽略信号 (Posix, C)

stm32 - STM32F411RE 中的环回 SPI

c - DAC信号发生器stm32

embedded - STM32F4xx 上的核心耦合内存可执行文件?

c - C语言中如何去除字符串末尾多次重复的重复字符?

c - Visual Studio : Different Size in Memory for same executable in XP and Windows7

c++ - 线程和上下文切换 C++