STM32 死在 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
,我使能了啊、USART_Cmd(USART1, ENABLE);
我还是死在了这里求指教
而且我单独直接使用USART_SendData这个函数发送也不行
根据参考资料中提到的USART_FLAG_TXE的作用,可以判断出程序一直卡在while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)这一行是因为发送缓冲区还未空,所以无法向其中补充新的数据。因此,我们可以通过以下步骤来解决问题:
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART1
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送缓冲区为空
USART_SendData(USART1, data);//向发送缓冲区写入数据
或者使用中断的方式发送数据,等待缓冲区为空的中断,例如:
NVIC_InitTypeDef NVIC_InitStructure;
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能中断
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //指定中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
在USART1_IRQHandler函数中检查USART_FLAG_TXE是否为SET,如果是,则调用USART_SendData函数向发送缓冲区写入数据。
while (1) {
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送缓冲区为空
USART_SendData(USART1, data);//向发送缓冲区写入数据
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待数据发送完成
}
USART1时钟使能了吗?