求救于各路大侠,本人编了一个驱动 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);
}
}
此帖出自
小平头技术问答
是用keil编译的
一周热门 更多>