在串口中断里 我用串口助手给单片机发个字符,串口助手判断回复数据回来。但是现在是这样的我发一次,单片机就不停的回复数据上来。下面是代码,请帮忙看一下问题所在呀。
#include "sys.h"
#include "usart.h"
//#ifdef EN_USART1_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
/*void USART1_IRQHandler(void)
{
USART1->DR='a';
while((USART2->SR&0X40)==0);//等待发送结束
} */
//#endif
//#ifdef EN_USART2_RX //如果使能了接收
//串口2中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
//u8 USART_RX_BUF[32]; //接收缓冲,最大64个字节.
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
//u8 USART_RX_STA=0; //接收状态标记
/*void USART2_IRQHandler(void)
{
USART2->DR='b';
while((USART2->SR&0X40)==0);//等待发送结束
} */
//#endif
//初始化IO 串口1
//pclk2  CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart1_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; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
//USART1->CR1|=0X200C; //1位停止,无校验位.
USART1->CR1|=0X340C; //1位停止,无校验位.
#ifdef EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<8; //PE中断使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}
//初始化IO 串口2
//pclk2  CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart2_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<<2; //使能PORTA口时钟
RCC->APB1ENR|=1<<17; //使能串口2时钟
GPIOA->CRL&=0XFFFF00FF; //PA2->TX PA3->RX
GPIOA->CRL|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<17; //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位
//波特率设置
USART2->BRR=mantissa; // 波特率设置
//USART2->CR1|=0X200C; //1位停止,无校验位.
USART2->CR1|=0X340C; //1位停止,无校验位.
#ifdef EN_USART2_RX //如果使能了接收
//使能接收中断
USART2->CR1|=1<<8; //PE中断使能
USART2->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级
#endif
}
void printf_hex(u8 dat)
{
USART1->DR=dat;
while((USART1->SR&0X40)==0);//等待发送结束
}
*************************************************
void USART1_IRQHandler(void)
{
unsigned char rx_data;
if(USART1->SR&(1<<5))
{
rx_data= USART1->DR;
if('\n' == rx_data )
{
uart_print_char(0,'a');
rx_data=0;
}
}
// USART1->DR='a';
// while((USART2->SR&0X40)==0);//等待发送结束
}
|