新手上路
- 积分
- 33
- 金钱
- 33
- 注册时间
- 2020-4-14
- 在线时间
- 8 小时
|
用寄存器法配置USART1 检查了很多遍但是一直烧录进去一直用不了
我还刻意通过红灯 绿灯现象来证明: 串口助手每发送一次数据 红灯亮 延迟 红灯灭 绿灯亮 延迟 绿灯灭
有现象 但就是接收不到数据 求各位大神帮忙看看 是哪里出了问题/双手合十
/*
函数功能:串口初始化
参数: 设置的波特率
返回值: void
提示: USARTDIV是存储在波特率寄存器BRR中的数值 由于是float型 所以只能分小数部分和整数部分存储
*/
void Usart_Init(u32 bps)
{
float USARTDIV;
u16 DIV_Mantissa;//尾数部分
u16 DIV_Fraction;//小数部分
//开时钟
RCC->APB2ENR |= (1<<2);//使能GPIOA
RCC->APB2ENR |= (1<<14);//使能USART1时钟
//配置PA9 PA10
GPIOA->CRH &= ~(0xFF << (4*(9-8)));
GPIOA->CRH |= (0x4B << (4*(9-8)));//PB10浮空输入 PB9推挽输出
//配置USART1
USART1->CR1 = 0;//8位数据位 禁止奇偶校验
USART1->CR2 &= ~(0x3<<12);//1个停止位
//配置波特率
USARTDIV = 72000000/(16*bps);
DIV_Mantissa = (u16)USARTDIV;
DIV_Fraction = (USARTDIV-DIV_Mantissa)*16;//小数部分左移四位
USART1->BRR = ((DIV_Mantissa << 4) | DIV_Fraction);
USART1->CR1 |= (0x3<<2);//使能发送 使能接收
USART1->CR1 |= (0x1<<13);//使能USART
}
//函数功能:USART1发送一个字节
void Usart_Send_Byte(u8 data)
{
// while((USART1->SR & (1<<7)) == 0)//为0 即TDR非空即上一个数据还没发送完成
while(!(USART1->SR & (0x1<<7)))
{
//等待发送数据寄存器为空 即等待上一个数据发送完成
}
USART1->DR = data;
}
//函数功能:USART1接收一个字节
u8 Usart_Recv_Byte(void)
{
//while((USART1->SR & (0x1<<5)) == 0)//RDR非空 为1非空 即接收到数据 为0 则RDR为空 即没接收到数据
while(!(USART1->SR & (1<<5)))
{
//等待RDR非空 即等待RDR接收到数据
}
return USART1->DR;
}
|
-
现象图
|