我用的这个片子stm32L053比较新,固件库函数跟f系列V3.50有很大不同。。。串口部分参考了原子个代码,但是stm32串口只能发送数据到上位机,不能接收上位发出来的数据。
一下是配置代码:
void USART1_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOB时钟
__GPIOB_CLK_ENABLE();
//USART1_TX PB.6
GPIO_InitStruct.Pin = GPIO_PIN_6; //PB.6
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //复用推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF0_USART1; //连接到USART1的外设
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//USART1_RX PB.7
GPIO_InitStruct.Pin = GPIO_PIN_7; //PB .7
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //浮空输入
GPIO_InitStruct.Alternate = GPIO_AF0_USART1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void USART_Init(void)
{
USART1_GPIO_Init();//串口IO初始化
//使能串口时钟
__USART1_CLK_ENABLE();
UartHandle.Instance = USART1;
UartHandle.Init.BaudRate = 9600;
UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
UartHandle.Init.StopBits = UART_STOPBITS_1;
UartHandle.Init.Parity = UART_PARITY_NONE;
UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&UartHandle);
__HAL_UART_ENABLE(&UartHandle);//使能串口
HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);//中断优先级配置
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能串口中断
__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);//使能接收中断
}
串口中断:
//串口中断接收
void USART1_IRQHandler(void)
{
uint8_t Res;
HAL_UART_IRQHandler(&UartHandle);
if(__HAL_UART_GET_IT(&UartHandle, UART_IT_RXNE) != RESET) //
{
USART1->RQR |= 0x08;//清除 RXNE
Res =USART1->RDR;//USARTx_RX_Data(&UartHandle);
printf("Faiure !!!\n\r\n");//测试有没有进入中断
if((USART_RX_STA&0x8000)==0)//
{
if(USART_RX_STA&0x4000)//
{
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;//
}
}
}
}
}
我用示波器测量,发现TX、RX都有信号。
每次按下复位按键的时候,串口才能接收一次数据,以后数据就无法接受,只能发送数据到PC。我怀疑是没有清除串口中断,但是,我又加了USART1->RQR |= 0x08;//清除 RXNE,貌似页不行
请问一下大侠,你们碰到这个情况了么??????在线求助
|