标签归档:lpc1768

LPC1768 内部RTC程序

typedef struct{

uint8_t RTC_Sec;

uint8_t RTC_Min;

uint8_t RTC_Hour;

uint8_t RTC_Mday;

uint8_t RTC_Wday;

uint16_t RTC_Yday;

uint8_t RTC_Mon;

uint16_t RTC_Year;

}RTCTime;

RTCTime LocalTime;

void RTCStart(void)

{

LPC_RTC->CCR |= 0x01;

}

void RTCInit( void )

{

LPC_SC->PCONP |= CLKPWR_PCONP_PCRTC; //开启RTC电源

if(!(LPC_RTC->CCR & 0x01)) //如果时钟没使能,使能时钟,使能位在芯片复位时状态不会变化,不用每次上电都使能

{

LPC_RTC->ILR = 0;

LPC_RTC->AMR = 0xff;

LPC_RTC->CIIR = 0;

LPC_RTC->CCR = 0;

LocalTime.RTC_Year = 2019;

LocalTime.RTC_Mon = 1;

LocalTime.RTC_Mday = 1;

LocalTime.RTC_Wday = 2;

LocalTime.RTC_Hour = 0;

LocalTime.RTC_Min = 0;

LocalTime.RTC_Sec = 0;

RTCSetTime(&LocalTime);

RTCStart();

}

}

void RTC_Get_Time(RTCTime* Time)

{

Time->RTC_Year= LPC_RTC->YEAR ;

Time->RTC_Mon = LPC_RTC->MONTH;

Time->RTC_Yday = LPC_RTC->DOY;

Time->RTC_Wday = LPC_RTC->DOW;

Time->RTC_Mday = LPC_RTC->DOM;

Time->RTC_Hour = LPC_RTC->HOUR;

Time->RTC_Min = LPC_RTC->MIN;

Time->RTC_Sec = LPC_RTC->SEC;

}

void RTCSetTime(RTCTime* Time)

{

LPC_RTC->SEC = Time->RTC_Sec;

LPC_RTC->MIN = Time->RTC_Min;

LPC_RTC->HOUR = Time->RTC_Hour;

LPC_RTC->DOM = Time->RTC_Mday;

LPC_RTC->DOW = Time->RTC_Wday;

LPC_RTC->DOY = Time->RTC_Yday;

LPC_RTC->MONTH = Time->RTC_Mon;

LPC_RTC->YEAR = Time->RTC_Year;

}

LPC1768读写W25Q128程序

uint8_t W25QXX_Buf[4096];

GPIO设置

/*SPI pin set*/

PinCfg.Funcnum = PINSEL_FUNC_3;

PinCfg.Portnum = 0;

PinCfg.Pinmode = PINSEL_PINMODE_TRISTATE;

PinCfg.Pinnum = SPI_SCK;

PINSEL_ConfigPin(&PinCfg);

PinCfg.Pinnum = SPI_MOSI;

PINSEL_ConfigPin(&PinCfg);

PinCfg.Pinnum = SPI_MISO;

PINSEL_ConfigPin(&PinCfg);

PinCfg.Funcnum = PINSEL_FUNC_0;

PinCfg.Portnum = 0;

PinCfg.OpenDrain = PINSEL_PINMODE_NORMAL;

PinCfg.Pinnum = SPI_CS;

PINSEL_ConfigPin(&PinCfg);

GPIO_SetDir(0, (1<<SPI_CS), 1);

GPIO_SetValue(0, (1<<SPI_CS));

void Spi_Initial(void)

{

SPI_CFG_Type spi0;

spi0.CPHA = SPI_CPHA_FIRST;

spi0.CPOL = SPI_CPOL_LO;

spi0.ClockRate = 3125000; //spi_clk = 25000000,25000000/8=3125000,能使用的最高频率

spi0.DataOrder = SPI_DATA_MSB_FIRST;

spi0.Databit = SPI_DATABIT_8;

spi0.Mode = SPI_MASTER_MODE;

SPI_Init(LPC_SPI,&spi0);

}

uint8_t SPIF_POLLING(void)

{

uint8_t n = 0xff;

while (n–)

{

if (LPC_SPI->SPSR & 0x80)

return TRUE;

}

return FALSE;

}

继续阅读

Lpc1768移植UCOS-II(三)

三、移植OS_CPU_A.ASM

1、移植OS_CPU_SR_Save() OS_CPU_SR_Restore()

clip_image002

OS_CPU_SR_Save()保存当前的开关中断状态到R0,使用R0是因为编译器一般用R0传递参数。然后关中断。

Bx LR

从被OS_CPU_SR_Save()函数中断的程序处继续执行。进入临界段。

OS_CPU_SR_Restore()恢复R0中保存的开关状态,

Bx LR

从被OS_CPU_SR_Restore()函数中断的程序处继续执行。退出临界段。

这里使用的是PRIMASK,PRIMASK用于除能在 NMI和硬 fault之外的所有异常。

FAULTMASK能关闭所有异常和硬fault。

这里使用PRIMASK而不是FAULTMASK,是因为出现硬fault,必须要去处理,硬fault不能被关掉。

继续阅读

Lpc1768移植UCOS-II(二)

二、移植OS_CPU_C.C

1、头文件包含,

clip_image002

ucos_ii.h中包含了头文件os_cpu.h,os_cpu.h中有一段代码如下:

clip_image004

在OS_CPU_C.C中定义宏OS_CPU_GLOBALS,表示在编译OS_CPU_C.C时,定义os_cpu.h中的全局变量,其它C文件在引用os_cpu.h时不能定义OS_CPU_GLOBALS,编译时只是声明全局变量。

2、定义SYSTICK相关寄存器

clip_image006

3、钩子函数定义

void OSInitHookBegin (void)

void OSInitHookEnd (void)

void OSTaskCreateHook (OS_TCB *ptcb)

void OSTaskDelHook (OS_TCB *ptcb)

void OSTaskIdleHook (void)

void OSTaskReturnHook (OS_TCB *ptcb)

void OSTaskStatHook (void)

void OSTaskSwHook (void)

void OSTCBInitHook (OS_TCB *ptcb)

void OSTimeTickHook (void)

这些钩子函数必须定义,但可以是空函数。

clip_image008

在OSInitHookBegin()中把定义的CPU异常堆栈清零,并把栈顶赋给OS_CPU_ExceptStkBase。

继续阅读

Lpc1768移植UCOS-II(一)

UCOS-II在不同芯片上的移植,和处理器相关的文件有

OS_CPU.H

OS_CPU_A.ASM

OS_CPU_C.C

这几个文件的一些函数或代码要根据芯片和编译器的特效来修改。

UCOS_II的配置文件

OS_CFG.H

这个文件的内容要根据实际的使用情况来修改。

一, 移植OS_CPU.H

1、数据类型移植:

clip_image002

2、定义临界段模式为3

clip_image004

3、定义堆栈为递减模式

clip_image006

4、定义一个宏

clip_image008

宏OS_TASK_SW()用来实现从低优先级任务切换到高优先级任务。在UCOS-ii核心代码中调用。汇编函数OSCtxSw()在OS_CPU_A.ASM中定义。

5、MSP主堆栈定义

clip_image010

clip_image012

操作系统启用后,MSP变为OS_CPU_ExceptStkBase的值,不是复位时取的堆栈值,这个堆栈的初始化是在OSInit()中的OSInitHookBegin()进行的。

6、函数声明:

clip_image014

这些函数分别在OS_CPU_A.ASM和OS_CPU_C.C中定义。注意SysTick_Handler()就是SYSTICK的中断处理函数,要和startup_LPC17xx.s中的中断向量表定义的SYSTICK中断函数名称对应起来。