OpenEdv-开源电子网

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

stm32的usart1和usart2两个串口同时使用问题

[复制链接]

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
发表于 2013-4-1 18:35:55 | 显示全部楼层 |阅读模式
想在原子哥串口程序上加个usart2同时工作,但是修改过后出现错误
贴下程序
usart.h部分
#ifndef __USART_H
#define __USART_H
#include <stm32f10x_lib.h>
#include "stdio.h"
extern u8 USART_RX_BUF[64], USART2_RX_BUF[64] ;     //接收缓冲,最大63个字节.末字节为换行符 
extern u8 USART_RX_STA,USART2_RX_STA;         //接收状态标记
//如果想串口中断接收,请不要注释以下宏定义
#define EN_USART1_RX //使能串口1接收
void uart_init(u32 pclk2,u32 bound);
#define EN_USART2_RX //使能串口2接收
void uart2_init(u32 pclk2,u32 bound);
#endif

usart.c部分
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
这里是#ifdef EN_USART1_RX下面的格式是按照#ifdef EN_USART1_RX修改的
#ifdef EN_USART2_RX   //如果使能了接收
u8 USART2_RX_BUF[64];     //接收缓冲,最大64个字节.
u8 USART2_RX_STA=0;       //接收状态标记
u8 flag2=0;
void USART2_IRQHandler(void)
{  
  u8 res2;     
 if(USART2->SR&(1<<5))//接收到数据
 {  
  res2=USART2->DR;
if((USART2_RX_STA&0x80)==0)//接收未完成
{
        flag2=flag2+res2;
if(res2==flag2)//接收到了0x0d
 {
                          USART2_RX_STA|=0x80; //接收完成了
 }
  else //还没收到0X0D
{
                         USART2_RX_BUF[USART2_RX_STA]=res2;
                         USART2_RX_STA++;
                         }
}
              if(USART2_RX_STA>63)
         USART2_RX_STA=0;//接收数据错误,重新开始接收   
 }    
}
#endif
这有一块uart_init()被我省略了,下面是uart2_init的
void uart2_init(u32 pclk2,u32 bound)
{    
   float temp;
   u16 mantissa;
   u16 fraction;    
   temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
   mantissa=temp;     //得到整数部分
   fraction=(temp-mantissa)*16; //得到小数部分  
   mantissa<<=4;
   mantissa+=fraction; 
   RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
   RCC->APB1ENR|=1<<17;  //使能串口时钟 
   GPIOA->CRL&=0XFFFF00FF; 
   GPIOA->CRL|=0X00008B00;//IO状态设置
    
   RCC->APB1RSTR|=1<<17;   //复位串口2
   RCC->APB1RSTR&=~(1<<17);//停止复位        
   //波特率设置
   USART2->BRR=mantissa; // 波特率设置  
   USART2->CR1|=0X200C;  //1位停止,无校验位.
#ifdef EN_USART2_RX    //如果使能了接收
   //使能接收中断
   USART2->CR1|=1<<8;    //PE中断使能
   USART2->CR1|=1<<5;    //接收缓冲区非空中断使能      
   MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级 
#endif
}
下面是test.c的主要程序
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
u8 t;
// u8 len;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化 
uart_init(72,9600);  //串口1初始化为9600
uart2_init(72,9600);  //串口2初始化为9600
LED_Init();     //初始化与LED连接的硬件接口
     
while(1)
{
              这里是USART_RX_STA&0x80的判断,下面是usart2的,格式是相同的
             if(USART2_RX_STA&0x80)
{    
// len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
for(t=0;t<4;t++)
{
USART2->DR=USART2_RX_BUF[t];
while((USART2->SR&0X40)==0);//等待发送结束
}USART2_RX_STA=0;
}
}  
}
主要修改的就是填色部分所标注的,最后编译给出test.c(19): warning:  #223-D: function "uart2_init" declared implicitly
                                                                  test.c(40): error:  #20: identifier "USART2_RX_STA" is undefined
                                                                  test.c(47): error:  #20: identifier "USART2_RX_BUF" is undefined
这样的错误,单独运行修改后的原子哥的串口1程序是可以的,但是不改usart1的情况下添了usart2确是有错,哪位大神指导一下错在哪~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2013-4-1 19:12:19 | 显示全部楼层
回复【楼主位】慢慢学:
---------------------------------
我添加了。单纯从编译来说是没有问题的。
不知道你哪里弄错了。
可能是宏定义放错地方之类的吧。。。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2013-4-1 19:13:33 | 显示全部楼层
贴上你的工程一看便知
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
 楼主| 发表于 2013-4-1 19:28:19 | 显示全部楼层
附件在此
麻烦了~

ALIENTEK MINISTM32 实验3 串口实验.rar

583.99 KB, 下载次数: 2414

回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
 楼主| 发表于 2013-4-1 19:32:27 | 显示全部楼层
回复【3楼】Admin:
---------------------------------
附件已经发了~宏定义应该没有问题,原本我猜也是这的问题
回复 支持 反对

使用道具 举报

头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
发表于 2013-4-1 20:03:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
发表于 2013-4-1 20:04:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2013-4-1 20:25:58 | 显示全部楼层

回复【4楼】 慢慢学 :
---------------------------------
错误如下:
usart.h里面:
修改为:
extern u8 USART_RX_BUF[64];     //接收缓冲,最大63个字节.末字节为换行符
extern u8 USART_RX_STA;         //接收状态标记 
extern u8 USART2_RX_BUF[64];     //接收缓冲,最大63个字节.末字节为换行符
extern u8 USART2_RX_STA;         //接收状态标记 

//如果想串口中断接收,请不要注释以下宏定义
#define EN_USART1_RX //使能串口1接收
#define EN_USART2_RX //使能串口2接收

void uart_init(u32 pclk2,u32 bound);
void uart2_init(u32 pclk2,u32 bound);

#endif   



为什么你列出来代码是添加了。而你的工程里面没有呢?
你的代码来自哪里???
添加进去,没有任何错误和警告。

下面是你的usart.h里面的代码:
extern u8 USART_RX_BUF[64];     //接收缓冲,最大63个字节.末字节为换行符
extern u8 USART_RX_STA;         //接收状态标记 

//如果想串口中断接收,请不要注释以下宏定义
#define EN_USART1_RX //使能串口1接收
void uart_init(u32 pclk2,u32 bound);

#endif   

这样的错误来源,我很是费解。。。





 

我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
 楼主| 发表于 2013-4-1 20:50:38 | 显示全部楼层
回复【8楼】Admin:
---------------------------------
好吧~犯了低级的错误 每次打开程序的时候是恢复上次修改的东西,我最近小程序编的有点乱,混在一起了~
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-5-30
在线时间
0 小时
发表于 2013-4-1 20:52:58 | 显示全部楼层
在你的头文件usart.h中添加
extern u8 USART2_RX_BUF[64];     //接收缓冲,最大64个字节.
extern u8 USART2_RX_STA;       //接收状态标记

#define EN_USART2_RX   //如果使能了接收
void uart2_init(u32 pclk2,u32 bound);


编译即可通过
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
 楼主| 发表于 2013-4-1 20:53:41 | 显示全部楼层
恩 回复【10楼】fby19860519:
---------------------------------
恩 是的
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
 楼主| 发表于 2013-4-1 20:55:08 | 显示全部楼层
现在已经好了
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-5-30
在线时间
0 小时
发表于 2013-4-9 16:33:49 | 显示全部楼层
问一下:两个串口同时使用时,usart2怎么接线的?
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
 楼主| 发表于 2013-4-15 16:14:33 | 显示全部楼层
回复【13楼】fby19860519:
---------------------------------
在板子上 A2和PA3就分别是发送和接收呀  原理图上有  当然 重映射的话就还要使能映射的端口
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
 楼主| 发表于 2013-4-15 16:16:25 | 显示全部楼层
回复【8楼】Admin:
---------------------------------
pclk2应该改为pclk1吧  串口2的波特率也是原来的一半好像
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2013-6-4
在线时间
0 小时
发表于 2013-6-4 18:21:19 | 显示全部楼层
您好!我试了一下您的程序   程序的意思是随便usart1与usart2 的哪一个与usb的tx  rx连接在一起,输入4长度的数据,都可以向单片机发送并单片机能够返回是么?为什么不行呢?
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-7-24
在线时间
0 小时
发表于 2013-7-24 20:30:02 | 显示全部楼层
我的2串口都接自己电脑上都能各种功能,但是一个接自己的,串口2接其他电脑就不行额
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-10-16
在线时间
9 小时
发表于 2018-10-19 21:40:29 | 显示全部楼层
usart_init(36,9600);
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 22:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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