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了??
能不能解释下, 答了再加分
问题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的外部中断问题的主要内容,如果未能解决你的问题,请参考以下文章