IAR编译我的UART收发的工程,提示我堆栈越界的问题,但是我的那个工程很小,没用协议栈。
void InitUart() { CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振 while(CLKCONSTA & 0x40); // 等待晶振稳定 CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ PERCFG = 0x00; //位置1 P0口 P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5用作串口,第二功能 P2DIR &= ~0XC0; //P0 优先作为UART0 ,优先级 U0CSR |= 0x80; //UART 方式 U0GCR |= 11; //U0GCR与U0BAUD配合 U0BAUD |= 216; // 波特率设为115200 UTX0IF = 0; //UART0 TX 中断标志初始置位1 (收发时候) U0CSR |= 0X40; //允许接收 IEN0 |= 0x84; // 开总中断,接收中断 }
这是设置UART0的参数设置,和时钟设置。但是 单步调试的时候进入第一条语句
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振
执行后就报下面的堆栈越界的信息:
Mon Feb 02 15:01:57 2015: The stack 'IdataStack' is filled to 100% (64 bytes used out of 64). The warning threshold is set to 90.%
Mon Feb 02 15:01:57 2015: The stack pointer for stack 'IdataStack' (currently IData:0x00) is outside the stack range (IData:0xC0 to IData:0x100)
调试模式是把程序下载到开发板上单步调试
是不是linker->config配置的问题"$PROJ_DIR$\..\..\common\cc2540\ti_51ew_cc2540b.xcl"
不是这个问题的,越界的问题发生在始终配置那三个语句上,只是单步执行时钟配置语句才会有这样的情况,如果GO运行有没有。
TI提供了直接使用CC2540当做8051编程不使用协议栈的例程 里面包括了对UART口的控制 是可以单步联调的 建议您参考使用
/****************************************************************************
* Clock setup
* See basic software example "clk_xosc_cc254x"
*/
// Set system clock source to HS XOSC, with no pre-scaling.
CLKCONCMD = (CLKCONCMD & ~(CLKCON_OSC | CLKCON_CLKSPD)) | CLKCON_CLKSPD_32M;
while (CLKCONSTA & CLKCON_OSC); // Wait until clock source has changed.
// Note the 32 kHz RCOSC starts calibrating, if not disabled.
http://www.ti.com/lit/zip/swrc257