打印
[应用相关]

串口通信问题

[复制链接]
1903|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lewisnx|  楼主 | 2018-6-30 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在学习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该配置的都配置了,请各位大神帮帮忙,找一下问题,谢谢!
沙发
CCompton| | 2018-6-30 16:19 | 只看该作者
初始化里面没有加系统时钟的初始化

使用特权

评论回复
板凳
Richardd| | 2018-6-30 16:27 | 只看该作者
先初始化系统时钟试试

使用特权

评论回复
地板
Richardd| | 2018-6-30 16:30 | 只看该作者

使用特权

评论回复
5
Mattheww| | 2018-6-30 16:46 | 只看该作者
U8 RES变量声明放错位置了,主程序忘记了写while(1)循环

使用特权

评论回复
6
Erichk| | 2018-6-30 16:55 | 只看该作者
先运行初始化函数才会运行MAIN  看看启动文件,他加载了官方文件的初始化了

使用特权

评论回复
7
keaibukelian| | 2018-7-17 16:05 | 只看该作者
最后定位到是什么问题了没有啊

使用特权

评论回复
8
labasi| | 2018-7-17 16:19 | 只看该作者
不初始化的话 有默认配置 有可能是别的问题

使用特权

评论回复
9
renzheshengui| | 2018-7-20 08:25 | 只看该作者
可以直接用示波器看看波特率到底是多少了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

380

帖子

0

粉丝