stm32 电平转换电路问题 请教
硬件连接:底板-连接器J6-75lvc4245-stm32.如图所示
软件配置:JCR/JCL配置为上拉,下降沿触发中断
实现功能:JCR/JCL检测到下降沿时执行中断函数
实际问题:1.不连底板,75lvc4245悬空,JCR/JCl均为低电平并不为默认的上拉
2. 将JCR接到5v,测得JCR电压4.93, cR电压1.33,接地时对应 0、0
将JCL接到5v, 测得JCL电压5.00, cL电压 3.27,接地时对应 0、0
JCR转换异常,无法中断;虽然JCL制造出下降沿,仍然不能进入中断。
将输出也断开不连,是否跟负载电流有些关系
输入是底板,输出到stm32,输出咋断开?
STM32支持兼容5V的电平的
Up to 112 fast I/O ports
- 51/80/112 I/Os,all mappable on 16 external interrupt vectors and almost all 5V-tolerant
可能是STM32的IO口配置有问题。
感觉是小编STM32没配置对
而且STM32的数字管脚能扛5V的
怎么叫没配置对?下面是我的io端口配置。STM32大部分管脚兼容5v,第一次做板,出于谨慎和方便才用的电路转换电路。
void SENSOR_GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//U101, L-H
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; //前方障碍物
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉引脚,检测障碍物
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
//CLH
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ; //左方碰触开关
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉引脚,检测障碍物
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
//CRH
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ; //右方碰触开关
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉引脚,检测障碍物
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_13);
//U81,U87,U78,U714 L-H
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7| GPIO_Pin_8|GPIO_Pin_10| GPIO_Pin_12 ; //防跌落
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉引脚,检测障碍物
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ; //悬空碰触开关
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉引脚,检测障碍物//
GPIO_Init(GPIOD, &GPIO_InitStructure);
//J162(H_PW)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ; //红外接收
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
GPIO_Init(GPIOD, &GPIO_InitStructure);
// //J64(H_PW)
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ; //右侧光电编码
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
// GPIO_Init(GPIOD, &GPIO_InitStructure);
//J34(H_PW)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ; //左侧光电编码
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
GPIO_Init(GPIOE, &GPIO_InitStructure);
//J64(H_PW)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; //右侧光电编码
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
是的,第一次做电路板,出于谨慎才用电路转换芯片
现在测试时没有加底板。直接使用杜邦线将CR/CL接5v,然后接地,制造下降沿进入中断,正常进入中断函数;问题是拔掉地线,插向5v脚时又中断一次。貌似拔插过程中出现不确的电平。我的IO配置如下
void SENSOR_GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//U101, L-H
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; //前方障碍物
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉引脚,检测障碍物
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
//CLH
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ; //左方碰触开关
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉引脚,检测障碍物
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
//CRH
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ; //右方碰触开关
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉引脚,检测障碍物
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_13);
//U81,U87,U78,U714 L-H
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7| GPIO_Pin_8|GPIO_Pin_10| GPIO_Pin_12 ; //防跌落
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉引脚,检测障碍物
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ; //悬空碰触开关
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉引脚,检测障碍物//
GPIO_Init(GPIOD, &GPIO_InitStructure);
//J162(H_PW)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ; //红外接收
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
GPIO_Init(GPIOD, &GPIO_InitStructure);
//J34(H_PW)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ; //左侧光电编码
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
GPIO_Init(GPIOE, &GPIO_InitStructure);
//J64(H_PW)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; //右侧光电编码
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
中断配置
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* Configure one bit for preemption priority */
/* 优先级组 说明了抢占优先级所用的位数,和子优先级所用的位数 在这里是1, 7 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
NVIC_InitStructure.NVIC_IRQChannel =EXTI9_5_IRQn; //外部中断9-5
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn ; //外部中断15-10
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource7); //障碍物中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource9);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource10);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource11);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource12);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource13);
EXTI_InitStructure.EXTI_Line = EXTI_Line7; //PC7 跌落
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Rising; //升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line8; //PC9跌落
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line9; //PC9 左碰触
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line10; //pc10 跌落
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line11; //U101 FRONT检测状态
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line12; // PC12 跌落
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line13; //右触
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //配置结束后引起了中断
现在测试时没有加底板。直接使用杜邦线将CR/CL接5v,然后接地,制造下降沿进入中断,正常进入中断函数;问题是拔掉地线,插向5v脚时又中断一次。
现在测试时没有加底板。直接使用杜邦线将CR/CL接5v,然后接地,制造下降沿进入中断,正常进入中断函数;问题是拔掉地线,插向5v脚时又中断一次。貌似拔插过程中出现不确的电平。我的IO配置如下
void SENSOR_GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//U101, L-H
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; //前方障碍物
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉引脚,检测障碍物
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
//CLH
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ; //左方碰触开关
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉引脚,检测障碍物
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
//CRH
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ; //右方碰触开关
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉引脚,检测障碍物
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_13);
//U81,U87,U78,U714 L-H
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7| GPIO_Pin_8|GPIO_Pin_10| GPIO_Pin_12 ; //防跌落
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉引脚,检测障碍物
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ; //悬空碰触开关
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉引脚,检测障碍物//
GPIO_Init(GPIOD, &GPIO_InitStructure);
//J162(H_PW)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ; //红外接收
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
GPIO_Init(GPIOD, &GPIO_InitStructure);
//J34(H_PW)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ; //左侧光电编码
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
GPIO_Init(GPIOE, &GPIO_InitStructure);
//J64(H_PW)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; //右侧光电编码
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由高到脉冲
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
中断配置
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* Configure one bit for preemption priority */
/* 优先级组 说明了抢占优先级所用的位数,和子优先级所用的位数 在这里是1, 7 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
NVIC_InitStructure.NVIC_IRQChannel =EXTI9_5_IRQn; //外部中断9-5
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn ; //外部中断15-10
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource7); //障碍物中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource9);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource10);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource11);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource12);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource13);
EXTI_InitStructure.EXTI_Line = EXTI_Line7; //PC7 跌落
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Rising; //升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line8; //PC9跌落
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line9; //PC9 左碰触
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line10; //pc10 跌落
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line11; //U101 FRONT检测状态
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line12; // PC12 跌落
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line13; //右触
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //配置结束后引起了中断
现在测试时没有加底板。直接使用杜邦线将CR/CL接5v,然后接地,制造下降沿进入中断,正常进入中断函数;问题是拔掉地线,插向5v脚时又中断一次。
没有去抖电路,插拔出现中断触发一点都不奇怪
建议加上拉,最好能加上简单rc电路
恩,明白了。回去实验。
小编在做什么项目,我现在也在做STM32的小项目,能不能交流下
智能小车。
好吧,我做的比较简单,就接了一个传感器