找回密码
 立即注册
查看: 57|回复: 2

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-04-17 15:44:33
已绑定手机

1

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2025-4-17 15:44:33 | 显示全部楼层 |阅读模式
提示掉线内容如下:

截图202504171542029965.jpg


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

/******************* 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;
                        }
                }
        }
}

截图202504171541463634.jpg

09-串口1串口2中断模式与电脑收发测试.rar

221.67 KB, 下载次数: 1

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-17 15:48:00 | 显示全部楼层
在KEIL5仿真过程中,当执行到EA=1时出现掉线问题,通常与中断配置或硬件初始化有关。以下是对该问题的详细分析与解决方案:

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

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

2.1 GPIO初始化
  1. c
  2. void GPIOconfig(void) {
  3.     GPIOInitTypeDef GPIOInitStructure;
  4.     GPIOInitStructurePin = GPIOPin6 | GPIOPin7;
  5.     GPIOInitStructureMode = GPIOPullUp;
  6.     GPIOInilize(GPIOP3, &GPIOInitStructure);
  7.     GPIOInitStructurePin = GPIOPin0 | GPIOPin1;
  8.     GPIOInitStructureMode = GPIOPullUp;
  9.     GPIOInilize(GPIOP1, &GPIOInitStructure);
  10. }
复制代码
问题:GPIOInilize函数名拼写错误,应为GPIOInitialize。
建议:检查函数名拼写,并确保GPIO模式配置正确。例如,若GPIO用于输出,应使用GPIOOUTPP或GPIOOUTOD模式。

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

3. 中断配置检查
确保中断向量表正确指向中断服务程序,并检查中断优先级配置。例如:
  1. c
  2. void InterruptConfig(void) {
  3.     // 配置中断向量表
  4.     NVICSetVector(EXTI0IRQn, (uint32t)&EXTI0IRQHandler);
  5.     NVICEnableIRQ(EXTI0IRQn);
  6. }
  7. void EXTI0IRQHandler(void) {
  8.     // 中断服务程序
  9. }
复制代码

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

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

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-17 16:34:30 | 显示全部楼层
选择的串口仿真还是USB仿真?

使用USB仿真正常:
截图202504171636111073.jpg

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 22:21 , Processed in 0.135640 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表