LPC1114学习 - 西区故事

LPC1114学习 - 西区故事 2013-01 厚积薄发 知识改变命运,技术改变生活

http://feng06.blog.163.com/blog/static/1350150201301411218791/

LPC1114 是恩智浦(NXP)公司推出的居于Cotex-M0内核的一个32位的低功耗单片机,其内部拥有32K的FlashROM,8K的RAM,供电电压低(1.8V~3.6V),速度快(0.9DMIPS/MHz),功能强大,价格低廉,应用非常广泛,其LQFP48封装的实物外形如下图所示。                                

从图中可以看出,它一共有48个引脚,其中的42个是通用输入输出引脚(GPIO),分为P0口(P0.0~P0.11)12个脚,P1口(P1.0~P1.11)12个脚,P2口(P2.0~P2.11)12个脚,P3口(P3.0~P3.5)只有6个脚。余下的6个脚分别是两个晶振引脚、两个正电源引脚(系统、A/D)和两个地引脚(系统、A/D)。一般情况下,系统电源和A/D电源可以接在一起。具体的引脚功能如下图所示

http://feng06.blog.163.com/blog/static/1350150201301411218791/

http://feng06.blog.163.com/blog/static/1350150201301652123909/

http://feng06.blog.163.com/blog/static/1350150201301922355350/

http://feng06.blog.163.com/blog/static/13501502013023103129521/


LED交替闪烁 第一个演示示例  2013-01-30 22:45:42

http://feng06.blog.163.com/blog/static/13501502013030104542641/

让接到P2端口的十二个LED交替闪烁,时间间隔约0.5秒。LED采取共阳极的接法,在某个P2端口输出低电平时,对应的LED被点亮,输出高电平时熄灭。

头文件解析 2013-03-01 

http://feng06.blog.163.com/blog/static/135015020132192023113/

从前面的第一个演示示例中可以看出,只实现一个LED的闪烁,其代码量似乎要比51单片的多很多。仔细观察后会发现,其实除了多了时钟配置以外,就数预定义部分的代码数量最多,而且这部分大多是以结构体的形式出现的。在正规的开发过程中,这部分预定义的内容被是放在一些头文件内并包含进来的,前面的代码只是为了编译方便,所以把全部代码都给出来,不太正规。下面就来讨论一下在ARM-MDK环境中开发LPC1114的头文件配置。

在前面的示例中,给出了预定义部分的内容,但没有进行解释。这里就先来讨论一下在第一个演示示例中预定义部分的内容。...


头文件解析(续) 2013-03-14 

http://feng06.blog.163.com/blog/static/1350150201321441923154/

通过前面的分析,已经基本知道了头文件部分的内容。然而,如果每次设计都把需要的头文件内容全部写出来,不仅代码较多占用篇幅,还会影响程序代码的结构化。因此,正规的程序都是把这部分内容通过头文件包含的形式来引入的。下面就来讨论一下如何实现这一形式。 ...


通用输入/输出端口(GPIO)  2013-03-15 

http://feng06.blog.163.com/blog/static/135015020132152330745/

通用输入/输出端口(GPIO)续  2013-03-26 

http://feng06.blog.163.com/blog/static/1350150201322610295645/

外部中断  2013-04-06

http://feng06.blog.163.com/blog/static/135015020133643345349/

LPC1114学习 系统定时器(SysTick) - 2013-04-12 16:45:15 

http://feng06.blog.163.com/blog/static/1350150201331244515647/

在LPC1114内部有一个特殊的定时器——系统定时器(SysTick),它位于Cortex-M0内核里面,是ARM内核的一部分,主要用来给操作系统提供时间片轮转的定时,一般固定为10ms的定时,所以中文也称它为“嘀哒”定时器。在不跑操作系统时,可以把它当作普通定时器来用,一般用来进行程序延时。在前面的第一个演示示例中就用到过,下面就来讨论一下如何运用SysTick来提供延时。

系统定时器也位于“私有外设总线”(Private peripheral bus)内,其地址为0xE000E010~0xE000E01F。下面先来看一下SysTick的内部结构,如下图所示。

从上图中可以看出,SysTick定时器的位长度是24位,即最长的计数次数为16777216次,且计数为倒数计数形式,递减到0时产生中断请求。计数的脉冲可直接取系统时钟,也可取半系统时钟。下表给出了和SysTick相关的寄存器。

上表中,SYST_CSR是系统定时器的控制寄存器,负责SysTick的启动、中断使能、输入时钟选择、溢出标志读取等操作;SYST_RVR是系统定时器的初始值重载寄存器,负责SysTick的24位初值载入;SYST_CVR是系统定时器的当前值寄存器,负责获取SysTick的24位当前计数值,当对该寄存器进行写操作时,该寄存器的数值将会被清零;SYST_CALIB是系统定时器的校准值寄存器,负责SysTick的校准。

下面给出的是上表中控制寄存器SYST_CSR的全部位结构。

从表中可以看出,第0位是使能SysTick,值为1启动计数,值为0关闭计数;第1位是SysTick的中断使能位,值为1使能中断,值为0禁能中断;第2位是输入时钟的选择位,值为1时选择系统时钟做为计数脉冲,值为0时选择半系统时钟做为计数脉冲的参考时钟;第16位是溢出标志位,当计数的值递减到0时,该位被置1,在读取该置后自动清零。
从上述可以看出,其实系统定时器就是一个普通的定时器,在使用时顺序进行如下操作即可:
1.给SYST_RVR寄存器写入初始值;
2.写SYST_CVR寄存器以对计数值进行清零;
3.设置SYST_CSR寄存器启动定时、使能中断以及选择时钟源。
下面给出系统时钟SysTick的结构体定义。
typedef struct
{
  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
  __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
  __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
  __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
} SysTick_Type;
SysTick定时器组的基址为0xE000E000,所以要将基址指针强制转换为上述结构体,还要加上下面的定义。

#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */
#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address              */
#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */
对于系统定时器SysTick产生的中断,也有特定的入口函数,形式如下所示。
 void SysTick_Handler(void)
{
       系统定时中断服务程序部分
}
接下来讨论一下系统定时器的初始值设置,因为定时的时长由系统时钟频率、系统时钟选择和载入的初始值共同决定。假设系统时钟为48MHz,默认情况下SysTick的CLKSOURCE值为0,即选择半系统时钟频率。这样,输入给定时器计数的时钟就是48/2=24MHz,计数周期为1/(24MHz)=1/24us,则计24次就是1us的定时,但实际上SysTick采用的是倒数计数方式,即从最大值依次递减计数直到0产生溢出信号。所以24次计数实际上是0~23次,即最大值要减1,即24-1=23。同时要注意,由于计数位宽是24位,所以最大计数值不能超过2的24次方(即16777216),由此,可得出微秒级的初始值计算公式,如下:

LOAD=((24*us)-1),其中us取值范围1~699000

同理可得出毫秒级的初始值计算公式:

LOAD=((24000*ms)-1),其中ms取值范围1~699

上升到一般情况,定时初始值可用下面的公式来计算:


上式中,系统时钟SysClk的单位是MHz,CLKSOURCE的值是0或1,得到的是微秒级别的定时,要注意LOAD的值不能大于16777216。

下面来看一下前面第一个演示示例中的延时部分,代码如下:

static volatile uint32_t TimeTick = 0;     //设置全局变量
void SysTick_Handler(void)
{
TimeTick++;                 //系统定时中断中,全局变量加1
}
void delay_ms(uint32_t ms)
{
SysTick->LOAD = (((24000)*ms)-1);   //载入初始值
SysTick->VAL = 0;                             //写当前值寄存器使其清零
SysTick->CTRL |= ((1<<1)|(1<<0));    //打开中断,启动定时器,选择关系统时钟
while(!TimeTick);
TimeTick = 0;                                     //当定时时间到时,全局变量清零
SysTick->CTRL =0;                            //关闭定时器
}
可见上述定时是毫秒级别的,最长可定时699ms。
至此,第一个演示示例中的全部内容就都讨论完了,可见在LPC1114中要实现一个简单的十二个LED交替闪烁,涉及到的内容还是很多的。下面再来看一个流水灯的例子,要求实现一个12位的流水灯,时间间隔为100ms。假设LED采用共阳接法接在GPIO2端口,参考代码如下:
#include <LPC11xx.h>
//===================系统定时器中断服务程序============================
void SysTick_Handler(void)
{
 uint32_t temp;   //定义临时中间变量
 temp = LPC_GPIO2->DATA; //读取当前端口2的值
 temp = ~temp;        //把中间变量进行取反
 temp<<=1;            //把中间变量进行左移一位
 temp = ~temp;        //再次把中间变量进行取反
 LPC_GPIO2->DATA = temp; //把左移后的量赋给端口2
 if(temp==0xFFF)      //如果左移到头,则从头开始
  { 
   LPC_GPIO2->DATA = 0xFFE;
  }
}
//========================系统定时器初始化=============================
void SysTick_init(void)
{
 SysTick->LOAD = (((24000)*100)-1); //设置100ms的定时 
 SysTick->VAL = 0;         //计数清零
 SysTick->CTRL |= ((1<<1)|(1<<0));  //允许中断,选择半系统时钟,启动定时器
}
//============================主函数==================================
int main(void) 
{
 LPC_GPIO2->DIR = 0xFFF;     //设置端口2为输出方向
 LPC_GPIO2->DATA = 0xFFE; //端口2最低位输出0,点亮最末一个LED
 SysTick_init();    //调用系统定时器
 while(1)
       {
   ;   //空循环
  }           
}
把程序编译后下载到LPC1114中,给系统上电,可看到接到端口2上的12个LED在闪烁流动。

.END


*** lpc11xx.h Tiimer typedef *** 

/*------------- System Control (SYSCON) --------------------------------------*/

typedef struct
{
  __IO uint32_t SYSMEMREMAP;            /*!< Offset: 0x000 (R/W)  System memory remap Register */
  __IO uint32_t PRESETCTRL;             /*!< Offset: 0x004 (R/W)  Peripheral reset control Register */
  __IO uint32_t SYSPLLCTRL;             /*!< Offset: 0x008 (R/W)  System PLL control Register */
  __I  uint32_t SYSPLLSTAT;             /*!< Offset: 0x00C (R/ )  System PLL status Register */
       uint32_t RESERVED0[4];

  __IO uint32_t SYSOSCCTRL;             /*!< Offset: 0x020 (R/W)  System oscillator control Register */
  __IO uint32_t WDTOSCCTRL;             /*!< Offset: 0x024 (R/W)  Watchdog oscillator control Register */
  __IO uint32_t IRCCTRL;                /*!< Offset: 0x028 (R/W)  IRC control Register */
       uint32_t RESERVED1[1];
  __I  uint32_t SYSRSTSTAT;             /*!< Offset: 0x030 (R/ )  System reset status Register */
       uint32_t RESERVED2[3];
  __IO uint32_t SYSPLLCLKSEL;           /*!< Offset: 0x040 (R/W)  System PLL clock source select Register */
  __IO uint32_t SYSPLLCLKUEN;           /*!< Offset: 0x044 (R/W)  System PLL clock source update enable Register */
       uint32_t RESERVED3[10];

  __IO uint32_t MAINCLKSEL;             /*!< Offset: 0x070 (R/W)  Main clock source select Register */
  __IO uint32_t MAINCLKUEN;             /*!< Offset: 0x074 (R/W)  Main clock source update enable Register */
  __IO uint32_t SYSAHBCLKDIV;           /*!< Offset: 0x078 (R/W)  System AHB clock divider Register */
       uint32_t RESERVED4[1];

  __IO uint32_t SYSAHBCLKCTRL;          /*!< Offset: 0x080 (R/W)  System AHB clock control Register */
       uint32_t RESERVED5[4];
  __IO uint32_t SSP0CLKDIV;             /*!< Offset: 0x094 (R/W)  SSP0 clock divider Register */
  __IO uint32_t UARTCLKDIV;             /*!< Offset: 0x098 (R/W)  UART clock divider Register */
  __IO uint32_t SSP1CLKDIV;             /*!< Offset: 0x09C (R/W)  SSP1 clock divider Register */
       uint32_t RESERVED6[1];
       uint32_t RESERVED7[11];

  __IO uint32_t WDTCLKSEL;              /*!< Offset: 0x0D0 (R/W)  WDT clock source select Register */
  __IO uint32_t WDTCLKUEN;              /*!< Offset: 0x0D4 (R/W)  WDT clock source update enable Register */
  __IO uint32_t WDTCLKDIV;              /*!< Offset: 0x0D8 (R/W)  WDT clock divider Register */
       uint32_t RESERVED9[1];

  __IO uint32_t CLKOUTCLKSEL;           /*!< Offset: 0x0E0 (R/W)  CLKOUT clock source select Register */
  __IO uint32_t CLKOUTUEN;              /*!< Offset: 0x0E4 (R/W)  CLKOUT clock source update enable Register */
  __IO uint32_t CLKOUTDIV;              /*!< Offset: 0x0E8 (R/W)  CLKOUT clock divider Register */
       uint32_t RESERVED10[5];

  __I  uint32_t PIOPORCAP0;             /*!< Offset: 0x100 (R/ )  POR captured PIO status 0 Register */
  __I  uint32_t PIOPORCAP1;             /*!< Offset: 0x104 (R/ )  POR captured PIO status 1 Register */
       uint32_t RESERVED11[11];
       uint32_t RESERVED12[7];
  __IO uint32_t BODCTRL;                /*!< Offset: 0x150 (R/W)  BOD control Register */
  __IO uint32_t SYSTCKCAL;              /*!< Offset: 0x154 (R/W)  System tick counter calibration Register */
       uint32_t RESERVED13[1];
       uint32_t RESERVED14[5];
       uint32_t RESERVED15[2];          
       uint32_t RESERVED16[34];          

  __IO uint32_t STARTAPRP0;             /*!< Offset: 0x200 (R/W)  Start logic edge control Register 0 */     
  __IO uint32_t STARTERP0;              /*!< Offset: 0x204 (R/W)  Start logic signal enable Register 0 */
  __O  uint32_t STARTRSRP0CLR;          /*!< Offset: 0x208 ( /W)  Start logic reset Register 0 */
  __I  uint32_t STARTSRP0;              /*!< Offset: 0x20C (R/ )  Start logic status Register 0 */
  __IO uint32_t STARTAPRP1;             /*!< Offset: 0x210 (R/W)  Start logic edge control Register 1   (LPC11UXX only) */     
  __IO uint32_t STARTERP1;              /*!< Offset: 0x214 (R/W)  Start logic signal enable Register 1  (LPC11UXX only) */      
  __O  uint32_t STARTRSRP1CLR;          /*!< Offset: 0x218 ( /W)  Start logic reset Register 1          (LPC11UXX only) */
  __I  uint32_t STARTSRP1;              /*!< Offset: 0x21C (R/ )  Start logic status Register 1         (LPC11UXX only) */
       uint32_t RESERVED17[4];

  __IO uint32_t PDSLEEPCFG;             /*!< Offset: 0x230 (R/W)  Power-down states in Deep-sleep mode Register  */
  __IO uint32_t PDAWAKECFG;             /*!< Offset: 0x234 (R/W)  Power-down states after wake-up from Deep-sleep mode Register*/       
  __IO uint32_t PDRUNCFG;               /*!< Offset: 0x238 (R/W)  Power-down configuration Register*/
       uint32_t RESERVED18[110];
  __I  uint32_t DEVICE_ID;              /*!< Offset: 0x3F4 (R/ )  Device ID Register */
} LPC_SYSCON_TypeDef;


/*------------- Pin Connect Block (IOCON) --------------------------------*/

typedef struct
{
  __IO uint32_t PIO2_6;                 /*!< Offset: 0x000 (R/W) I/O configuration for pin PIO2_6 */
       uint32_t RESERVED0[1];
  __IO uint32_t PIO2_0;                 /*!< Offset: 0x008 (R/W)  I/O configuration for pin PIO2_0/DTR/SSEL1 */
  __IO uint32_t RESET_PIO0_0;           /*!< Offset: 0x00C (R/W)  I/O configuration for pin RESET/PIO0_0  */
  __IO uint32_t PIO0_1;                 /*!< Offset: 0x010 (R/W)  I/O configuration for pin PIO0_1/CLKOUT/CT32B0_MAT2 */
  __IO uint32_t PIO1_8;                 /*!< Offset: 0x014 (R/W)  I/O configuration for pin PIO1_8/CT16B1_CAP0 */
       uint32_t RESERVED1[1];
  __IO uint32_t PIO0_2;                 /*!< Offset: 0x01C (R/W)  I/O configuration for pin PIO0_2/SSEL0/CT16B0_CAP0 */

  __IO uint32_t PIO2_7;                 /*!< Offset: 0x020 (R/W)  I/O configuration for pin PIO2_7 */
  __IO uint32_t PIO2_8;                 /*!< Offset: 0x024 (R/W)  I/O configuration for pin PIO2_8 */
  __IO uint32_t PIO2_1;                 /*!< Offset: 0x028 (R/W)  I/O configuration for pin PIO2_1/nDSR/SCK1 */
  __IO uint32_t PIO0_3;                 /*!< Offset: 0x02C (R/W)  I/O configuration for pin PIO0_3 */
  __IO uint32_t PIO0_4;                 /*!< Offset: 0x030 (R/W)  I/O configuration for pin PIO0_4/SCL */
  __IO uint32_t PIO0_5;                 /*!< Offset: 0x034 (R/W)  I/O configuration for pin PIO0_5/SDA */
  __IO uint32_t PIO1_9;                 /*!< Offset: 0x038 (R/W)  I/O configuration for pin PIO1_9/CT16B1_MAT0 */
  __IO uint32_t PIO3_4;                 /*!< Offset: 0x03C (R/W)  I/O configuration for pin PIO3_4 */

  __IO uint32_t PIO2_4;                 /*!< Offset: 0x040 (R/W)  I/O configuration for pin PIO2_4 */
  __IO uint32_t PIO2_5;                 /*!< Offset: 0x044 (R/W)  I/O configuration for pin PIO2_5 */
  __IO uint32_t PIO3_5;                 /*!< Offset: 0x048 (R/W)  I/O configuration for pin PIO3_5 */
  __IO uint32_t PIO0_6;                 /*!< Offset: 0x04C (R/W)  I/O configuration for pin PIO0_6/SCK0 */
  __IO uint32_t PIO0_7;                 /*!< Offset: 0x050 (R/W)  I/O configuration for pin PIO0_7/nCTS */
  __IO uint32_t PIO2_9;                 /*!< Offset: 0x054 (R/W)  I/O configuration for pin PIO2_9 */
  __IO uint32_t PIO2_10;                /*!< Offset: 0x058 (R/W)  I/O configuration for pin PIO2_10 */
  __IO uint32_t PIO2_2;                 /*!< Offset: 0x05C (R/W)  I/O configuration for pin PIO2_2/DCD/MISO1 */

  __IO uint32_t PIO0_8;                 /*!< Offset: 0x060 (R/W)  I/O configuration for pin PIO0_8/MISO0/CT16B0_MAT0 */
  __IO uint32_t PIO0_9;                 /*!< Offset: 0x064 (R/W)  I/O configuration for pin PIO0_9/MOSI0/CT16B0_MAT1 */
  __IO uint32_t SWCLK_PIO0_10;          /*!< Offset: 0x068 (R/W)  I/O configuration for pin SWCLK/PIO0_10/SCK0/CT16B0_MAT2 */
  __IO uint32_t PIO1_10;                /*!< Offset: 0x06C (R/W)  I/O configuration for pin PIO1_10/AD6/CT16B1_MAT1 */
  __IO uint32_t PIO2_11;                /*!< Offset: 0x070 (R/W)  I/O configuration for pin PIO2_11/SCK0 */
  __IO uint32_t R_PIO0_11;              /*!< Offset: 0x074 (R/W)  I/O configuration for pin TDI/PIO0_11/AD0/CT32B0_MAT3 */
  __IO uint32_t R_PIO1_0;               /*!< Offset: 0x078 (R/W)  I/O configuration for pin TMS/PIO1_0/AD1/CT32B1_CAP0 */
  __IO uint32_t R_PIO1_1;               /*!< Offset: 0x07C (R/W)  I/O configuration for pin TDO/PIO1_1/AD2/CT32B1_MAT0 */

  __IO uint32_t R_PIO1_2;               /*!< Offset: 0x080 (R/W)  I/O configuration for pin nTRST/PIO1_2/AD3/CT32B1_MAT1 */
  __IO uint32_t PIO3_0;                 /*!< Offset: 0x084 (R/W)  I/O configuration for pin PIO3_0/nDTR */
  __IO uint32_t PIO3_1;                 /*!< Offset: 0x088 (R/W)  I/O configuration for pin PIO3_1/nDSR */
  __IO uint32_t PIO2_3;                 /*!< Offset: 0x08C (R/W)  I/O configuration for pin PIO2_3/RI/MOSI1 */
  __IO uint32_t SWDIO_PIO1_3;           /*!< Offset: 0x090 (R/W)  I/O configuration for pin SWDIO/PIO1_3/AD4/CT32B1_MAT2 */
  __IO uint32_t PIO1_4;                 /*!< Offset: 0x094 (R/W)  I/O configuration for pin PIO1_4/AD5/CT32B1_MAT3 */
  __IO uint32_t PIO1_11;                /*!< Offset: 0x098 (R/W)  I/O configuration for pin PIO1_11/AD7 */
  __IO uint32_t PIO3_2;                 /*!< Offset: 0x09C (R/W)  I/O configuration for pin PIO3_2/nDCD */

  __IO uint32_t PIO1_5;                 /*!< Offset: 0x0A0 (R/W)  I/O configuration for pin PIO1_5/nRTS/CT32B0_CAP0 */
  __IO uint32_t PIO1_6;                 /*!< Offset: 0x0A4 (R/W)  I/O configuration for pin PIO1_6/RXD/CT32B0_MAT0 */
  __IO uint32_t PIO1_7;                 /*!< Offset: 0x0A8 (R/W)  I/O configuration for pin PIO1_7/TXD/CT32B0_MAT1 */
  __IO uint32_t PIO3_3;                 /*!< Offset: 0x0AC (R/W)  I/O configuration for pin PIO3_3/nRI */
  __IO uint32_t SCK_LOC;                /*!< Offset: 0x0B0 (R/W)  SCK pin location select Register */
  __IO uint32_t DSR_LOC;                /*!< Offset: 0x0B4 (R/W)  DSR pin location select Register */
  __IO uint32_t DCD_LOC;                /*!< Offset: 0x0B8 (R/W)  DCD pin location select Register */
  __IO uint32_t RI_LOC;                 /*!< Offset: 0x0BC (R/W)  RI pin location Register */
} LPC_IOCON_TypeDef;

/*------------- Timer (TMR) --------------------------------------------------*/

typedef struct
{
  __IO uint32_t IR;             /*!< Offset: 0x000 (R/W)  Interrupt Register */
  __IO uint32_t TCR;            /*!< Offset: 0x004 (R/W)  Timer Control Register */
  __IO uint32_t TC;             /*!< Offset: 0x008 (R/W)  Timer Counter Register */
  __IO uint32_t PR;             /*!< Offset: 0x00C (R/W)  Prescale Register */
  __IO uint32_t PC;             /*!< Offset: 0x010 (R/W)  Prescale Counter Register */
  __IO uint32_t MCR;            /*!< Offset: 0x014 (R/W)  Match Control Register */
  __IO uint32_t MR0;            /*!< Offset: 0x018 (R/W)  Match Register 0 */
  __IO uint32_t MR1;            /*!< Offset: 0x01C (R/W)  Match Register 1 */
  __IO uint32_t MR2;            /*!< Offset: 0x020 (R/W)  Match Register 2 */
  __IO uint32_t MR3;            /*!< Offset: 0x024 (R/W)  Match Register 3 */
  __IO uint32_t CCR;            /*!< Offset: 0x028 (R/W)  Capture Control Register */
  __I  uint32_t CR0;            /*!< Offset: 0x02C (R/ )  Capture Register 0 */
       uint32_t RESERVED1[3];   
    __IO uint32_t EMR;       /*!< Offset: 0x03C (R/W)  External Match Register */
       uint32_t RESERVED2[12];
  __IO uint32_t CTCR;           /*!< Offset: 0x070 (R/W)  Count Control Register */
  __IO uint32_t PWMC;           /*!< Offset: 0x074 (R/W)  PWM Control Register */
} LPC_TMR_TypeDef;

/******************************************************************************/
/*                         Peripheral memory map                              */
/******************************************************************************/
/* Base addresses                                                             */
#define LPC_FLASH_BASE        (0x00000000UL)
#define LPC_RAM_BASE          (0x10000000UL)
#define LPC_APB0_BASE         (0x40000000UL)
#define LPC_AHB_BASE          (0x50000000UL)

/* APB0 peripherals                                                           */
#define LPC_I2C_BASE          (LPC_APB0_BASE + 0x00000)
#define LPC_WDT_BASE          (LPC_APB0_BASE + 0x04000)
#define LPC_UART_BASE         (LPC_APB0_BASE + 0x08000)
#define LPC_CT16B0_BASE       (LPC_APB0_BASE + 0x0C000)
#define LPC_CT16B1_BASE       (LPC_APB0_BASE + 0x10000)
#define LPC_CT32B0_BASE       (LPC_APB0_BASE + 0x14000)
#define LPC_CT32B1_BASE       (LPC_APB0_BASE + 0x18000)
#define LPC_ADC_BASE          (LPC_APB0_BASE + 0x1C000)
#define LPC_PMU_BASE          (LPC_APB0_BASE + 0x38000)
#define LPC_SSP0_BASE         (LPC_APB0_BASE + 0x40000)
#define LPC_IOCON_BASE        (LPC_APB0_BASE + 0x44000)
#define LPC_SYSCON_BASE       (LPC_APB0_BASE + 0x48000)
#define LPC_CAN_BASE          (LPC_APB0_BASE + 0x50000)
#define LPC_SSP1_BASE         (LPC_APB0_BASE + 0x58000)

/* AHB peripherals                                                            */
#define LPC_GPIO_BASE         (LPC_AHB_BASE  + 0x00000)
#define LPC_GPIO0_BASE        (LPC_AHB_BASE  + 0x00000)
#define LPC_GPIO1_BASE        (LPC_AHB_BASE  + 0x10000)
#define LPC_GPIO2_BASE        (LPC_AHB_BASE  + 0x20000)
#define LPC_GPIO3_BASE        (LPC_AHB_BASE  + 0x30000)

/******************************************************************************/
/*                         Peripheral declaration                             */
/******************************************************************************/
#define LPC_I2C               ((LPC_I2C_TypeDef    *) LPC_I2C_BASE   )
#define LPC_WDT               ((LPC_WDT_TypeDef    *) LPC_WDT_BASE   )
#define LPC_UART              ((LPC_UART_TypeDef   *) LPC_UART_BASE  )
#define LPC_TMR16B0           ((LPC_TMR_TypeDef    *) LPC_CT16B0_BASE)
#define LPC_TMR16B1           ((LPC_TMR_TypeDef    *) LPC_CT16B1_BASE)
#define LPC_TMR32B0           ((LPC_TMR_TypeDef    *) LPC_CT32B0_BASE)
#define LPC_TMR32B1           ((LPC_TMR_TypeDef    *) LPC_CT32B1_BASE)
#define LPC_ADC               ((LPC_ADC_TypeDef    *) LPC_ADC_BASE   )
#define LPC_PMU               ((LPC_PMU_TypeDef    *) LPC_PMU_BASE   )
#define LPC_SSP0              ((LPC_SSP_TypeDef    *) LPC_SSP0_BASE  )
#define LPC_SSP1              ((LPC_SSP_TypeDef    *) LPC_SSP1_BASE  )
#define LPC_CAN               ((LPC_CAN_TypeDef    *) LPC_CAN_BASE   )
#define LPC_IOCON             ((LPC_IOCON_TypeDef  *) LPC_IOCON_BASE )
#define LPC_SYSCON            ((LPC_SYSCON_TypeDef *) LPC_SYSCON_BASE)
#define LPC_GPIO0             ((LPC_GPIO_TypeDef   *) LPC_GPIO0_BASE )
#define LPC_GPIO1             ((LPC_GPIO_TypeDef   *) LPC_GPIO1_BASE )
#define LPC_GPIO2             ((LPC_GPIO_TypeDef   *) LPC_GPIO2_BASE )
#define LPC_GPIO3             ((LPC_GPIO_TypeDef   *) LPC_GPIO3_BASE )


*** ARM Cortex M0 Timer programming 

 LPC_SYSCON ->SYSAHBCLKCTRL |= (1 << 8); // Enable Clock for TMR1
 LPC_IOCON ->PIO1_9 |= (1 << 0); // PIN1_9 = CT16B1_MAT0
 LPC_TMR16B1 ->MR0 = 2000; // 50% Duty Cycle
 LPC_TMR16B1 ->PR = 12000;
 LPC_TMR16B1 ->MR3 = 4000; // Cycle Length
 LPC_TMR16B1 ->MCR |= (1 << 10); // TC Reset on MR3 Match
 LPC_TMR16B1 ->PWMC |= (1 << 0); // PWM Mode
 LPC_TMR16B1 ->TCR |= (1 << 0); // GO

// Set a 10ms timer

void TIMER32_0_IRQHandler(void)

LPC_TMR32B0->IR = 1;/* clear 
interrupt flag */
timer32_0_counter++;
return;
}

// And loop forever:

while (1) {
/* Each time we wake up... */
/* Check TimeTick to see whether to set or 
 clear the LED I/O pin */

if ( (timer32_0_counter%LED_TOGGLE_TICKS) < 
 (LED_TOGGLE_TICKS/2) ) 
{
GPIOSetValue( LED_PORT, LED_BIT, LED_OFF );
} else {
GPIOSetValue( LED_PORT, LED_BIT, LED_ON );
}
/* Go to sleep to save power between timer 
 interrupts */
__WFI();
}

*** PWM(50Hz)  

void PWM_init(void){

/** Timer 16 / PWM Settings **/
// PWM output: 16bit_timer1

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); // Enable clock to timer 1
LPC_IOCON->PIO1_9 &= ~0x1F; // - remove bits 0,1 & 2 and pull resistors
LPC_IOCON->PIO1_9 |= 0x01; /* Timer1_16 MAT0 */ //- set bit 1
LPC_IOCON->PIO1_10 &= ~0x1F;// - remove bits 0,1 & 2 and pull resistors
LPC_IOCON->PIO1_10 |= 0x02;/* Timer1_16 MAT1 */

LPC_TMR16B1->MCR = 0x0400; /* Reset at MR3*/
LPC_TMR16B1->PR = 50;/* set prescaler 50*28800 = 72MHz */
LPC_TMR16B1->MR0 = 28800-2880; /* Match register 0 - pulse width
LPC_TMR16B1->MR1 = 7000; /* Match register 1 - no PWM - toggle test */
LPC_TMR16B1->MR3 = 28800;//14399; /* Match register 3 - cycle length */
LPC_TMR16B1->EMR = 0xC2; /* External Match register Settings for PWM channel have no effect.*/
LPC_TMR16B1->PWMC = 0x01; /* PWMC register -MAT0 is PWM. */
GPIOSetDir( 1, 9, 0 ); // Set as output
GPIOSetDir( 1, 10, 1 ); // set as output
LPC_TMR16B1->TCR = 1; // Enable timer 1
}

.END


No comments:

Post a Comment