stm32标准库回调函数怎么写
时间: 2023-06-28 16:05:49 浏览: 796
stm32标准版库函数
在使用 STM32 标准库时,常常需要使用回调函数来实现中断处理、DMA 传输完成等操作。下面以 EXTI 中断为例,介绍如何编写回调函数:
1. 首先需要在程序中定义一个函数指针类型,用于存储回调函数的地址:
```c
typedef void (*EXTI_CallbackFunc)(void);
```
2. 然后在程序中定义一个回调函数变量,用于存储回调函数的地址:
```c
EXTI_CallbackFunc EXTI_Callback;
```
3. 在使用 EXTI 中断时,需要设置中断触发方式、中断优先级等参数,并且注册回调函数。在这个例子中,我们使用 EXTI0 中断作为示例:
```c
// 设置中断触发方式为上升沿触发
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
// 设置中断优先级为最高优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 注册回调函数
EXTI_Callback = EXTI0_Callback;
```
4. 编写回调函数,当 EXTI0 中断触发时,该函数会被执行:
```c
void EXTI0_Callback(void)
{
// 执行中断处理操作
}
```
完整代码示例:
```c
#include "stm32f10x.h"
typedef void (*EXTI_CallbackFunc)(void);
EXTI_CallbackFunc EXTI_Callback;
void EXTI0_Callback(void)
{
// 执行中断处理操作
}
int main(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 设置中断触发方式为上升沿触发
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// 设置中断优先级为最高优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 注册回调函数
EXTI_Callback = EXTI0_Callback;
while (1)
{
// 主循环
}
}
// EXTI0 中断处理函数
void EXTI0_IRQHandler(void)
{
// 判断是否发生 EXTI0 中断
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
// 执行回调函数
if (EXTI_Callback != NULL)
{
EXTI_Callback();
}
// 清除 EXTI0 中断标志位
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
```
阅读全文