stm32中外部中断IO口设置后,会影响同一组的其他引脚吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32中外部中断IO口设置后,会影响同一组的其他引脚吗?相关的知识,希望对你有一定的参考价值。

我出现的问题是:
设置PB8为外部中断,用按键控制,外部接上拉电阻方式。PA8为液晶显示的SCL(PA11是SDA)。当我没有使用中断的方式的时候,液晶显示正常,刷屏速度很快,根据示波器显示PA8可以达到50KHz。
但是当我设置了PB8为外部中断的时候,液晶显示就出问题,依然根据程序显示,但是非常慢。外部中断功能正常。经过调试发现这个时候PA8最多只能达到50Hz。可以更慢,但是不能更快。而PA11最高可以达到50KHz。
如果系统初始化中不执行EXTIX_Init(void),液晶显示就很正常。
以下是外部中断和液晶显示IO口的配置程序。
void EXTIX_Init(void)

//IO口初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB.8 端口配置, 上拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(GPIOB,GPIO_Pin_8); //PB.8 上拉输入

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟,辅助功能IO时钟使能
//GPIOB.8 中断线以及中断初始化配置,下降沿触发
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);
//中断线上中断初始化
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //初始化中断线参数
//中断优先级初始化
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);

void LCD_Init(void)

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA.8 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PA.11 端口配置, 推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOA,GPIO_Pin_11); //PA.11 输出高

于是我又进一步调试,逐条屏蔽void EXTIX_Init(void)里面的语句。发现如果只屏蔽
“EXTI_InitStructure.EXTI_LineCmd = ENABLE;”这一句的时候,液晶屏也会正常,但是外部中断不响应。
感觉外部中断PB8启用后,影响了PA8脚的速度。
请大虾指点。
主函数里面的初始化函数
void Sys_Init(void)

SystemInit();
EXTIX_Init(); //外部中断初始化
delay_init(); //延时初始化
PORT_Init();
LCD_Intial();//初始化LCD

看你的配置,很明显是 GPIO 模拟I2C操作。
一旦中断打断了I2C时序,很哟可能不正常(比如读不到ACK的情况)。
建议你在LCD更新数据函数里面, 关键操作之前把EXIT关闭,操作完成后再打开。至于那个是关键操作,仔细看你的LCD手册里面关于通信时序的部分。
估计你的中断就是个按键 ,其实完全可以用查询方式读取按键状态。
参考技术A 端口肯定是多功能复用端口,要到相应的寄存器进行设置。
你那些程序都是些写好的函数,最好是用底层的寄存器进行编写程序。
参考技术B 真不知道怎么回事,经你这一说,应用时真得注意了

stm32 外部中断打断PWM

我用定时器3输出PWM 模式是PWM1。想用外部中断0 PA0口中断去调节TIM_SetCompare2(tim3,dt),结果无法进入外部中断0的中断服务程序,可是当我屏蔽掉PWM的初始化和TIM的初始化时就可以进去。

你看看你PWM初始化和TIM初始化程序,有没有多余操作的地方,比如RCC或者IO口配置方面的操作到PA0了 参考技术A 把外部中断的优先级和分组,触发方式好好检查 参考技术B 提高外部中断0的中断优先级追问

抢占式和响应式都是0 也不行 可是我把主函数中NVIC和TIM的初始化程序调用的顺序颠倒了下就行了 正在分析中……

追答

原因有很多,以后问程序问题最好直接提交代码!

原因有很多,以后问程序问题最好直接提交代码!

参考技术C 楼主请问你这个问题是怎么解决的,我也遇到这个问题了。 参考技术D 需要帮你做设计吗

以上是关于stm32中外部中断IO口设置后,会影响同一组的其他引脚吗?的主要内容,如果未能解决你的问题,请参考以下文章

stm32 外部中断打断PWM

STM32F030 IO口外部中断应用

STM32外部中断EXTI简介

stm32的双向io口

stm32板的usart2设置与usart1有啥区别啊

stm32读取gpio高低电平速度