
将PA8,PA15,PB5,PB6,PE8,PE9配置为外部中断,只有PA8,PA15,PE9管脚上产生的中断信号可以被响应,其他管脚上的中断信号响应不到。有使用FREE RTOS。 时钟配置: void Clock_Init(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FLITF,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | \ RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | \ RCC_AHBPeriph_GPIOE , ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 | RCC_APB1Periph_SPI3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); } 中断管脚配置: void Ext_Int_Port_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure PA8, PA15 as input Pull-UP */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA,&GPIO_InitStructure); /* Configure PB5, PB6 as input Pull-UP */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB,&GPIO_InitStructure); /* Configure PE8, PE9 as input Pull-UP */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOE,&GPIO_InitStructure); } 中断线连接配置,中断模式、触发方式、使能配置 void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; /*connect PA8,PA15 to EXTI*/ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource8 | EXTI_PinSource15); /*connect PB5,PB6 to EXTI*/ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource5 | EXTI_PinSource6); /*connect PE8,PE9 to EXTI*/ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource8 | EXTI_PinSource9); /*Config */ EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line6 | EXTI_Line8 | EXTI_Line9 | EXTI_Line15; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } 中断向量表配置: void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x08000000); /* Configure the NVIC Preemption Priority Bits*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 发现程序中配置PB5,PB6连接EXIT Line 5,line6,没有配置成功,因为在PA5、PA6上施加触发信号时程序能响应中断。说明SYSCFG_EXTICR2寄存器没有配置成功(依然为默认值000),所以在PA5、PA6上的中断信号能被响应。同样,如果仅配置PE8连接EXIT line8,而不配置PA8连接EXIT line8,只能响应到PA8上的中断,而不能响应PE8上的中断。 说明SYSCFG模块没正常工作。 但是如果SYSCFG模块没工作,PE9上的中断为什么能被响应?为什么PE9能配置成功,PE8、PB5、PB6就不能配置成功? |
STM32F3 硬件I2C 驱动OLED 求助!!
STM32F303使用定时器触发双ADC常规同步采样模式
哪位大哥传下STM32F334 Nucleo的工程模板给我下
STM32F334 不能串口下载
关于STM32F334的HRTIM分辨率问题
STM32F303+LCD1602程序问题,不只为什么点不亮?
STM32F334的ADC使用问题
STM32F334 HRTIM形成移相全桥波形问题
有用过STM32F373VC的板子么 iic 例程不好使
STM32F3 ADC外部触发采样达不到7.2MSPS
原来是EXTI_PinSourcex相互之间不能“按位或”运算。
改成这样就行了:
/*connect PA8 to EXTI*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource8);
/*connect PA15 to EXTI*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource15);
/*connect PB5 to EXTI*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource5);
/*connect PB6 to EXTI*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource6);
/*connect PE8 to EXTI*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource8);
/*connect PE9 to EXTI*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource9);
之前只检查了EXTI_Linex能不能“按位或”,而没有检查EXTI_PinSourcex,哎......
不会的。
STM32F37x标准库的头文件stm32f37x_exti.h中是这样定义的:
#define EXTI_Line5 ((uint32_t)0x00000020) /*!< External interrupt line 5 */
#define EXTI_Line6 ((uint32_t)0x00000040) /*!< External interrupt line 6 */
#define EXTI_Line8 ((uint32_t)0x00000100) /*!< External interrupt line 8 */
#define EXTI_Line9 ((uint32_t)0x00000200) /*!< External interrupt line 9 */
#define EXTI_Line15 ((uint32_t)0x00008000) /*!< External interrupt line 15 */
另外,即使真的是只配置0x0F的中断,那么PA5,PA6,PA8,PE9上的中断又怎么能响应?我感觉是SYSCFG模块这里有问题。原先PE9上的中断信号也是响应不到的,当开启SYSCFG模块的时钟时,PE9上的中断信号才能被响应到。但是其他管脚(PB5,PB6,PE8)上的中断还是不能响应。
/*Config */
EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line6 | EXTI_Line8 | EXTI_Line9 | EXTI_Line15;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
上面这个不就是吗?
是的,没关系,可以分时复用。
那么LINE=00000101|00000110|00001000|00001001|00001111
结果是LINE=00001111=0x0F
也就是配置的0x0F的中断,其他的中断没有配置?
EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line6 | EXTI_Line8 | EXTI_Line9 | EXTI_Line15;
附件是stm32f37x_dsp_stdperiph_lib中的LIBRARIES。整个库太大了,传不上来。
Libraries.rar
2015-7-13 08:57 上传
点击文件名下载附件
下载积分: ST金币 -18.07 MB, 下载次数: 14, 下载积分: ST金币 -1
没有。
PE8和PA8连接的是同一个EXIT_Line,没考虑到同一时刻只能有一个端口连接的EXIT_Line,尽管可以分时复用,但对于随机出现的外部中断来说没有意义。所以不能将PE8和PA8一并配置到Exit_Line上。