我是STM32单片机的初学者,请大家帮我看一下,我写的USART2程序,接收功能正常,发送数据不正常。测量TX输出管脚一直是低电平。这是什么原因造成的?
下面是串口初始化程序和发送函数?
void uart2_init(u32 bound)
{
float temp;
uint32_t mantissa;
uint32_t fraction;
RCC->APB2ENR|=1<<2;
// RCC->APB2ENR|=1<<4;
RCC->APB1ENR|=1<<17;
RCC->APB2ENR|=1<<14; //ʹÄÜ´®¿ÚʱÖÓ
GPIOA->CRL&=0xFFFF00FF;//IO״̬ÉèÖÃ
GPIOA->CRL|=0x00008B00;//IO״̬ÉèÖÃ
RCC->APB1RSTR|=1<<17; //¸´Î»´®¿Ú2
RCC->APB1RSTR&=~(1<<17);//Í£Ö¹¸´Î»
USART2->CR1&=~(1<<12);
USART2->CR1&=~(1<<10);
USART2->CR1|=1<<5;
USART2->CR1|=1<<3;
USART2->CR1|=1<<2;
USART2->CR2&=~(3<<12);
temp=(float)(36*1000000)/(bound*16);//µÃµ½USARTDIV
mantissa=temp; //
fraction=(temp-mantissa)*16; //
mantissa<<=4;
mantissa+=fraction;
USART2->BRR=mantissa; //
//USART2->CR1|=0X200C; //1
#if EN_USART2_RX //
//ʹÄܽÓÊÕÖжÏ
USART2->CR1|=1<<13; //
MY_NVIC_Init(1,1,USART2_IRQn,2);//
#endif
}
void transmit2(u8 dat1)
{
USART2->DR=dat1;
while((USART2->SR&0X40)==0);//
}
不是晶振的问题,用HAL写收发都能正常,串口USART1也是正常的
这种情况感觉也有可能是管脚烧了,用debug看看可不可以通过修改ODR来改变输出电平
1.晶振型号没选对
2.引脚接错了
3.gpio挂角有问题
低电平,虚焊可能性不小,直接量管脚和管脚对应焊盘排查虚焊问题
你是不是使用其他型号晶振,没有更改负载电容的容值。晶振在能启动和不能启动的边沿部分。启动后能勉强启动晶振,但是过了一会就会自动切换回内部晶振了。可以通过查RCC->CFGR0变为0来判断。
调整负载电容后程序运行正常了。
你的单片机具体是哪个型号?
确认你的USART2是不是接PA8和PA9