jrh200310 发表于 7 天前

主程序调用函数复位原因不明,求助 | 已解决

void main(void)
{


    WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXSFR(); //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    P_SW2 &= ~0x01;                                                //UART2/USART2: RxD2(P1.2), TxD2(P1.3)
    P_SW2 &= ~S2_S;         //UART2 switch to: 0: P1.2 P1.3,1: P4.2 P4.3选择 P1.21.3
          P_SW2 |= S3_S;       //UART3 switch bit1 to: 0: P0.0 P0.1,1: P5.0 P5.1
      
         
         
          //DisableEEPROM();
      
    UART1_config(2);    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer2做波特率.
                printf("设备开机\n");
      
    DMA_Uart1Config(DmaUart1RXBuffer);
                  
                UART2_config()   ; // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer2做波特率.
          DMA_Uart2Config(DmaUart2RXBuffer );

               
               
          wdt_config();               
    RTC_config(); //启动RTC开发板晶振没有焊,不能用

                init_dev_data(&Dev);

          printf("Dev.Data.addr = %bu\n",Dev.Data.addr);

               
                UART3_config()   ; // 选择波特率, 3: 使用Timer3做波特率, 其它值: 使用Timer2做波特率.
          DMA_Uart3Config(DmaUart3RXBuffer );
               
    EA = 1; //允许总中断

         
         
         
    while (1)
    {

                        
                        clear_wdt();

       uart1_read(&B_RX1_TimeOut); //接收上位机配置信息和打印工作信息。
                         uart2_task(&B_RX2_TimeOut );
                         uart3_read(&RX3_TimeOut);
                         Delay100ms();
                         printf("a\n");
                        
                        // uart3_dma_send(u8 *flag,DmaUart3TXBuffer,8) ;
                        
                        
                  //uart1_dma_send(&DmaTx1Flag,DmaUart1TXBuffer,8) ;
                        //uart2_dma_send(&DmaTx2Flag,DmaUart2TXBuffer,8) ;
      // uart3_dma_send(&DmaTx3Flag,DmaUart3TXBuffer,8) ;
                        
                        
               //adc_task(&Adc.Data.m2mflag,u16 *buff,u16 len );
      
                        
               
    }
}


//========================================================================

只要调了红色的uart3_read(&RX3_TimeOut);函数,就会打印6次a复位。注释掉就不会。哪怕uart3_read(&RX3_TimeOut);只是空函数,也会复位。附代码,求助



国芯人工智能 发表于 7 天前

您好,根据您提供的代码片段和描述的问题“主程序调用函数复位原因不明”,我们可以从以下几个方面进行专业分析与排查建议:

一、问题现象概述

您提到“主程序调用函数复位原因不明”,这通常意味着在调用某个函数时,系统发生了非预期的复位(Reset)。复位的原因可能包括:
硬件复位(如看门狗触发、电源异常、外部复位引脚触发等)
软件复位(如非法地址访问、堆栈溢出、除零错误等)
编译器或链接器配置错误导致程序跑飞
外设配置不当导致异常中断或错误访问

二、代码分析

1. 初始化部分

您在main()函数中执行了以下初始化操作:

c
WTST = 0;
EAXSFR();
CKCON = 0;
WTST = 0;:设置指令延时为0,提升CPU执行速度。此操作在某些MCU中可能影响外设时序,请确认是否与后续外设(如UART)配置兼容。
EAXSFR();:扩展寄存器访问使能,需确保该函数实现正确,且调用时机合适。
CKCON = 0;:调整访问XRAM速度,需确认是否与当前系统时钟配置匹配。

2. 端口配置

c
P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
...
P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
所有端口均设为准双向口,若后续程序中有对端口的特殊操作(如推挽输出、开漏输出),需注意配置冲突。

3. UART切换配置

c
PSW2 &= ~0x01;                                               
PSW2 &= ~S2S;         
PSW2 |= S3S;
这部分代码用于切换UART2和UART3的引脚映射。需要注意:
是否定义了S2S和S3S宏?
是否在操作前对PSW2寄存器进行了正确的初始化或备份?
是否存在对PSW2的位操作冲突?

4. UART1配置函数调用

c
UART1config(2);
此函数未完整显示,但传入参数为2。需确认该函数是否对系统时钟、波特率、中断等进行了配置。
若函数内部存在错误配置(如无效寄存器访问、除零错误、非法指针引用等),可能导致系统异常复位。

三、复位原因排查建议

1. 检查复位源寄存器

大多数MCU芯片(如STC系列、国产8051增强型)都提供了复位源寄存器(如RSTSRC、PCON、SFR等),可以读取复位原因:

```c
unsigned char resetcause = PCON;
if (resetcause & (1

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

jrh200310 发表于 7 天前

补充 芯片为AI8051U-34K64   , 主频 40Mhz

jrh200310 发表于 7 天前

rtc初始化问题,已解决

_奶咖君_ 发表于 6 天前

你这幸好先开了看门狗,,,要是最后开的看门狗现象就变成上电就 死机 了{:xiaoku:}
页: [1]
查看完整版本: 主程序调用函数复位原因不明,求助 | 已解决