2401_82834846 2024-02-19 12:39 采纳率: 100%
浏览 112
已结题

stm32f103c8t6芯片损坏原因


#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MatrixKey.h"

uint8_t num[16]={1,2,3,10,         //控制键盘
    4,5,6,11,                      //10表示调节继电器一的时间,11为暂停时间,12为继电器二的时间,13为启动
    7,8,9,12,                    //15表示关闭重新调节时间
  16,0,15,13                    //16表示为输入时间完毕
};

int main(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    while (1)
    {    
        OLED_Clear();
        MatrixKey_Init();
        Delay_ms(1000);
        uint8_t KeyNum,Num,dy;
        uint32_t sum1,sum2,sum3;
        unsigned char i,j,k,x;

        i=j=k=1;          //初始时间的位数
        sum1=5;           //继电器一连接时间
        sum2=5;           //暂停时间
        sum3=5;           //继电器二连接时间
        x=0;
        OLED_Init();
        OLED_ShowChinese(0, 0, "继电器一:");
        OLED_ShowChinese(0, 20, "停止:");
        OLED_ShowChinese(0, 40, "继电器二:");
        OLED_ShowNum(80, 0, sum1, i, OLED_8X16);
        OLED_ShowNum(80, 20, sum2, j, OLED_8X16);
        OLED_ShowNum(80, 40, sum3, k, OLED_8X16);
        OLED_Update();
        KeyNum=MatrixKey_GetValue();
        if (KeyNum>0)
        {                
            Num=num[KeyNum-1];
            if (Num<=13&&Num>=10)
            {    
            dy=Num;
            switch(dy)
            {    
                case 10:
                sum1=0;
                i=0;
                OLED_ShowChinese(80, 0, ";;");
                OLED_Update();
                Delay_ms(100);
                while (1)
                {
                    OLED_Init();
                    
                    KeyNum=MatrixKey_GetValue();
                    if (KeyNum>0)
                    {                
                        Num=num[KeyNum-1];
                        if(Num<=9)
                        {
                            sum1=sum1*10+Num;
                            i++;
                            OLED_ShowNum(80, 0, sum1, i, OLED_8X16);
                            OLED_Update();
                            Delay_ms(100);
                        }
                        
                        if(KeyNum==16)
                        {
                            break;
                        }
                    }
                }
                break;
                
                case 11:
                sum2=0;
                j=0;
                OLED_ShowChinese(80, 20, ";;");
                OLED_Update();
                Delay_ms(100);
                while (1)
                {
                    OLED_Init();
                    
                    KeyNum=MatrixKey_GetValue();
                    if (KeyNum>0)
                    {
                        Num=num[KeyNum-1];
                        if(Num<=9)
                        {
                            sum2=sum2*10+Num;
                            j++;
                            OLED_ShowNum(80, 20, sum2, j, OLED_8X16);
                            OLED_Update();
                            Delay_ms(100);
                        }
                        if(KeyNum==16)
                        {
                            break;
                        }
                    }
                }
                break;
                
                case 12:
                sum3=0;
                k=0;
                OLED_ShowChinese(80, 40, ";;");
                OLED_Update();
                Delay_ms(100);
                while (1)
                {
                    OLED_Init();
                    KeyNum=MatrixKey_GetValue();
                    if (KeyNum>0)
                    {
                        Num=num[KeyNum-1];
                        if(Num<=9)
                        {
                            sum3=sum3*10+Num;
                            k++;
                            OLED_ShowNum(80, 40, sum3, k, OLED_8X16);
                            OLED_Update();
                            Delay_ms(100);
                        }
                        if(KeyNum==16)
                        {
                            break;
                        }
                    }
                }
                break;
                
                case 13:
                break;
            }
            while (1)
            {
                GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);        
                for(int a=0;a<=1000;a++)
                {
                    Delay_ms(sum1);
                    KeyNum=MatrixKey_GetValue();
                    if(KeyNum==15)
                    {
                        x=1;
                        break;
                    }
                }
                if(x==1)
                {    
                    GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
                    GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
                    break;
                }
                GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);            
                for(int a=0;a<=1000;a++)
                {
                    Delay_ms(sum2);
                    KeyNum=MatrixKey_GetValue();
                    if(KeyNum==15)
                    {
                        x=1;
                        break;
                    }
                }                                        
                if(x==1)
                {    
                    GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
                    GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
                    break;
                }
                GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_SET);        
                for(int a=0;a<=1000;a++)
                {
                    Delay_ms(sum3);
                    KeyNum=MatrixKey_GetValue();
                    if(KeyNum==15)
                    {
                        x=1;
                        break;
                    }
                }
                if(x==1)
                {    
                    GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
                    GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
                    break;
                }
                GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);            
                for(int a=0;a<=1000;a++)
                {
                    Delay_ms(sum2);
                    KeyNum=MatrixKey_GetValue();
                    if(KeyNum==15)
                    {
                        x=1;
                        break;
                    }
                }    
                if(x==1)
                {    
                    GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
                    GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
                    break;
                }
            }
        }
        }
    }    
}

以上是程序部分

接线是把继电器输入口直接接在A8,A9脚,然后接了一个oled和矩阵键盘

img

img

不知道为什么芯片一开始是正常工作的,过两天再去用的时候发现一通电芯片就很烫,应该烧了
继电器是带光耦隔离的

  • 写回答

10条回答 默认 最新

  • GISer Liu 2024-02-19 14:30
    关注

    该回答引用自GPT-4,由博主GIS_Liu编写:

    针对您的问题,首先需要分析可能导致STM32F103C8T6芯片损坏的原因。通常,微控制器芯片损坏可能由于以下几个原因:

    1. 电源问题:输入电压超过芯片规定的电压范围,或者电源线路中有大的电流冲击。
    2. 接口电压问题:外部设备的电压超过芯片的I/O口允许的电压,尤其是没有适当的电平转换。
    3. 热问题:长时间在超过规定的温度环境下工作,导致芯片过热。
    4. 短路或负载过大:I/O口负载过大,或者由于接线错误导致短路。
    5. 静电放电:在没有适当防静电措施的情况下操作芯片,静电放电可能损坏内部电路。

    从您提供的代码和图片来看,芯片损坏可能与如何控制继电器有关。STM32的GPIO口直接驱动继电器可能会引起几个问题:

    • 电流容量:GPIO口可能无法提供足够的电流来驱动继电器的线圈。
    • 反向电压:继电器断开时产生的反向电压可能会损坏GPIO口。

    解决方案:

    1. 电流隔离:使用适当的驱动器(如晶体管、MOSFET或继电器驱动模块)来隔离GPIO口和继电器。
    2. 二极管保护:在继电器和GPIO口之间加入二极管来吸收可能产生的反向电压。
    3. 电源管理:确保电源稳定,并且在电路中使用电压稳压器和去耦电容。
    4. 适当散热:如果工作环境温度高,需要考虑散热问题。

    接下来,具体到您的代码,我没有发现直接会导致硬件损坏的代码错误,但如果GPIO口配置不正确,或者继电器的控制没有考虑电流和电压的问题,就可能会导致芯片损坏。

    代码方面的建议:

    • 在代码中,确保在控制继电器之前已经初始化了所有必要的硬件。
    • 如果GPIO口用于驱动继电器,应确保有足够的电流保护措施。

    最后,如果您确认是硬件问题导致的芯片损坏,请检查电路设计,特别是继电器的驱动部分,确保所有连接正确,没有短路,并且有适当的电流和电压保护。在电路中增加保护元件,如电流限制电阻、二极管等。如果需要进一步帮助,请提供更详细的硬件连接图和电路图,以便进行更深入的分析。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 2月27日
  • 已采纳回答 2月19日
  • 赞助了问题酬金15元 2月19日
  • 创建了问题 2月19日