STM32的外部中断问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32的外部中断问题相关的知识,希望对你有一定的参考价值。

1.EXTI0~EXTI15对应引脚是一一对应的还是通道自己设的?怎么知道哪个引脚是哪个通道?
2.外部中断处理函数一般都有:
void EXTI_Configuration(void)

EXTI_InitTypeDef EXTI_InitStructure; //外部设备中断恢复默认参数
两句是什么意思??
3. 如果我的主程序调用了几个函数库,如:stm32f10x_exti、stm32f10x_gpio、stm32f10x_nvic,
那么我的主函数里用不到库里的所有函数,有的子函数就定义了没有被调用,在C语言单片机里不是说如果定义了没有调用函数会导致编译器错误吗?? 那在SDK里编译器是怎么处理未调用的函数的??

4.MDK中STM32固件库中为什么定义寄存器结构typedef struct GPIO_typedef ,然后用指针GPI0_X->ODR,
这样就能设置I/O输出了?我在MDK里没有找到ODR的地址定义啊?而且每个端口的ODR应该是不同的,为什么通过GPI0_X->ODR就能访问相应的ODR了??
能不能解释下, 答了再加分

参考技术A 问题1,EXTI0~EXTI15每个对应于一组(PA,PB,PC,PD..)1,在用外部中断的时候如用EXTI4(外部中断4)需要配置PA4还是PB4...这几组io口的第四个管脚作为输入,只能选择一个。
问题2,void EXTI_Configuration(void) 中断初始化函数
EXTI_InitTypeDef EXTI_InitStructure; 定义EXTI_InitStructure为中断配置的结构体,然后对结构体内容进行配置之后初始化外部中断。

问题3,你要用什么加什么外设,外设的函数库都是以头文件的格式加入(.h)文件,编译的时候编译器搜索加入的头文件包含的内容,有就编译没有用到的不编译进去,你说的情况之后再加入主函数里面多余的子函数才报错。
有问题可以补充。
不是SDK吧 应该是MDK本回答被提问者采纳

stm32外部按键中断无法退出中断问题

我使用按键中断控制我的LED的状态,当按键按下时,灯亮,按键按上时,灯却灭不了(弹簧按键),我想是不是因为我的中断没处理好,请大神指教。芯片stm32103vbt6,库文件是cube1.2 。代码如下。LED灯引脚PE13,按键(USER_BUTTON_PIN)引脚PE2。
static GPIO_InitTypeDef GPIO_InitStruct;

void SystemClock_Config(void);

static void EXTI2_IRQHandler_Config(void)

GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOE_CLK_ENABLE();

GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin = GPIO_PIN_2;
HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);

/* Enable and set EXTI line 0 Interrupt to the lowest priority */
HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);


int main(void)


HAL_Init();

/* Configure the system clock to 64 MHz */
SystemClock_Config();

/* -1- Enable GPIO Clock (to be able to program the configuration registers) */
LED2_GPIO_CLK_ENABLE();

/* -2- Configure IO in output push-pull mode to drive external LEDs */
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Pin = LED2_PIN;
HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);
HAL_GPIO_WritePin(LED2_GPIO_PORT,LED2_PIN, GPIO_PIN_SET);/*灯灭*/

EXTI2_IRQHandler_Config();

while (1)



void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

if (GPIO_Pin == USER_BUTTON_PIN)

/* 灯亮*/
HAL_GPIO_WritePin(LED2_GPIO_PORT,LED2_PIN, GPIO_PIN_RESET);




中断处理函数
void EXTI2_IRQHandler(void)

HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN);


void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

/* EXTI line interrupt detected */
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)

HAL_GPIO_EXTI_Callback(GPIO_Pin);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);


你这进入中断,没有清楚中断标志位。

STM32_EXIT中断:
http://blog.csdn.net/ybhuangfugui/article/details/51378856

http://blog.csdn.net/ybhuangfugui追问

最后那一句,__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);就是清除中断标志位啊?不知道我说得对不

参考技术A 中断肯定是进去了,但是中断程序中没有关灯的命令行,可以试试这个
if (GPIO_Pin == USER_BUTTON_PIN)

/* 灯亮*/
HAL_GPIO_WritePin(LED2_GPIO_PORT,LED2_PIN, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED2_GPIO_PORT,LED2_PIN, GPIO_PIN_SET);/* 灯灭*/

以上是关于STM32的外部中断问题的主要内容,如果未能解决你的问题,请参考以下文章

stm32外部按键中断无法退出中断问题

stm32外部中断这程序编译没问题,但触发不了外部中断,卡了一天了

STM32外部中断EXTI简介

STM32外部中断

stm32 外部中断 能读gpio值吗

STM32的“外部中断”和“事件”怎么理解