1、配置cube中断模式:
2、初始化代码:
__HAL_UART_ENABLE_IT(&RT_UARTDEBUG,UART_IT_RXNE); //接收中断使能,自己可以判断接收标志,第一种中断方式
__HAL_UART_ENABLE_IT(&RT_UARTDEBUG,UART_IT_IDLE); //空闲中断使能
rt_sem_init(&(shell_rx_sem), "shell_rx", 0, 0); //初始化串口中断 fish接收数据的信号量
/******************************************************************************************
*** 函数名称: user_uart1IT_ReceiveCallback
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:用户串口1接收回调函数
*** 编者 时间 版本
*** 王露 2020/6/23 V0.1
******************************************************************************************/
void user_uartFishIT_ReceiveCallback(void)
{
static uint8_t* pBuff = uartFish_data.uart_rxbuff;
static uint8_t size_cnt=0;
uint8_t receive_dat;
if(__HAL_UART_GET_FLAG(&RT_UARTDEBUG, UART_FLAG_RXNE) != RESET) //uart rx flag
{
receive_dat = (uint16_t) READ_REG(RT_UARTDEBUG.Instance->DR);
*(pBuff++) = receive_dat;
size_cnt++;
__HAL_UART_CLEAR_FLAG(&RT_UARTDEBUG,UART_FLAG_RXNE);
rt_sem_release(&shell_rx_sem); //发送信号量
pBuff = uartFish_data.uart_rxbuff; //接收数据后单字节发送,所以此处一直赋值
}
if(__HAL_UART_GET_FLAG(&RT_UARTDEBUG, UART_FLAG_IDLE) != RESET) //uart idle flag
{
uartFish_state.bits.interrupt_idle = ON; //set idle flag
uartFish_data.uart_count = size_cnt;
receive_dat = (uint16_t) READ_REG(RT_UARTDEBUG.Instance->DR); //clear reg
size_cnt=0;
pBuff = uartFish_data.uart_rxbuff;
__HAL_UART_CLEAR_IDLEFLAG(&RT_UARTDEBUG);
}
}
user_uartFishIT_ReceiveCallback();
if(uartFish_data.uart_rxbuff[0] != ON) //fish串口接收到一个字符后返回数据
{
rt_sem_take(&shell_rx_sem, RT_WAITING_FOREVER); //等待信号量
ch = uartFish_data.uart_rxbuff[0]; //赋值函数返回数据
}
typedef struct {
uint8_t uart_value; //串口接收缓存一个数据变量
uint8_t uart_count; //串口接收计数
uint8_t uart_control; //串口其他操作控制
uint8_t uart_rxbuff[UART_BUFFLENGTH]; //串口接收缓存数组
uint8_t uart_txbuff[UART_BUFFLENGTH]; //串口发送缓存数组
}Uart_TypeDef;
typedef union
{
unsigned int interface;
struct
{
unsigned char interrupt_idle :1; //空闲中断标志
}bits;
}Uart_sta;
extern Uart_TypeDef uartFish_data; //串口1 fish调试口定义
extern Uart_sta uartFish_state;