stm32中断调用流程

USART1_IRQHandler(void)(中断服务函数)

-> HAL_UART_IRQHandler(UART_HandleTypeDef *huart)(中断处理函数)

-> UART_Receive_IT(UART_HandleTypeDef *huart) (接收函数)

-> HAL_UART_RxCpltCallback(huart);(中断回调函数)

  1. HAL_UART_IRQHandler(UART_HandleTypeDef *huart) 是UART中断处理函数,用于处理UART的中断事件。当UART模块触发中断时,该函数会被调用,并根据中断类型执行相应的操作。
  2. UART_Receive_IT(UART_HandleTypeDef *huart) 是接收函数,用于启动UART接收操作。它通过配置UART硬件相关寄存器和中断使能位,使得UART能够开始接收数据。一旦有数据到达,将触发接收中断,并调用中断回调函数。
  3. HAL_UART_RxCpltCallback(huart) 是中断回调函数,在UART接收完成后被自动调用。它是用户定义的函数,用于处理接收完成事件。在这个回调函数中,你可以对接收到的数据进行处理、解析或存储等操作,以及触发下一次接收操作。
  4. HAL_UART_Transmit() 函数用于通过UART发送数据。它接受以下参数:
    huart:指向UART_HandleTypeDef结构体的指针,表示要使用的UART外设。
    pData:指向要发送的数据缓冲区的指针。
    Size:要发送的数据的字节数。
    Timeout:发送超时时间,以毫秒为单位。
    该函数将数据从指定的缓冲区发送到UART外设。如果发送成功,则返回 HAL_OK,否则返回其他错误代码。在发送过程中,函数会根据指定的超时时间等待发送完成或超时。

由于stm32有很多外设,为降低功耗,每个外设都对应着一个时钟。在芯片刚刚上电时,这些时钟都是被关闭的。如果想要外设工作,必须把相应的时钟打开。

即当GPIO口复用USART进行通讯时,必须要先使能GPIO的时钟,然后再使能具体外设的时钟(USART的时钟)!!!

在STM32的串口中断服务函数中实现队列缓冲接收,可以按照以下步骤进行操作:

  1. 创建一个缓冲区队列,用于存储接收到的数据。这可以是一个循环队列或者使用其他合适的数据结构。
  2. 在串口中断服务函数中,读取接收到的数据,并将其放入缓冲区队列中。你可以使用适当的API函数来读取和写入数据。
  3. 在主程序中,从缓冲区队列中读取数据进行处理。可以使用轮询方式或者定时检查队列来获取数据。

下面是一个简单的示例代码,演示了如何在STM32串口中断服务函数中实现队列缓冲接收(以STM32Cube HAL库为例):

#define BUFFER_SIZE 100

uint8_t rx_buffer[BUFFER_SIZE];
volatile uint16_t rx_buffer_head = 0;
volatile uint16_t rx_buffer_tail = 0;

/* UART Receive Complete Interrupt Handler */void USART1_IRQHandler(void)
{
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE))
{
rx_buffer[rx_buffer_head] = huart1.Instance->DR;
rx_buffer_head = (rx_buffer_head + 1) % BUFFER_SIZE;
}
}

/* Read data from buffer */uint16_t readFromBuffer(uint8_t* data, uint16_t len)
{
uint16_t bytesRead = 0;
while (bytesRead < len)
{
if(rx_buffer_head != rx_buffer_tail)
{
data[bytesRead] = rx_buffer[rx_buffer_tail];
rx_buffer_tail = (rx_buffer_tail + 1) % BUFFER_SIZE;
bytesRead++;
}
else
{
break; // No more data in buffer
}
}
return bytesRead;
}

int main(void)
{
/* Initialize USART1 and enable interrupt */
while(1)
{
uint8_t receivedData[10];
uint16_t numBytes = readFromBuffer(receivedData, sizeof(receivedData));
// Process received data
// ...
}
}

在这个例子中,rx_buffer数组用于存储串口接收到的数据,rx_buffer_head和rx_buffer_tail是指向缓冲区头部和尾部的索引。USART1_IRQHandler函数是UART的接收中断服务函数,它将接收到的数据存储到缓冲区队列中。readFromBuffer函数用于从缓冲区队列中读取数据并返回读取的字节数。主程序中使用while循环来不断从缓冲区中读取数据进行处理。

请注意,这只是一个简单的示例代码,实际应用中可能需要进一步优化和添加错误处理机制来确保数据的完整性和正确性。

相关推荐
weixin_452600693 小时前
如何为老化的汽车铅酸电池充电
开发语言·单片机·安全·汽车·电机·电源模块·充电桩
极客小张5 小时前
ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验
单片机·嵌入式硬件·mcu·物联网·机器人·硬件工程
XD7429716369 小时前
【TB作品】51单片机 Proteus仿真 超声波 LCD1602显示实验
嵌入式硬件·51单片机·proteus
赟赟、嵌入式11 小时前
linux RTC时钟时间出现了明显的偏移
linux·驱动开发·嵌入式硬件·实时音视频
是梅梅森11 小时前
GPIO配置-PIN_Speed的理解
stm32
Jack1530276827911 小时前
什么是上拉电阻器?上拉和下拉电阻的典型应用
stm32·单片机·嵌入式硬件·智能家居·医疗器械·新能源汽车充电枪锁
Anin蓝天(北京太速科技-陈)12 小时前
116-基于5VLX110T FPGA FMC接口功能验证6U CPCI平台
图像处理·嵌入式硬件·fpga开发
极客小张13 小时前
Zigbee智能家居数据中心:微信小程序实时掌控家居传感器信息
javascript·单片机·嵌入式硬件·物联网·硬件架构·硬件工程
Naiva13 小时前
单片机关键任务优先级的实现学习
单片机·嵌入式硬件·学习
XD74297163614 小时前
【TB作品】温湿度监控系统设计,ATMEGA16单片机,Proteus仿真
单片机·proteus·温湿度监控系统设计