stm32中外部中断IO口设置后,会影响同一组的其他引脚吗?
我出现的问题是:设置PB8为外部中断,用按键控制,外部接上拉电阻方式。PA8为液晶显示的SCL(PA11是SDA)。当我没有使用中断的方式的时候,液晶显示正常,刷屏速度很...
我出现的问题是:
设置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
} 展开
设置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
} 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询