OpenEdv-开源电子网

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

串口2发送数据进入了中断

[复制链接]

17

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-9-18
在线时间
46 小时
发表于 2013-12-23 10:26:56 | 显示全部楼层 |阅读模式
我现在用mini stm32做485通信,但是按键一按下发送数据时,马上进入了串口中断处理程序,这是什么问题。
#include "sys.h"    
#include "rs485.h"  
#include "delay.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//RS485驱动 代码   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/9
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved  
//////////////////////////////////////////////////////////////////////////////////


#ifdef EN_USART2_RX   //如果使能了接收    
//接收缓存区
u8 RS485_RX_BUF[5];   //接收缓冲,最大64个字节.
//接收到的数据长度
u8 RS485_RX_CNT=0; 
 
void USART2_IRQHandler(void)
{    
if(USART2->SR&(1<<5))//接收到数据
{
   LED0=!LED0;  
RS485_RX_BUF[RS485_RX_CNT++]=USART2->DR; //记录接收到的值
}
if(RS485_RX_CNT>=5)
RS485_RX_CNT=0;  
#endif  
//初始化IO 串口2
//pclk1CLK1时钟频率(Mhz)
//bound:波特率  
void RS485_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口时钟  
GPIOA->CRL&=0XFFFF00F0; //IO状态设置
GPIOA->CRL|=0X00008B03; //IO状态设置  
RCC->APB1ENR|=1<<17;   //使能串口时钟  
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
RS485_TX_EN=0; //默认为接收模式
}

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
u8 t;
RS485_TX_EN=1; //设置为发送模式
  for(t=0;t<len;t++) //循环发送数据
{
   USART2->DR=buf[t];
while((USART2->SR&0X40)==0);//等待发送结束  
}  
RS485_TX_EN=0; //设置为接收模式
}
主程序如下:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"  
#include "key.h"
#include "lcd.h"  
#include "rs485.h"
u8 num[5]={110,124,136,155,168}; 
//ALIENTEK战舰STM32开发板实验24
//485 实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司  
int main(void)
{
u8 key;
u8 i=0,t=0;
u8 rs485buf[5]; 
  Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600); //串口初始化为9600
delay_init(72);   //延时初始化 
LED_Init();   //初始化与LED连接的硬件接口
LCD_Init();   //初始化LCD
KEY_Init(); //按键初始化
RS485_Init(72,19200); //初始化RS485
  POINT_COLOR=RED;//设置字体为红色 
LCD_ShowString(60,50,"Eric You");
LCD_ShowString(60,70,"RS485 TEST");
LCD_ShowString(60,90,"1406340405@qq.com");
LCD_ShowString(60,110,"2013/11/11");
LCD_ShowString(60,130,"KEY0:Send");
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,150,"Count:");
LCD_ShowString(60,170,"Send Data:");
LCD_ShowString(60,210,"Receive Data:");  
while(1)
{
key=KEY_Scan();
if(key==1)//KEY0按下,发送一次数据
{
for(i=0;i<5;i++)
{
rs485buf=num;//填充发送缓冲区
LCD_ShowNum(60+i*32,190,rs485buf,3,16);
  }
RS485_Send_Data(rs485buf,5);//发送5个字节   
}  
if(RS485_RX_CNT)
{
  for(i=0;i<RS485_RX_CNT;i++)
  LCD_ShowNum(60+i*32,230,RS485_RX_BUF,3,16);
}
t++; 
delay_ms(10);
if(t==20)
{
//LED0=!LED0;//提示系统正在运行
t=0;
}   
}
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-23 11:44:35 | 显示全部楼层
你485接了另外一个板子么?
怀疑是收到自己发出去的数据了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-9-18
在线时间
46 小时
 楼主| 发表于 2013-12-23 13:32:42 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
没有接另外的板子,但是液晶屏上面显示了要发送的数据
回复 支持 反对

使用道具 举报

17

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-9-18
在线时间
46 小时
 楼主| 发表于 2013-12-23 13:45:17 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
在液晶屏Receive Data有显示要发送的数据,而且LED0也会发生变化(LED0我是在中断里面标志的)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-23 17:17:27 | 显示全部楼层
回复【3楼】Eric You:
---------------------------------
估计是收到自己的数据了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-9-18
在线时间
46 小时
 楼主| 发表于 2013-12-26 09:37:40 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
我现在接了另外一块51单片机开发板,我一按下按键,TFTLCD的接收就会接收到我要发送的数据,这个是什么问题啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-26 10:52:56 | 显示全部楼层
回复【6楼】Eric You:
---------------------------------
就是接收到自己发送的数据了
检查硬件。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 09:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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