OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4649|回复: 11

407串口通信不正常

[复制链接]

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-4-7
在线时间
10 小时
发表于 2018-4-7 21:38:30 | 显示全部楼层 |阅读模式
1金钱
本人电子小白,刚开始学习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该配置的都配置了,请各位大神帮帮忙,找一下问题,谢谢!!!!

最佳答案

查看完整内容[请看2#楼]

中断函数问题你的是 USARTx_IRQHandler ,改为USART1_IRQHandler 应该就OK了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2017-9-26
在线时间
25 小时
发表于 2018-4-7 21:38:31 | 显示全部楼层
中断函数问题你的是 USARTx_IRQHandler  ,改为USART1_IRQHandler  应该就OK了
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-4-7
在线时间
10 小时
 楼主| 发表于 2018-4-7 21:38:56 | 显示全部楼层
请各位大神帮帮忙,找一下问题,谢谢!!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-8 02:15:14 | 显示全部楼层
可以直接下载我们例程,测试下
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-4-7
在线时间
10 小时
 楼主| 发表于 2018-4-8 13:19:36 | 显示全部楼层
正点原子 发表于 2018-4-8 02:15
可以直接下载我们例程,测试下

原子哥  ,我试了一下您们的例程  没有问题,但是我是按照视频一步一步学习编写的,我没看出来和视频26讲里的程序有什么区别,甚至我直接用你们的USART.H文件还是不行,,请帮帮忙,都弄了好几天了,万分感谢
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-6-14
在线时间
13 小时
发表于 2018-4-8 18:09:53 | 显示全部楼层
文件逐个替换,先用原子的,然后一个一个替换原子的代码,直到出不了结果就知道哪个文件有问题了。
有时候遇到这些问题确实挺烦人的,别人不可能一条一条给你看代码,更不可能给你调程序,慢慢来吧,问题总能解决的!
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2018-4-1
在线时间
4 小时
发表于 2018-4-8 18:22:48 | 显示全部楼层
应该是串口1的中断服务函数吧,你看看你的程序能进入中断服务函数吗
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-4-7
在线时间
10 小时
 楼主| 发表于 2018-4-8 23:12:34 | 显示全部楼层
这是整个工程,逐个替换到原子哥的程序中没有问题,但是用自己的还是不行,希望大神帮帮忙看看,另外还有一个警告,不知道怎么处理,万分感谢

串口通信.rar

8.09 MB, 下载次数: 19

回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-4-7
在线时间
10 小时
 楼主| 发表于 2018-4-16 15:48:53 | 显示全部楼层
程序中的变量“u8 RES; ”位置放错了。应该放在中断处理函数的下面,结果放到了中断处理函数中的判断程序中了。经过修改后,目前编译无错无警告。但是具体程序还没有下载实验呢。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-4-16 19:23:58 | 显示全部楼层
哥哥,你的main函数没有死循环啊,程序直接结束了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-17 01:25:15 | 显示全部楼层
为何都能这么低级
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-4-7
在线时间
10 小时
 楼主| 发表于 2018-4-17 08:53:56 | 显示全部楼层
这个是没有注意,早就添加上了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 10:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表