新手上路
- 积分
- 47
- 金钱
- 47
- 注册时间
- 2015-9-11
- 在线时间
- 8 小时
|
1金钱
本人菜鸟,原子哥寄存器教程上面给出了串口1的打印输出方式,我想改为由串口2打印,但是改过代码之后发现不输出,在串口中断里面总是接收不完整,但是换成串口1就没有问题,我将串口1的代码里面的改为了串口2,但是仍然不行,请高手不惜赐教,万分感谢!
/******************** usart.c*********************************/
//重定向fputc函数
//printf的输出,指向fputc,由fputc输出到串口
//这里使用串口2(USART1)输出printf信息
int fputc(int ch, FILE *f)
{
// while((USART1->SR&0X40)==0);//等待上一次串口数据发送完成
// USART1->DR = (u8) ch; //写DR,串口1将发送数据
/*******************以下两条语句是我添加的*************************************************************/
while((USART2->SR&0X40)==0);//等待上一次串口数据发送完成
USART2->DR = (u8) ch; //写DR,串口1将发送数据
return ch;
}
#endif
/***********串口2接收*********************/
#if EN_USART2_RX //如果使能了接收
u8 USART2_RX_BUF[USART2_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
u16 USART2_RX_STA=0; //接收状态标记
void USART2_IRQHandler(void)
{
u8 res2;
if(USART2->SR&(1<<5)) //接收到数据
{
res2=USART2->DR;
if((USART2_RX_STA&0x8000)==0)//接收未完成
{
if(USART2_RX_STA&0x4000)//接收到了0x0d
{
if(res2!=0x0a)USART2_RX_STA=0;//接收错误,重新开始
else USART2_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(res2==0x0d)USART2_RX_STA|=0x4000;
else
{
USART2_RX_BUF[USART2_RX_STA&0X3FFF]=res2;
USART2_RX_STA++;
if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
#endif
/****************************/
//初始化 IO 串口 2
//pclk1 CLK1 时钟频率(Mhz)
//bound:波特率
void uart_com2_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; //使能串口时钟
GPIOA->CRL&=0XFFFF00FF; //IO 状态设置
GPIOA->CRL|=0X00008B00; //IO 状态设置
RCC->APB1RSTR|=1<<17; //复位串口 2
RCC->APB1RSTR&=~(1<<17); //停止复位
//波特率设置
USART2->BRR=mantissa; // 波特率设置
USART2->CR1|=0X200C; //1 位停止,无校验位.
#if EN_USART2_RX //如果使能了接收
//使能接收中断
// USART2->CR1|=1<<8; //PE 中断使能
USART2->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(2,3,USART2_IRQn,2);//组 2,抢占优先级3,响应优先级2
#endif
}
/**********************************main.c**********************************/
main()函数中 uart_com2_Init(36,9600),while(1)循环中printf("串口2数据");有打印输出,但是输入之后没有
|
|