stm32 hal库uart中断形式发送函数
时间: 2023-05-25 17:03:08 浏览: 61
这里给出一个基于STM32 HAL库的UART中断发送函数示例:
```c
#define UART_TX_BUF_SIZE 128
static uint16_t uart_tx_head = 0;
static uint16_t uart_tx_tail = 0;
static uint8_t uart_tx_buf[UART_TX_BUF_SIZE];
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
if (uart_tx_head != uart_tx_tail) {
// 继续发送下一批数据
uint8_t data = uart_tx_buf[uart_tx_tail++];
uart_tx_tail %= UART_TX_BUF_SIZE;
HAL_UART_Transmit_IT(huart, &data, 1);
}
}
}
void uart_send_async(UART_HandleTypeDef *huart, const uint8_t *data, uint16_t len) {
// 将数据拷贝到发送缓冲区
for (uint16_t i = 0; i < len; i++) {
uart_tx_buf[uart_tx_head++] = data[i];
uart_tx_head %= UART_TX_BUF_SIZE;
}
// 如果当前没有在发送数据,则启动发送
if (!huart->gState) {
uint8_t data = uart_tx_buf[uart_tx_tail++];
uart_tx_tail %= UART_TX_BUF_SIZE;
HAL_UART_Transmit_IT(huart, &data, 1);
}
}
```
这个函数支持将数据异步发送出去,发送时不会阻塞主程序。在发送数据时,先将数据拷贝到发送缓冲区中,然后检查UART是否已经在发送数据。如果没有在发送,则启动发送;如果正在发送,则等待发送完成后继续发送。
当UART传输完成时,会触发`HAL_UART_TxCpltCallback`回调函数。此时检查一下缓冲区是否还有数据需要发送,如果有,则继续发送下一批数据。如果没有,说明已经全部发送完成,结束发送。