dinesh 发表于 2025-4-17 15:44:33

用KEIL5仿真时,仿到EA=1时,就掉线

提示掉线内容如下:




源代码见附件,我自己写的源代码,也是一样的情况:

/******************* IOÅäÖú¯Êý *******************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                //½á¹¹¶¨Òå
        GPIO_InitStructure.Pin= GPIO_Pin_6 | GPIO_Pin_7;                //Ö¸¶¨Òª³õʼ»¯µÄIO, GPIO_Pin_0 ~ GPIO_Pin_7
        GPIO_InitStructure.Mode = GPIO_PullUp;        //Ö¸¶¨IOµÄÊäÈë»òÊä³ö·½Ê½,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //³õʼ»¯

        GPIO_InitStructure.Pin= GPIO_Pin_0| GPIO_Pin_1;                //Ö¸¶¨Òª³õʼ»¯µÄIO, GPIO_Pin_0 ~ GPIO_Pin_7
        GPIO_InitStructure.Mode = GPIO_PullUp;        //Ö¸¶¨IOµÄÊäÈë»òÊä³ö·½Ê½,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);        //³õʼ»¯
}

/***************´®¿Ú³õʼ»¯º¯Êý *****************/
void        UART_config(void)
{
        COMx_InitDefine                COMx_InitStructure;                                        //½á¹¹¶¨Òå

        COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;        //ģʽ, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
        COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;                        //Ñ¡Ôñ²¨ÌØÂÊ·¢ÉúÆ÷, BRT_Timer1, BRT_Timer2 (×¢Òâ: ´®¿Ú2¹Ì¶¨Ê¹ÓÃBRT_Timer2)
        COMx_InitStructure.UART_BaudRate= 115200ul;                        //²¨ÌØÂÊ, Ò»°ã 110 ~ 115200
        COMx_InitStructure.UART_RxEnable= ENABLE;                                //½ÓÊÕÔÊÐí,   ENABLE»òDISABLE
        COMx_InitStructure.BaudRateDouble = DISABLE;                        //²¨ÌØÂʼӱ¶, ENABLE»òDISABLE
        UART_Configuration(UART1, &COMx_InitStructure);                //³õʼ»¯´®¿Ú1 UART1,UART2,UART3,UART4
        NVIC_UART1_Init(ENABLE,Priority_1);                //ÖжÏʹÄÜ, ENABLE/DISABLE; ÓÅÏȼ¶(µÍµ½¸ß) Priority_0,Priority_1,Priority_2,Priority_3

        COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //ģʽ,   UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
//        COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //Ñ¡Ôñ²¨ÌØÂÊ·¢ÉúÆ÷, BRT_Timer2 (×¢Òâ: ´®¿Ú2¹Ì¶¨Ê¹ÓÃBRT_Timer2, ËùÒÔ²»ÓÃÑ¡Ôñ)
        COMx_InitStructure.UART_BaudRate= 57600ul;                        //²¨ÌØÂÊ,   110 ~ 115200
        COMx_InitStructure.UART_RxEnable= ENABLE;                                //½ÓÊÕÔÊÐí,   ENABLE»òDISABLE
        UART_Configuration(UART2, &COMx_InitStructure);                //³õʼ»¯´®¿Ú2 UART1,UART2,UART3,UART4
        NVIC_UART2_Init(ENABLE,Priority_1);                //ÖжÏʹÄÜ, ENABLE/DISABLE; ÓÅÏȼ¶(µÍµ½¸ß) Priority_0,Priority_1,Priority_2,Priority_3

        UART1_SW(UART1_SW_P36_P37);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
        UART2_SW(UART2_SW_P10_P11);                //UART2_SW_P10_P11,UART2_SW_P46_P47
}

/***********************************************/
void main(void)
{
        u8        i;

        EAXSFR();                /* À©Õ¹¼Ä´æÆ÷·ÃÎÊʹÄÜ */
        GPIO_config();
        UART_config();
        EA = 1;

        PrintString1("STC8 UART1 Test Programme!\r\n");        //UART1·¢ËÍÒ»¸ö×Ö·û´®
        PrintString2("STC8 UART2 Test Programme!\r\n");        //UART2·¢ËÍÒ»¸ö×Ö·û´®

        while (1)
        {
                delay_ms(1);
                if(COM1.RX_TimeOut > 0)                //³¬Ê±¼ÆÊý
                {
                        if(--COM1.RX_TimeOut == 0)
                        {
                                if(COM1.RX_Cnt > 0)
                                {
                                        for(i=0; i<COM1.RX_Cnt; i++)        TX1_write2buff(RX1_Buffer);        //ÊÕµ½µÄÊý¾ÝÔ­Ñù·µ»Ø
                                }
                                COM1.RX_Cnt = 0;
                        }
                }
                if(COM2.RX_TimeOut > 0)                //³¬Ê±¼ÆÊý
                {
                        if(--COM2.RX_TimeOut == 0)
                        {
                                if(COM2.RX_Cnt > 0)
                                {
                                        for(i=0; i<COM2.RX_Cnt; i++)        TX2_write2buff(RX2_Buffer);        //ÊÕµ½µÄÊý¾ÝÔ­Ñù·µ»Ø
                                }
                                COM2.RX_Cnt = 0;
                        }
                }
        }
}

国芯人工智能 发表于 2025-4-17 15:48:00

在KEIL5仿真过程中,当执行到EA=1时出现掉线问题,通常与中断配置或硬件初始化有关。以下是对该问题的详细分析与解决方案:

1. 问题分析
EA=1是使能全局中断的指令。当执行该指令时,若系统中存在未正确配置的中断源或硬件初始化不完整,可能会导致仿真器与目标芯片的连接中断。具体原因可能包括:
中断向量表未正确配置:若中断向量表未正确指向中断服务程序,可能导致程序跑飞或进入未定义状态。
硬件初始化不完整:如GPIO、UART等外设未正确初始化,可能导致中断触发时无法正常处理。
仿真器配置问题:仿真器的调试模式或连接参数设置不当,可能导致在中断使能时无法继续仿真。

2. 代码检查与优化
从提供的代码片段来看,GPIO和UART的初始化可能存在以下问题:

2.1 GPIO初始化
c
void GPIOconfig(void) {
    GPIOInitTypeDef GPIOInitStructure;
    GPIOInitStructurePin = GPIOPin6 | GPIOPin7;
    GPIOInitStructureMode = GPIOPullUp;
    GPIOInilize(GPIOP3, &GPIOInitStructure);

    GPIOInitStructurePin = GPIOPin0 | GPIOPin1;
    GPIOInitStructureMode = GPIOPullUp;
    GPIOInilize(GPIOP1, &GPIOInitStructure);
}
问题:GPIOInilize函数名拼写错误,应为GPIOInitialize。
建议:检查函数名拼写,并确保GPIO模式配置正确。例如,若GPIO用于输出,应使用GPIOOUTPP或GPIOOUTOD模式。

2.2 UART初始化
c
void UARTconfig(void) {
    COMxInitDefine COMxInitStructur;
    // 未完整提供UART初始化代码
}
问题:UART初始化代码不完整,未配置波特率、数据位、停止位等参数。
建议:补充完整的UART初始化代码,确保UART配置正确。例如:
c
void UARTconfig(void) {
    COMxInitDefine COMxInitStructure;
    COMxInitStructure.UARTMode = UARTMode8N1;
    COMxInitStructure.UARTBaudRate = 9600;
    COMxInitStructure.UARTRxEnable = ENABLE;
    COMxInitStructure.UARTTxEnable = ENABLE;
    UARTInit(COM1, &COMxInitStructure);
}

3. 中断配置检查
确保中断向量表正确指向中断服务程序,并检查中断优先级配置。例如:
c
void InterruptConfig(void) {
    // 配置中断向量表
    NVICSetVector(EXTI0IRQn, (uint32t)&EXTI0IRQHandler);
    NVICEnableIRQ(EXTI0IRQn);
}

void EXTI0IRQHandler(void) {
    // 中断服务程序
}

4. 仿真器配置检查
调试模式:确保仿真器设置为正确的调试模式(如JTAG或SWD)。
连接参数:检查仿真器的时钟频率、复位模式等参数是否与目标芯片匹配。

5. 其他建议
逐步调试:在EA=1之前设置断点,逐步检查程序执行状态。
日志输出:通过串口或其他方式输出调试信息,帮助定位问题。
硬件检查:确保目标芯片的电源、时钟、复位电路等硬件部分工作正常。

6. 总结
掉线问题通常与中断配置、硬件初始化或仿真器设置有关。通过检查代码、优化初始化流程、确保中断配置正确,并调整仿真器参数,可以有效解决该问题。若问题仍未解决,建议进一步检查硬件电路或联系芯片厂商技术支持。

希望以上分析与建议对您有所帮助!

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-4-17 16:34:30

选择的串口仿真还是USB仿真?

使用USB仿真正常:


页: [1]
查看完整版本: 用KEIL5仿真时,仿到EA=1时,就掉线