407串口通信不正常

2019-07-14 18:53发布

本人电子小白,刚开始学习407串口通信,按照原子哥的串口教程一步一步学习(串口助手发送一个数据,单片机接受到后,再发送回电脑),程序编写没有错误。板子用的是407最小系统办,串口用的是CH340G转TTL 模块,用STLINK下载的。串口助手配置和程序一样,但是下载后实现不了.
USART.C程序
#include "STM32f4xx.h"
#include "USART.H"
#include "LED.H"

void my_uart_init(u16 bound)
{
  GPIO_InitTypeDef   GPIO_InitStruct;
  USART_InitTypeDef  USART_InitStruct;
  NVIC_InitTypeDef   NVIC_InitStruct;

    //外设时钟使能函数。这两个函数在RCC.H头文件中定义了
    RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1,ENABLE );//使能USART1时钟
    RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA,ENABLE );//使能GPIOA时钟

      //复用映射设置。USART1所使用的PA9、PA10进行复用映射
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//USART引脚PA9复用映射
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//USART引脚PA10复用映射

        //GPIOA9,10初始化
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//初始化PA9、PA10
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;//复用模式
        GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;//上拉
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;//速度100MHz
        GPIO_Init(GPIOA,&GPIO_InitStruct);//GPIOA初始化
         

          //USART初始化
          USART_InitStruct.USART_BaudRate=bound;//设置波特率
          USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流控制
          USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//打开发送和接收
          USART_InitStruct.USART_Parity=USART_Parity_No;//无奇偶校验
          USART_InitStruct.USART_StopBits=USART_StopBits_1;//一个停止位
          USART_InitStruct.USART_WordLength=USART_WordLength_8b;//数据宽度为8个字节,如果有奇偶校验要设置为9个字节
          //USART_InitStruct.USART_WordLength=USART_WordLength_9b;//数据宽度为9个字节,有奇偶校验时要用此函数
          USART_Init(USART1,&USART_InitStruct);

            //中断使能
            USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//串口中断使能,串口1、接收非空、使能

              //中断初始化
              //使能中断时,1、需要在主函数中调用中断分组函数"NVIC_PriorityGroupConfig()"
              //            2、编写中断服务函数,调用函数"USARTx_IRQHandler()"
              NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;//在顶层头文件“stm32f4xx”中找相应的通道
              NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
              NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
              NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
              NVIC_Init(&NVIC_InitStruct); //初始化中断

                //USART串口使能
                USART_Cmd(USART1,ENABLE);
              }


//中断服务函数,在启动文件中
void USARTx_IRQHandler(void)
{
  if(USART_GetITStatus(USART1,USART_IT_RXNE))
  {
                   u8 RES;                         //定义串口数据变量
      RES=USART_ReceiveData(USART1);//从串口接收数据
      USART_SendData(USART1,RES);   //把从串口接收到的数据发送出去
  }

}
USART.H程序



#ifndef __USART_H
#define __USART_H
#include "stdio.h"        
#include "stm32f4xx_conf.h"
#include "sys.h"

extern u16 bound;
extern void my_uart_init(u16 bound);
#endif


main.c程序
#include "stm32f4xx.h"
#include "USART.H"
#include "delay.h"

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组,此函数在“misc.h"中
        my_uart_init(115200);
}


KEIL该配置的都配置了,请各位大神帮帮忙,找一下问题,谢谢!!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
lijian123456a
1楼-- · 2019-07-15 04:26
各位大神帮帮忙吧,都好几天了
勇哥-lzu
2楼-- · 2019-07-15 05:16
先初始化系统时钟试试
lijian123456a
3楼-- · 2019-07-15 06:29
已经解决了  U8 RES变量声明放错位置了,主程序忘记了写while(1)循环
灬今何在灬
4楼-- · 2019-07-15 12:14
lee_st 发表于 2018-4-7 21:43
初始化里面没有加系统时钟的初始化

先运行初始化函数才会运行MAIN  看看启动文件,他加载了官方文件的初始化了。

一周热门 更多>