OpenEdv-开源电子网

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

串口问题

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-5
在线时间
0 小时
发表于 2013-9-5 08:36:18 | 显示全部楼层 |阅读模式
我按原子哥的串口实验 配置了 串口2,  结果用串口助手不能发送数据  , 单片机 跟串口助手无法通信,求教 原子哥
int fputc(int ch, FILE *f)
{      
while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
USART2->DR = (u8) ch;      
return ch;
}
#endif 
//end
//////////////////////////////////////////////////////////////////

#ifdef EN_USART2_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误  
u8 USART_RX_BUF[64];     //接收缓冲,最大64个字节.
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u8 USART_RX_STA=0;       //接收状态标记  
  
void USART2_IRQHandler(void)
{
u8 res;    
if(USART2->SR&(1<<5))//接收到数据
{  
res=USART2->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 串口1
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart_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->CRH&=0XFFFFF00F; 
GPIOA->CRH|=0X000008B0;//IO状态设置
 
RCC->APB1RSTR|=1<<17;   //复位串口1
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
}

int main(void)
{
u8 t;
u8 len;
u16 times=0;  
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化 
uart_init(36,9600); //串口初始化为9600
LED_Init();   //初始化与LED连接的硬件接口    
while(1)
{
if(USART_RX_STA&0x80)
{   
len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
printf("\n您发送的消息为:\n");
for(t=0;t<len;t++)
{
USART2->DR=USART_RX_BUF[t];
while((USART2->SR&0X40)==0);//等待发送结束
}
printf("\n\n");//插入换行
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\nMiniSTM32开发板 串口实验\n");
printf("正点原子@ALIENTEK\n\n\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\n");  
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);   
}
}  
}


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

使用道具 举报

15

主题

180

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2013-4-23
在线时间
25 小时
发表于 2013-9-5 09:46:00 | 显示全部楼层
回复【楼主位】韩晨安:
---------------------------------
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h" 
#include "key.h"    
//Mini STM32开发板范例代码3
//串口实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
int main(void)
{
u8 t;
u8 len;
u16 times=0;  
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化 
uart_init(36,9600);  //串口初始化为9600
LED_Init();     //初始化与LED连接的硬件接口    
while(1)
{
if(USART_RX_STA&0x80)
{    
len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
printf("\n您发送的消息为:\n");
for(t=0;t<len;t++)
{
USART2->DR=USART_RX_BUF[t];
while((USART2->SR&0X40)==0);//等待发送结束
}
printf("\n\n");//插入换行
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\nMiniSTM32开发板 串口实验\n");
printf("正点原子@ALIENTEK\n\n\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\n");  
if(times%30==0){LED0=!LED0;//闪烁LED,提示系统正在运行.
LED1=!LED1;  }
delay_ms(10);   
}
}  
}





#include "sys.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//串口1初始化    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/5/27
//版本:V1.3
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明 
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//////////////////////////////////////////////////////////////////////////////////    
 

//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB   
#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((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
USART2->DR = (u8) ch;      
return ch;
}
#endif 
//end
//////////////////////////////////////////////////////////////////

#ifdef EN_USART2_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   
u8 USART_RX_BUF[64];     //接收缓冲,最大64个字节.
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u8 USART_RX_STA=0;       //接收状态标记   
  
void USART2_IRQHandler(void)
{
u8 res;     
if(USART2->SR&(1<<5))//接收到数据
{  
res=USART2->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 串口1
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart_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->APB2ENR|=1<<14;  //使能串口时钟 
RCC->APB1ENR|=1<<17; 

// GPIOA->CRH&=0XFFFFF00F; 
// GPIOA->CRH|=0X000008B0;//IO状态设置

    GPIOA->CRL&=0xFFFF00FF;
    GPIOA->CRL|=0x00008B00;
  
RCC->APB1RSTR|=1<<17;   //复位串口1
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
}




#ifndef __USART_H
#define __USART_H
#include <stm32f10x_lib.h>
#include "stdio.h"  
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//串口1初始化    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/5/27
//版本:V1.3
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明 
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//////////////////////////////////////////////////////////////////////////////////    
 
  
extern u8 USART_RX_BUF[64];     //接收缓冲,最大63个字节.末字节为换行符 
extern u8 USART_RX_STA;         //接收状态标记

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

#endif
回复 支持 反对

使用道具 举报

5

主题

107

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2013-5-5
在线时间
0 小时
发表于 2013-9-5 09:49:03 | 显示全部楼层
1,程序uart_init(36,9600); //串口初始化为9600,波特率是9600吗?
2,你用的min板还是其实,检查一下的引脚是USART2的引脚吗?
3,如果是开发板的话看看有没有共用引脚什么的!
游走在生活里,你我都是涉世未深的旅人,前方有我们为之心怡的归宿,身后又是一片葱郁的往昔,让生活的零碎随风而来,又似过往的随风云烟而散,唯有这厮,方能守得云开,待到春花烂漫!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-5
在线时间
0 小时
 楼主| 发表于 2013-9-5 10:04:36 | 显示全部楼层
回复【3楼】冰尘牧之:
---------------------------------
我用的是 正点原子 mini板子
回复 支持 反对

使用道具 举报

5

主题

107

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2013-5-5
在线时间
0 小时
发表于 2013-9-5 10:07:04 | 显示全部楼层
回复【4楼】韩晨安:
---------------------------------
按我说的自己去找原因!
游走在生活里,你我都是涉世未深的旅人,前方有我们为之心怡的归宿,身后又是一片葱郁的往昔,让生活的零碎随风而来,又似过往的随风云烟而散,唯有这厮,方能守得云开,待到春花烂漫!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-5 10:16:54 | 显示全部楼层
串口2是用PA9,PA10么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-5
在线时间
0 小时
 楼主| 发表于 2013-9-5 10:22:33 | 显示全部楼层
回复【5楼】冰尘牧之:
---------------------------------好的 谢谢
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-5
在线时间
0 小时
 楼主| 发表于 2013-9-5 10:24:36 | 显示全部楼层
回复【2楼】wobukansanguo:
---------------------------------
你通信成功了么?
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-5
在线时间
0 小时
 楼主| 发表于 2013-9-5 10:25:35 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原来不是  谢谢 原子哥
回复 支持 反对

使用道具 举报

15

主题

180

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2013-4-23
在线时间
25 小时
发表于 2013-9-5 10:41:42 | 显示全部楼层
回复【8楼】韩晨安:
---------------------------------
成功啊
回复 支持 反对

使用道具 举报

15

主题

180

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2013-4-23
在线时间
25 小时
发表于 2013-9-5 10:43:24 | 显示全部楼层
回复【8楼】韩晨安:
---------------------------------
GPIOA->CRH&=0XFFFFF00F; 
GPIOA->CRH|=0X000008B0;//IO状态设置,你这里错了撒,没改复用IO口
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-5
在线时间
0 小时
 楼主| 发表于 2013-9-5 11:50:11 | 显示全部楼层
回复【11楼】wobukansanguo:
---------------------------------
恩 谢谢
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-9-5 11:55:37 | 显示全部楼层
PA9,PA10---这个是串口1的管脚。查看手册串口2对应的 可不是这两个。原子哥的串口连接的是串口1.如果你配置的是2连接的是1那肯定通信不了的。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 12:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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