微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > 硬件电路设计讨论 > stm32 电平转换电路问题 请教

stm32 电平转换电路问题 请教

时间:10-02 整理:3721RD 点击:

硬件连接:底板-连接器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的小项目,能不能交流下

智能小车。

好吧,我做的比较简单,就接了一个传感器

上一篇:熔丝会起作用吗
下一篇:LED驱动电感小

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top