OpenEdv-开源电子网

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

原子大哥,USART2帮帮忙

[复制链接]

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-8-7 16:19:46 | 显示全部楼层 |阅读模式
5金钱
有一个项目,需要开两个串口进行通信,这不我用战舰的USART2做第二个串口通信,函数和原子的USART1几乎一样,结果通信没有成功,已经用串口转TTL了,结果还是没有值采集到。发个程序,望各位在百忙中抽空看看           

实验4 串口实验.rar

663.5 KB, 下载次数: 649

最佳答案

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

1.可以用printf函数,但是一个工程最好只有一个重定向,如果串口2用就把串口1的去掉,移植到串口2,而不是你这样“乱改” 2.向电脑传送数据也可以直接通过串口发送啊,printf也是掉用的串口发送USART2->DR
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-8-7 16:19:47 | 显示全部楼层
1.可以用printf函数,但是一个工程最好只有一个重定向,如果串口2用就把串口1的去掉,移植到串口2,而不是你这样“乱改”
2.向电脑传送数据也可以直接通过串口发送啊,printf也是掉用的串口发送USART2->DR
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-8-7 16:32:50 | 显示全部楼层
这个一般是配置问题,直接粘贴串口.C文件代码再附上附件可能比较方便别人查看,网速卡的要死...

1.把串口2的printf重定向去掉,这个是打印用的,你都改成啥了,不忍直视
2.串口2时钟36MHZ,串口1是72MHZ,主函数前的初始化改过来
3.串口2配置函数里面,你的是
  USART2->BRR=mantissa; // ?¨?????è??  
USART2->CR1|=0X200C;  //1??????,?????é??.
#if EN_USART1_RX   //??????????????
//???????????? 
USART2->CR1|=1<<5;    //??????????·???????????     
MY_NVIC_Init(3,3,USART2_IRQn,2);//×é2??×????????? 
#endif

我一直在用的是
  USART2->BRR=mantissa; 
USART2->CR1|=0X200C; 
 
#ifdef EN_USART2_RX     --------注意此处是2,不是1了   
USART2->CR1|=1<<8;    
USART2->CR1|=1<<5;         
MY_NVIC_Init(3,1,USART2_IRQn,2);
while((USART2->SR&0X40)==0); 
#endif
你找一下区别,改过来
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-4-11
在线时间
0 小时
 楼主| 发表于 2015-8-7 17:04:38 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
#include "usart2.h"   
//////////////////////////////////////////////////////////////////////////////////   
//????????ucos,?ò°ü?¨???????·????????.
#if SYSTEM_SUPPORT_OS
#include "includes.h"
#endif
#if 1
#pragma import(__use_no_semihosting)             
                
struct __FILE 

int handle; 

}; 
FILE __stdout_2;       

x = x; 


int fputc_2(int ch, FILE *f)
{      
while((USART2->SR&0X40)==0); 
USART2->DR = (u8) ch;      
return ch;
}
#endif 
//end
//////////////////////////////////////////////////////////////////

#if EN_USART2_RX   
 
u8 USART2_RX_BUF[USART2_REC_LEN];     

u16 USART2_RX_STA=0;    
  
void USART2_IRQHandler(void)
{
u8 res;
#if SYSTEM_SUPPORT_OS 
OSIntEnter();    
#endif
if(USART2->SR&(1<<5))
{  
res=USART2->DR; 
if((USART2_RX_STA&0x8000)==0)
{
if(USART2_RX_STA&0x4000)
{
if(res!=0x0a)USART2_RX_STA=0;
else USART2_RX_STA|=0x8000;
}else 
{
if(res==0x0d)USART2_RX_STA|=0x4000;
else
{
USART2_RX_BUF[USART2_RX_STA&0X3FFF]=res;
USART2_RX_STA++;
if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;   
}  
}
}          
}
#if SYSTEM_SUPPORT_OS 
OSIntExit();    
#endif

#endif  

void uart2_init(u32 pclk2,u32 bound)
{    
float temp;
u16 mantissa;
u16 fraction;    
temp=(float)(pclk2*1000000)/(bound*16);
mantissa=temp;
fraction=(temp-mantissa)*16; 
    mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<2;  
RCC->APB1ENR|=1<<17;  
GPIOA->CRL&=0XFFFF00FF;
GPIOA->CRL|=0X00008B00; 
RCC->APB1RSTR|=1<<17;   
RCC->APB1RSTR&=~(1<<17);        

  USART2->BRR=mantissa; 
USART2->CR1|=0X200C; 
#if EN_USART1_RX

USART2->CR1|=1<<5;      
MY_NVIC_Init(3,3,USART2_IRQn,2);
#endif
}



好的,我再试试
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-4-11
在线时间
0 小时
 楼主| 发表于 2015-8-7 17:09:08 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
如果不用printf,还有没有其他的可以向PC机传送的函数。。。?
回复

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-4-11
在线时间
0 小时
 楼主| 发表于 2015-8-7 17:25:37 | 显示全部楼层
回复【5楼】龙之谷:
---------------------------------
果然是专家!!!大赞
我改成了36Mhz,9600波特率

用了你的这块程序
#ifdef EN_USART2_RX    
USART2->CR1|=1<<8;     
USART2->CR1|=1<<5;          
MY_NVIC_Init(3,1,USART2_IRQn,2); 
while((USART2->SR&0X40)==0);  
#endif 
可以说是解决问题的核心
没有用PRINTF
直接用的:
                         u8 USART2_test[]={'1','2','3'};
                          for(t=0;t<5;t++)
{
USART2->DR=USART2_test[t];
while((USART2->SR&0X40)==0);
}
结果123就很神奇的出现了,哈哈
回复

使用道具 举报

0

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-1-11
在线时间
23 小时
发表于 2016-6-19 20:34:42 | 显示全部楼层
有参考价值
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2016-6-21 10:36:28 | 显示全部楼层
原子大哥的程序都已经很明了了,只需要把他的程序好好理解下就能解决问题。不能做伸手党。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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