OpenEdv-开源电子网

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

USART3,他就是不同使唤!麻烦原子哥来帮解决!

[复制链接]

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-11-12
在线时间
0 小时
发表于 2013-11-19 18:11:25 | 显示全部楼层 |阅读模式
原子哥啊!我这个USART3怎么就不能正常工作呢?您帮看一下呗?谢谢!

我的是mini板,USART3直接杜邦线连的U转串。

#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
int handle; 
/* Whatever you require here. If the only file you are using is */ 
/* standard output using printf() for debugging, no file handling */ 
/* is required. */ 
}; 
/* FILE is typedef’ d in stdio.h. */ 
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
x = x; 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
while((USART3->SR&0X40)==0);//循环发送,直到发送完毕   
USART3->DR = (u8) ch;      
return ch;
}
#endif 
//end



void send(u8 ch) //自定义的一个实参
{
  while((USART3->SR&0X40)==0);//循环发送,直到发送完毕   
USART3->DR =ch;  

}
//////////////////////////////////////////////////////////////////

#ifdef EN_USART3_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误  
u8 USART_RX_BUF[64];     //接收缓冲,最大64个字节.
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u8 USART_RX_STA=0;       //接收状态标记  
  
void USART3_IRQHandler(void)
{
u8 res;    
if(USART3->SR&(1<<5))//接收到数据
{  
res=USART3->DR; 
if((USART_RX_STA&0x80)==0)//接收未完成
{
if(USART_RX_STA&0x40)//接收到了0x0d
{
if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x80; //接收完成了 
}else //还没收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x40;
else
{
USART_RX_BUF[USART_RX_STA&0X3F]=res;
USART_RX_STA++;
if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收  
}  
}
}       
}    
#endif  
//初始化IO 串口3
//pclk1CLK1时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart3_init(u32 pclk1,u32 bound)
{    
float temp;
u16 mantissa;
u16 fraction;   
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分  
    mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<3;   //使能PORTA口时钟  
RCC->APB2ENR|=1<<18;  //使能串口时钟 
GPIOB->CRH&=0XFFFF00FF;//PB10为TXD,PB11为RXD 
GPIOB->CRH|=0X00008B00;//IO状态设置
 
RCC->APB2RSTR|=1<<18;   //复位串口3
RCC->APB2RSTR&=~(1<<18);//停止复位     
//波特率设置
  USART3->BRR=mantissa; // 波特率设置  
USART3->CR1|=0X200C;  //1位停止,无校验位.
#ifdef EN_USART3_RX  //如果使能了接收
//使能接收中断
USART3->CR1|=1<<8;    //PE中断使能
USART3->CR1|=1<<5;    //接收缓冲区非空中断使能    
MY_NVIC_Init(3,3,USART3_IRQChannel,2);//组2,最低优先级 
#endif

}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-19 18:27:42 | 显示全部楼层
看着没错。
uart3_init,你怎么调用的?
软件仿真,看一下usart3的寄存器状态,就知道问题在哪里了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2013-11-19 18:33:44 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
通了,刚忘记改:
RCC->APB2ENR|=1<<3;   //使能PORTA口时钟  
RCC->APB2ENR|=1<<18;  //使能串口时钟
感谢原子哥及时回复!
回复 支持 反对

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2013-11-19 19:00:51 | 显示全部楼层
回复【2楼】 正点原子 :
---------------------------------
找了一遍没有USRAT3成功的实例,都是在讨论,我把我刚调通的USRAT3给大家分享一下。。。见附件!

Mini_STM32 USART3测试通过实例.rar

42.06 KB, 下载次数: 140

回复 支持 反对

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2013-11-19 21:27:56 | 显示全部楼层
好,不错,谢谢分享
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-19 22:33:33 | 显示全部楼层
回复【4楼】Ericyue:
---------------------------------
谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 22:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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