本帖最后由 909425711 于 2017-4-13 22:51 编辑
如题,我按照原子大哥的例程编写简易的串口程序,但是一直无法正常收发数据,串口精灵上显示全空,使用16进制显示后则全部都是0,使用原子例程的hex则正常。但是,我的程序基本就是按照原子的程序写得,除了没有用到延时、led灯外,其余都是照抄的。想问问是什么原因。file:///C:UserslenovoAppDataRoamingTencentUsers2314121630QQWinTempRichOle@~GPF)W(T}WUJ`06DPJ2$82.png
int main (void)
{
usart_Init(9600,72);
while(1)
{
USART1->DR=2; //循环发送数字02
while((USART1->SR&(1<<7))==0);
};
return 0;
}
void usart_Init (u16 botelv,u16 MHz)
{
float x=MHz*16000000.0/botelv;
NVIC_InitTypeDef NVIC_Init1;
RCC->APB2ENR|=1<<14|1<<2;
RCC->APB2RSTR|=1<<14;
RCC->APB2RSTR&=~(1<<14);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //此处使用了misc库函数来初始化中断
NVIC_Init1.NVIC_IRQChannel=37;
NVIC_Init1.NVIC_IRQChannelPreemptionPriority=1;
NVIC_Init1.NVIC_IRQChannelSubPriority=1;
NVIC_Init1.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_Init1);
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0x000004b0;
USART1->BRR=(u16)x;
USART1->CR1|=0X200C;
USART1->CR1|=1<<5;
USART1->CR1|=1<<8;
}
void USART1_IRQHandler(void)
{
u8 res;
GPIOA->CRH|=0x3;
GPIOA->ODR|=1<<8;
if(USART1->SR&(1<<5))//接收到数据
{
res=USART1->DR;
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}else //还没收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
x = 72 * 16000 000.0 / 9600 = 120000.0
在强制转换为(U16)后波特率是9600吗?
一周热门 更多>