编写stm32f103串口中断服务代码,能够完整接受数据
时间: 2024-05-13 18:20:51 浏览: 14
以下是基于HAL库的STM32F103串口中断服务代码,能够完整接收数据:
```c
#include "stm32f1xx_hal.h"
#define RX_BUFFER_SIZE 256
UART_HandleTypeDef huart1;
uint8_t rx_buffer[RX_BUFFER_SIZE];
uint16_t rx_index = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
if (rx_index < RX_BUFFER_SIZE - 1 && huart->RxXferSize == 1)
{
rx_buffer[rx_index++] = huart->pRxBuffPtr[0];
}
else
{
HAL_UART_DMAStop(&huart1);
}
}
}
int main(void)
{
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
HAL_UART_Receive_DMA(&huart1, rx_buffer, RX_BUFFER_SIZE);
while (1)
{
// Do something with received data
HAL_Delay(1000);
}
}
```
该代码使用DMA方式接收串口数据,并在接收完成时触发中断回调函数`HAL_UART_RxCpltCallback`,将接收到的数据存储在`rx_buffer`中。如果接收缓冲区已满或接收到的数据长度为0,则停止DMA接收。在主循环中,可以对接收到的数据进行处理。