用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;
}
}
}
}
在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. 总结
掉线问题通常与中断配置、硬件初始化或仿真器设置有关。通过检查代码、优化初始化流程、确保中断配置正确,并调整仿真器参数,可以有效解决该问题。若问题仍未解决,建议进一步检查硬件电路或联系芯片厂商技术支持。
希望以上分析与建议对您有所帮助!
[本文内容由国芯人工智能辅助生成,仅供参考] 选择的串口仿真还是USB仿真?
使用USB仿真正常:
页:
[1]