如题,开发环境是iar,代码如下
串口初始化
void UART3_INIT(void)
{
u16 baud_div=0;
/*1位起始位 8位数据位 结束位由CR3设置 不使用奇偶校验 */
UART3_CR1 = (0<<4)|(0<<2);
UART3_CR3 = 0x00;
/*使能发送和接收 接收中断使能 禁止发送中断*/
//UART3_CR2 = (0<<7)|(0<<6)|(1<<5)|(0<<4)|(1<<3)|(1<<2);
UART3_CR2_TEN = 1;
UART3_CR2_REN = 1;
UART3_CR2_RIEN = 1;
/*设置1位停止位 不使能SCLK*/
//UART3_CR3 = (0<<6)|(0<<4)|(0<<3);
/*使用智能卡模式需要设置的,基本上保持默认就行了 */
// UART3_CR5 = (0<<2)|(0<<1);
/*设置波特率*/
baud_div =(SysClockFreq/BaudRate); /*求出分频因子*/
UART3_BRR2 = ((u8)(baud_div & 0x0f)) | ((u8)((baud_div & 0xf000) >> 8)) ;
//UART3_BRR2 |= (u8)((baud_div & 0xf000) >> 8);
UART3_BRR1 = (u8)((baud_div & 0x0ff0) >> 4); /*先给BRR2赋值 最后再设置BRR1*/
UART3_CR1 |= (0<<5); /*使能UART*/
}
中断处理函数:
#pragma vector=0x17
__interrupt void UART3_RX_IRQHandler(void)
{
#if 0
u8 Res;
if(UART3_SR & UART_FLAG_RXNE)
{/*接收中断(接收到的数据必须是0x0d 0x0a结尾)*/
Res =(u8)UART3_DR;
/*(USART1->DR);读取接收到的数据,当读完数据后自动取消RXNE的中断标志位*/
if(( UART_RX_NUM&0x80)==0)/*接收未完成*/
{
if( UART_RX_NUM&0x40)/*接收到了0x0d*/
{
if(Res!=0x0a)
UART_RX_NUM=0;/*接收错误,重新开始*/
else
UART_RX_NUM|=0x80; /*接收完成了 */
}
else /*还没收到0X0D*/
{
if(Res==0x0d)
UART_RX_NUM|=0x40;
else
{
RxBuffer[ UART_RX_NUM&0X3F]=Res ;
UART_RX_NUM++;
if( UART_RX_NUM>63)
UART_RX_NUM=0;/*接收数据错误,重新开始接收*/
}
}
}
}
#else
unsigned char c;
c = UART3_DR; // 接收到数据了
while(!UART3_SR_TXE);
c++; // 把接收到的数据加1
UART3_DR = c; // 再发回去,为什么这么做?在电脑上串口调试软件里发1就收到2,发A就收到B,看运行结果比较方便
#endif
}
主函数初始化串口,没做其他的,请原子大哥和各位帮忙指点下! |