我现在用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
//pclk1  CLK1时钟频率(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;
}
}
}
|