初始化 RCC->APB2ENR|=1<<14; //使能串口时钟 RCC->APB2ENR |=1<<2; //使能GPIOA时钟。 GPIOA->CRH&=0XFFFFF00F;//IO状态设置 GPIOA->CRH|=0X000004B0;//IO状态设置 USART1->BRR = M_USART_BAUD_RATE(SYSCLK,115200); //波特率设置 USART1->CR1|=0X200C;//1位停止,无校验位. //使能接收中断 USART1->CR1|=1<<8; //PE中断使能 USART1->CR1|=1<<5; //1<<5接收缓冲区非空中断使能 USART1->CR1&=~USART_FLAG_TXE;//禁止发送中断 NVIC->ISER[1] |= (1 << (USART1_IRQChannel & 0x1F)); // enable interrupt //中断开启 中断函数 //串口1中断服务程序 void USART1_IRQHandler(void) { //u8 res=0;//接收到的数据 if(USART1->SR & USART_FLAG_RXNE)//接收到数据 { USART1->SR &= ~USART_FLAG_RXNE; // clear interrupt if(RX1_count<U1_RX_MAX)//防止数据过长 { RX1_buffer[RX1_count]=USART1->DR; RX1_count++; } U1_rece_sign=1;//设置数据接收标志 } else if (USART1->SR &USART_FLAG_TXE)//数据发送中断。 { USART1->SR &= ~USART_FLAG_TXE; // clear interrupt if(TX1_count!=TX1_len) { USART1->DR = (u16)TX1_buffer[TX1_count] & (u16)0x01FF; TX1_count++; } else //数据发送完毕。 USART1->CR1&=~USART_FLAG_TXE;//禁止发送中断 } }