求助STM32F4串口通信数据异常

2019-07-20 18:56发布

本帖最后由 归然 于 2016-11-10 10:11 编辑

    初学STM32,用的是正点原子STM32F407的开发板,用STlink下载调试。
    现在的问题是,我仿照教程,写了串口通讯的代码,就是很简单的串口发送接收和接收中断。用串口调试助手看MCU发送的数据一直都有误,搞了两晚都搞不好。
    用开发板视频的工程例程烧入开发板,串口功能正常,接收到的数据都正常。用他的代码复制到我的工程里面,接收数据还是有问题。
    对比过工程的设置,也没看出来有什么差异。

    所以特地上来问一下大家。


[mw_shl_code=c,true]
void uart1_config()
{

        
        GPIO_InitTypeDef uart1_gpio_init;
        USART_InitTypeDef uart1_init;
        NVIC_InitTypeDef uart1_nvic_init;
        

        PFout(10)=0;

        //使能时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        
        //IO口设置成复用
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
        
        //配置IO口
        uart1_gpio_init.GPIO_Mode=GPIO_Mode_AF;
        uart1_gpio_init.GPIO_OType=GPIO_OType_PP;
        uart1_gpio_init.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
        uart1_gpio_init.GPIO_PuPd=GPIO_PuPd_UP;
        uart1_gpio_init.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&uart1_gpio_init);
        
        //配置串口
        uart1_init.USART_BaudRate=115220;
        uart1_init.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        uart1_init.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        uart1_init.USART_Parity=USART_Parity_No;
        uart1_init.USART_StopBits=USART_StopBits_1;
        uart1_init.USART_WordLength=USART_WordLength_8b;
        USART_Init(USART1,&uart1_init);
        
        
        USART_Cmd(USART1,ENABLE);//使能串口1
        
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能接收中断
        
        //配置中断优先级
        uart1_nvic_init.NVIC_IRQChannel=USART1_IRQn;
        uart1_nvic_init.NVIC_IRQChannelCmd=ENABLE;
        uart1_nvic_init.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
        uart1_nvic_init.NVIC_IRQChannelSubPriority=1;//响应优先级
        NVIC_Init(&uart1_nvic_init);
        

        PFout(10)=1;

}

[/mw_shl_code]


[mw_shl_code=c,true]
void USART1_IRQHandler(void)
{
        u8 res;

        if(USART_GetITStatus(USART1,USART_IT_RXNE))
        {
        //USART_ClearFlag(USART1,USART_FLAG_RXNE);
        PFout(10)=0;
        res=USART_ReceiveData(USART1);
        USART_SendData(USART1,res);
        }
                PFout(10)=1;
}


int main(void)
{

        delay_init(168);

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组
        gpio_config();
        uart1_config();
        

        while(1)
        {
        delay_ms(50);
        PFout(9)=1;
        delay_ms(50);
        PFout(9)=0;
  USART_SendData(USART1,1);
        }
}
[/mw_shl_code]

如上面写的,在while语句里面串口发送1,应该接收到的是0x31才对,但我接收到的是0x1C,而发送1给开发板,接收到的也不是0x31。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
小陀螺爱炒蛋
1楼-- · 2019-07-20 19:39
uart1_init.USART_BaudRate=115220;
怎么会有这个波特率?是115200吧~
xuande
2楼-- · 2019-07-20 23:27

同一个串口,主函数中往外发,中断里也忘外发,根本没有协调。
先把while里的发送语句关掉,再看。

归然
3楼-- · 2019-07-21 01:54
 精彩回答 2  元偷偷看……
归然
4楼-- · 2019-07-21 04:30
小陀螺爱炒蛋 发表于 2016-11-10 10:45
uart1_init.USART_BaudRate=115220;
怎么会有这个波特率?是115200吧~

115220这个波特率属于手误,但问题应该不在此。
我一开始设置的波特率是9600,后来改115200,改了几次波特率也一样。把原子哥配置串口的函数复制过来,也是一样出错。
归然
5楼-- · 2019-07-21 05:09
 精彩回答 2  元偷偷看……

一周热门 更多>