主程序调用函数复位原因不明,求助 | 已解决
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);只是空函数,也会复位。附代码,求助
您好,根据您提供的代码片段和描述的问题“主程序调用函数复位原因不明”,我们可以从以下几个方面进行专业分析与排查建议:
一、问题现象概述
您提到“主程序调用函数复位原因不明”,这通常意味着在调用某个函数时,系统发生了非预期的复位(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
[本文内容由国芯人工智能辅助生成,仅供参考] 补充 芯片为AI8051U-34K64 , 主频 40Mhz rtc初始化问题,已解决 你这幸好先开了看门狗,,,要是最后开的看门狗现象就变成上电就 死机 了{:xiaoku:}
页:
[1]