回调函数也写一下
时间: 2023-06-30 07:26:27 浏览: 81
回调函数讲解
串口通信中常用的回调函数有接收中断回调函数和发送完成回调函数。下面是STM32F103C8T6串口1接收中断回调函数和发送完成回调函数的示例代码:
```
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
// 接收中断回调函数
// 从USART1接收一个字节的数据,并进行相应的处理
uint8_t data = USART_ReceiveData(USART1);
// TODO: 进行数据处理
}
}
void USART1_TxCpltCallback(void)
{
// 发送完成回调函数
// TODO: 进行发送完成后的操作
}
```
以上代码中,USART1_IRQHandler是USART1的中断处理函数,通过USART_GetITStatus函数判断是否为接收中断,并通过USART_ReceiveData函数接收一个字节的数据进行相应的处理。USART1_TxCpltCallback是USART1的发送完成回调函数,当USART1发送完成后,会自动调用此函数进行发送完成后的操作。需要注意的是,这两个回调函数需要在USART1初始化函数中进行注册,具体方法如下:
```
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能USART1接收中断
USART_ITConfig(USART1, USART_IT_TC, ENABLE); // 使能USART1发送完成中断
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); // 使能USART1空闲中断
USART_ITConfig(USART1, USART_IT_ERR, ENABLE); // 使能USART1错误中断
// 注册USART1的中断处理函数和发送完成回调函数
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // 使能USART1发送寄存器空中断
USART_ClearFlag(USART1, USART_FLAG_TC); // 清除USART1发送完成标志位
// 注册USART1的发送完成回调函数
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
USART1->ICR |= USART_ICR_TCCF; // 清除USART1发送完成标志位
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能USART1接收中断
```
以上代码中,通过USART_ITConfig函数和NVIC_Init函数使能USART1的中断和设置中断优先级。然后,通过USART_ClearFlag函数清除USART1的发送完成标志位,并通过USART_ITConfig函数和USART1->ICR |= USART_ICR_TCCF来注册USART1的发送完成回调函数。最后,通过USART_ITConfig函数使能USART1的接收中断。
阅读全文