紧急求救,keil编译时出错Error: L6218E
[复制链接]
求救于各路大侠,本人编了一个驱动 P2_7 LED的小程序,结果出现错误Error: L6218E:,源代码如下:
c函数和头文件都是基于 ration的汉化说明版本。
#include "nxplpc11xx.h"
#define CS_H GPIO1->DATA |=(1<<2) #define CS_L GPIO1->DATA &=~(1<<2) #define RES_H GPIO1->DATA |=(1<<1) #define RES_L GPIO1->DATA &=~(1<<1) #define SCL_H GPIO0->DATA |=(1<<11) #define SCL_L GPIO0->DATA &=~(1<<11) #define AO_H GPIO1->DATA |=(1<<0) #define AO_L GPIO1->DATA &=~(1<<0) #define SI_H GPIO2->DATA |=(1<<11) #define SI_L GPIO2->DATA &=~(1<<11) #define LED_H GPIO2->DATA |=(1<<7) #define LED_L GPIO2->DATA &=~(1<<7)
/***********************************************/ /* 函数功能:配置系统时钟 */ /* 说明: 选择外部12M晶振作为系统时钟,并通*/ /* 过倍频器(PLL)把时钟倍频4倍 */ /* 注意: 使用其它值晶振时修改倍频值,最后 */ /* 时钟要满足<=50MHz */ /***********************************************/ void SysCLK_config(void) { uint8 i; /*执行以下代码选择外部12M晶振作为时钟源*/ SYSCON->PDRUNCFG &= ~(1 << 5); //系统振荡器上电,外部晶振使能 SYSCON->SYSOSCCTRL = 0x00000000; //振荡器未被旁路,1~20Mhz频率输入 for (i = 0; i < 200; i++) __nop(); //等待振荡器稳定 SYSCON->SYSPLLCLKSEL = 0x00000001; //PLL时钟源选择“系统振荡器” SYSCON->SYSPLLCLKUEN = 0x01; //更新PLL选择时钟源 SYSCON->SYSPLLCLKUEN = 0x00; //先写0,再写1达到更新时钟源的目的(数据手册规定) SYSCON->SYSPLLCLKUEN = 0x01; while (!(SYSCON->SYSPLLCLKUEN & 0x01)); //确定时钟源更新后向下执行 /*执行以下代码倍频为48MHz*/ SYSCON->SYSPLLCTRL = 0x00000023; //设置M=4;P=2; FCLKOUT=12*4=48Mhz SYSCON->PDRUNCFG &= ~(1 << 7); //PLL上电 while (!(SYSCON->SYSPLLSTAT & 0x01)); //确定PLL锁定以后向下执行 /*主时钟源选择倍频以后的时钟*/ SYSCON->MAINCLKSEL = 0x00000003; //主时钟源选择PLL后的时钟 SYSCON->MAINCLKUEN = 0x01; //更新主时钟源 SYSCON->MAINCLKUEN = 0x00; //先写0,再写1达到更新时钟源的目的(数据手册规定) SYSCON->MAINCLKUEN = 0x01; while (!(SYSCON->MAINCLKUEN & 0x01)); //确定主时钟锁定以后向下执行 SYSCON->SYSAHBCLKDIV = 0x01; //AHB时钟分频值为1,使AHB时钟设置为48Mhz }
/***********************************************/ /* 函数功能:使能CLKOUT脚输出频率 */ /* 入口参数:CLKOUT_DIV,即CLKOUT分频值,1~255 */ /* 说明: 此函数可用来测试时钟真实性 */ /***********************************************/ void CLKOUT_EN(uint8 CLKOUT_DIV) { IOCON->PIO0_1=0XD1; SYSCON->CLKOUTDIV = CLKOUT_DIV; //CLKOUT时钟值为48/CLKOUT_DIV SYSCON->CLKOUTCLKSEL= 0X00000003; //CLKOUT时钟源选择为主时钟 SYSCON->CLKOUTUEN =0X01; SYSCON->CLKOUTUEN =0X00; SYSCON->CLKOUTUEN =0X01; while (!(SYSCON->CLKOUTUEN & 0x01)); //确定时钟源更新后向下执行 }
/**********************************************/ /* 函数功能:SysTick延时 */ /* 入口参数:毫秒值或微秒值 */ /* 说明: 利用系统定时器实现 */ /* 48Mhz时钟工作下 */ /**********************************************/ static volatile uint32 TimeTick = 0; void SysTick_Handler(void) //系统定时器中断服务函数 { TimeTick++; }
void delay_ms(uint32 ms) { SYSTICK->STRELOAD = (((48000)*ms)-1); //往重载计数器里写值 SYSTICK->STCURR = 0; //计数器清零 SYSTICK->STCTRL |= ((1<<1)|(1<<0)); //开启计数器,开启计数器中断 while(!TimeTick); TimeTick = 0; SYSTICK->STCTRL =0; }
void delay_us(uint32 us) { SYSTICK->STRELOAD = (((48)*us)-1); //往重载计数器里写值 SYSTICK->STCURR = 0; //计数器清零 SYSTICK->STCTRL |= ((1<<1)|(1<<0)); //开启计数器,开启计数器中断 while(!TimeTick); TimeTick = 0; SYSTICK->STCTRL =0; }
///////以下为1ms延时调用函数///////////////////
void Delay_1ms (uint16 n) { uint16 i,j; j=0; i = 0; for(j=0;j<n;j++) for(i = 110;i > 0;i--); }
/////////////以下为10us延时调用函数//////////////
void Delay_10us (uint16 n) { uint16 i,j; j=0; i = 0; for(j=0;j<n;j++) for(i = 1;i > 0;i--); }
//////////以下为单片机GPIO初始化函数///////////////////////
void GPIOInit( void ) { SYSCON->SYSAHBCLKCTRL |= (1 << 6); /* 使能GPIO时钟 */ SYSCON->SYSAHBCLKCTRL |= (1 <<16 ); //使能IOCON时钟 IOCON->PIO1_2 &= ~0xD1; /* 将P2.0-11初始化为GPIO功能 */ IOCON->PIO1_1 &= ~0xD1; IOCON->PIO0_11 &= ~0xD1; IOCON->PIO1_0 &= ~0xD1; IOCON->PIO2_11 &= ~0x07; IOCON->PIO2_7 &= ~0x07;
GPIO1->DIR |= (1 << 0); GPIO1->DIR |= (1 << 1); GPIO1->DIR |= (1 << 2); GPIO0->DIR |= (1 << 11); GPIO2->DIR |= (1 << 11); GPIO2->DIR |= (1 << 7); ///////以上指令为设置相应GPIO为输出 }
///////////////////////////////////////////////////////////// void SysCLK_config(void); void GPIOInit( void ); void Delay_1ms (uint16 n);
int main(void) {
SysCLK_config(); GPIOInit();
while(1) { LED_H; Delay_1ms(500); LED_L; Delay_1ms(500); } }
|