最近使用HAL调试串口的程序,定位到一个很奇怪的问题!就是我把RXNEIE
清零之后,无法使用printf函数。(因为我们一般做串口中断程序处理的时候,接收
到完整字符串之后,先把中断关闭为了防止接收其他字符,等我们做完处理之后,再把串口接收中断开启。)
下面来看我的测试代码!
[mw_shl_code=applescript,true] while (1)
{
USART2->CR1 &= 0xdf;
printf("fuck you!");
delay_ms(100); }[/mw_shl_code]
在执行完while里面的第一行代码,再去执行printf函数。
就会一直停在这一句while ((USART2->SR & 0X40) == 0); //循环发送,直到发送完毕
如果你把第一行代码注释掉,就能够正常的发送。
接收中断和发送功能有什么关系,真的蛮奇怪的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
[mw_shl_code=applescript,true]void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_InitStructure;
if( huart->Instance == USART2 )
{
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA的时钟
__HAL_RCC_USART2_CLK_ENABLE(); //使能USART2的时钟
//发送引脚的配置
GPIO_InitStructure.Pin = UART2_TX;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStructure.Alternate = GPIO_AF7_USART2; //复用映射
HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
//接收引脚的配置
GPIO_InitStructure.Pin = UART2_RX;
// GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
// GPIO_InitStructure.Pull = GPIO_NOPULL;
// GPIO_InitStructure.Alternate = GPIO_AF7_USART2; //复用映射
HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
//NVIC的配置
//中断分组已经在HAL_Init()当中配置成功,是2
HAL_NVIC_SetPriority(USART2_IRQn, 1, 1); //设置中断优先级
HAL_NVIC_EnableIRQ(USART2_IRQn); //使能中断通道
}
}
void UART2_Init(uint32_t Baudrate) //串口2的配置
{
UART_Structure.Instance = USART2;
UART_Structure.Init.BaudRate = Baudrate;
UART_Structure.Init.WordLength = UART_WORDLENGTH_8B; //8位数据
UART_Structure.Init.StopBits = UART_STOPBITS_1; //1位停止位
UART_Structure.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流控制
UART_Structure.Init.Mode = UART_MODE_TX_RX; //发送和接收模式
UART_Structure.Init.Parity = UART_PARITY_NONE; //不使用奇偶校验
HAL_UART_Init(&UART_Structure); //这个函数会调用HAL_UART_MspInit
//UART_Structure这个结构体变量已经指向了UART2
//HAL_UART_Receive_IT(&UART_Structure,&UARTRxBuffer,1);//使能串口接受中断
USART2->CR1 |= (uint8_t)0x20; //将RXNEIE置为1,开启接收中断
}
[/mw_shl_code]
一周热门 更多>