时钟配置的仿真

发布者:光子梦境最新更新时间:2016-08-23 来源: eefocus关键字:时钟配置  仿真 手机看文章 扫描二维码
随时随地手机看文章
在ARM-MDK开发环境中,提供了很好用的时钟配置仿真模式,为学习LPC1114的时钟配置提供了方便,下面就来详细讨论一下它的用法。

要进行仿真,必须先把程序进行编译,正确无误后才能进入到仿真模式。为此,先给出主函数的内容,如下。

void SystemInit(void)

{

       SysCLK_config();         //调用时钟配置函数

}

int main(void)

{

       SystemInit ();        //调用系统初始化函数

       while(1)

       {

              ;                           //空循环

       }

}

 

在上述程序中可以看出,主函数的写法和普通单片机开发的没有什么两样,都有一个死循环,因为这里只做时钟配置的仿真,所以在调用时钟配置函数后就进行一个空循环。只有三点要特别注意一下:一是这里的main函数必须是整型(int型)的;二是在程序结束的最后一行要有一个换行(即要回一下车),否则会有警告出现;三是在项目自动加载的启动文件中规定,程序中必须要有一个系统初始化的函数(SystemInit),否则程序不能编译链接。所以在上述程序中虽然只调用一个时钟配置函数,但还是要把它放入到系统初始化函数中去供主函数调用。

但是,把上述函数及前面的时钟配置函数写到主程序后,还是编译不过的,会报两条错误,说“uint8_t”和“LPC_SYSCON”没有定义。这是因为程序没有包含一些特定的头文件,在这些头文件内才有相关变量的申明。要程序顺利编译通过,必须要把这些头文件包含进来。但是,由于开发LPC1114所需要的头文件很多,且有些头文件还有彼此的依赖关系,对于不同的开发环境,定义的名称也不一致,因此,为了减小学习的挫折感,先快速的把我们的第一个程序运行起来,下面用不包含头文件的方式,把程序所用到的内容全部都列出来,这样只要把下面的程序复制到开发环境中,就可以顺利通过编译了。

程序代码如下:

#define   __IO    volatile

#define   __O    volatile

#define   __I     volatile const

typedef unsigned          char uint8_t;

typedef unsigned short       int uint16_t;

typedef unsigned          int uint32_t;

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;

#define LPC_APB0_BASE         (0x40000000UL)

#define LPC_AHB_BASE          (0x50000000UL)

#define LPC_SYSCON_BASE      (LPC_APB0_BASE + 0x48000)

#define LPC_SYSCON            ((LPC_SYSCON_TypeDef *) LPC_SYSCON_BASE)

//************************************************************************************************ 

void SysCLK_config(void)

{

       uint8_t i;

       LPC_SYSCON->PDRUNCFG &= ~(1 << 5);            //给系统振荡器上电

       LPC_SYSCON->SYSOSCCTRL = 0x00000000;        //系统振荡器未旁路,1~12MHz输入

       for (i = 0; i < 200; i++) __nop();                                    //延时等待振荡器稳定

       LPC_SYSCON->SYSPLLCLKSEL = 0x00000001;    //PLL输入选择外部晶体振荡

       LPC_SYSCON->SYSPLLCLKUEN = 0x00;

       LPC_SYSCON->SYSPLLCLKUEN = 0x01;              //先写0后写1更新时钟源

       while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));     //等待更新完成

       LPC_SYSCON->SYSPLLCTRL = 0x00000023;        //M=4、P=2,倍频后的时钟为48MHz

       LPC_SYSCON->PDRUNCFG &= ~(1 << 7);           //给PLL上电

       while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));    //等待PLL锁定

       LPC_SYSCON->MAINCLKSEL = 0x00000003;      //主时钟选择PLL倍频后的时钟

       LPC_SYSCON->MAINCLKUEN = 0x00;

       LPC_SYSCON->MAINCLKUEN = 0x01;                 //先写0后写1更新时钟源

       while (!(LPC_SYSCON->MAINCLKUEN & 0x01));        //等待更新完成

       LPC_SYSCON->SYSAHBCLKDIV = 0x00000001; //AHB为1分频,AHB时钟为48MHz

       LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);        //使能GPIO时钟

}

void SystemInit(void)

{

       SysCLK_config();

}

int main(void)

{

       SystemInit ();        //调用时钟配置函数

       while(1)

       {

              ;                           //空循环

       }

}

 

(不要忘记最后一行有一个强制换行)

从上面可以看到,变量的申明都是以结构体的形式出现的,较为复杂,现在先不去讨论它。先把上述程序编译链接(点击工具条上的“Rebuild”按钮)无误后,点击工具条上的“Start/Stop Debug Session”按钮(或按Ctrl+F5)进入到调试模式。点击菜单Peripherals->Clocking & Power Control->Clock Generation Schematic,将会出现一个显示时钟结构的对话框,如下图所示。

时钟配置的仿真 - 西区故事 - 松柏后凋

从图中可以清楚地看出配置后各时钟的分配情况(如果时钟不对,可能是没有运行程序,只要点击工具条上的“Run”按钮(或直接按F5)就可以了),非常直观。大家还可对照前面的程序,自行更改相关内容,再仿真看看变化,以加深对时钟配置的了解。要更改仿真中的外部晶振的值可点击菜单Peripherals->Clocking & Power Control->System Oscillator Control进行更改,要更改内部RC振荡的值可点击菜单Peripherals->Clocking & Power Control->Internal Oscillator Control进行更改,要更改看门狗振荡的值可点击菜单Peripherals->Clocking & Power Control->Watchdog Oscillator Control进行更改。甚至你还可以看到在设置错误(如把PLL倍频后的时钟设置了超过50MHz)的情况下,主时钟会自动转到默认的12MHz内部RC振荡中去执行,真是非常了不起。

除了仿真以外,LPC1114还提供了一个时钟输出端口CLKOUT,它被复用在P0.1引脚,可以通过程序控制它来输出内部RC振荡时钟、系统振荡器时钟(外部晶振)、看门狗振荡时钟和主时钟。

下面就给出一个CLKOUT引脚输出时钟的函数,如下:

void CLKOUT_EN(uint8_t CLKOUT_DIV)

{

       LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);             //使能IOCON时钟

       LPC_IOCON->PIO0_1=0XD1;                                       //把P0.1设置为CLKOUT引脚

       LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16);        //禁止IOCON时钟

       LPC_SYSCON->CLKOUTDIV = CLKOUT_DIV;            //输出分频为48/ CLKOUT_DIV

       LPC_SYSCON->CLKOUTCLKSEL= 0X00000003;         //CLKOUT时钟选择主时钟

       LPC_SYSCON->CLKOUTUEN =0X00;

       LPC_SYSCON->CLKOUTUEN =0X01;                          //先写0后写1更新时钟源

       while (!(LPC_SYSCON->CLKOUTUEN & 0x01));          //等待更新完成

}

如果使用的是48MHz的主时钟,分频系数CLKOUT_DIV也取48,则该函数执行完后,LPC1114的P0.1脚就会有1MHz的脉冲输出,可通过示波器来进行观察。

在上述程序中可以看出,要改变一个具有复用的引脚功能时,必须先打开IOCON的时钟,否则配置不生效!而在配置完成后,要及时关闭IOCON时钟,以降低功耗。关于IOCON的配置将会在后面讨论GPIO时进行详细讨论,这里先不赘述。下面给出的是“CLKOUT时钟源选择寄存器(CLKOUTCLKSEL)”的位结构。

 

符号

描述

复位值

1∶0

SEL

(CLKOUT时钟源)

00

IRC振荡器

0

01

系统振荡器

10

看门狗振荡器

11

主时钟

31∶2

-

-

保留

0

 

实验时可根据上表来改变CLKOUTCLKSEL的值,从而观察不同的时钟频率输出。

由于在CLKOUT函数中加入了一些新的寄存器(比如IOCON、GPIO等),所以程序必须在头文件中把相关的申明包含进来,才能正确编译通过。这里同前面一样,为了方便,使用不包含头文件的形式来书写程序,下面给出其全部内容。

#define   __IO    volatile

#define   __O    volatile

#define   __I     volatile const

typedef unsigned          char uint8_t;

typedef unsigned short    int uint16_t;

typedef unsigned          int uint32_t;

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;

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;

#define LPC_APB0_BASE         (0x40000000UL)

#define LPC_AHB_BASE          (0x50000000UL)

#define LPC_IOCON_BASE        (LPC_APB0_BASE + 0x44000)

#define LPC_SYSCON_BASE       (LPC_APB0_BASE + 0x48000)

#define LPC_SYSCON            ((LPC_SYSCON_TypeDef *) LPC_SYSCON_BASE)

#define LPC_IOCON             ((LPC_IOCON_TypeDef  *) LPC_IOCON_BASE )

#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)

#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 )

//************************************************************************************

void SysCLK_config(void)

{

       uint8_t i;

       LPC_SYSCON->PDRUNCFG &= ~(1 << 5);            //给系统振荡器上电

       LPC_SYSCON->SYSOSCCTRL = 0x00000000;        //系统振荡器未旁路,1~12MHz输入

       for (i = 0; i < 200; i++) __nop();                                    //延时等待振荡器稳定

       LPC_SYSCON->SYSPLLCLKSEL = 0x00000001;    //PLL输入选择外部晶体振荡

       LPC_SYSCON->SYSPLLCLKUEN = 0x00;

       LPC_SYSCON->SYSPLLCLKUEN = 0x01;              //先写0后写1更新时钟源

       while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));     //等待更新完成

       LPC_SYSCON->SYSPLLCTRL = 0x00000023;        //M=4、P=2,倍频后的时钟为48MHz

       LPC_SYSCON->PDRUNCFG &= ~(1 << 7);           //给PLL上电

       while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));    //等待PLL锁定

       LPC_SYSCON->MAINCLKSEL = 0x00000003;      //主时钟选择PLL倍频后的时钟

       LPC_SYSCON->MAINCLKUEN = 0x00;

       LPC_SYSCON->MAINCLKUEN = 0x01;                 //先写0后写1更新时钟源

       while (!(LPC_SYSCON->MAINCLKUEN & 0x01));        //等待更新完成

       LPC_SYSCON->SYSAHBCLKDIV = 0x00000001; //AHB为1分频,AHB时钟为48MHz

       LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);        //使能GPIO时钟

}

void SystemInit(void)

{

       SysCLK_config();

}

void CLKOUT_EN(uint8_t CLKOUT_DIV)

{

       LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);

       LPC_IOCON->PIO0_1=0XD1;

       LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16);

       LPC_SYSCON->CLKOUTDIV = CLKOUT_DIV;

       LPC_SYSCON->CLKOUTCLKSEL= 0X00000003;

       LPC_SYSCON->CLKOUTUEN =0X00;

       LPC_SYSCON->CLKOUTUEN =0X01;

       while (!(LPC_SYSCON->CLKOUTUEN & 0x01));

}

int main(void)

{

       SystemInit ();        //调用时钟配置函数

       CLKOUT_EN(48);              //CLKOUT输出1MHz的脉冲

       while(1)

       {

              ;                           //空循环

       }

}

 

从程序中可以看出,它加入了对“IOCON寄存器”和“GPIO寄存器”的定义,仍然使用结构体的形式。把上述程序拷贝到开发环境中编译,然后下载到LPC1114中,就可以通过示波器观察到P0.1脚上的波形了。至于如何通过开发环境生成下载文件,如何把它下载到LPC1114中,会在后面进行讨论。

关键字:时钟配置  仿真 引用地址:时钟配置的仿真

上一篇:LPC1114通用输入/输出端口(GPIO)
下一篇:LPC1114时钟配置

推荐阅读最新更新时间:2024-03-16 15:06

基于SABER仿真器的双管正激参数及控制环路
  0引言   目前,正激变流器在中、大功率场合得到广泛的应用,但单管正激变换器的开关管承受两倍输入电压应力,不能用在较高输入场合。双管正激变换器解决了这个问题,其开关管的电压应力等于输入电压,关断时也不会出现漏感尖峰,加上结构简单、可靠性高,在高输入电压的中、大功率场合得到广泛的应用。   在开关电源的设计过程中,控制环路设计的优劣关系到系统的稳定与否。因此优良的控制环路,对开关电源系统是至关重要的。对于PWM变换器的控制环路,传统的方法使用状态空间平均法,求出小信号模型,来设计控制环路。此方法计算量大,效率低,不利于工程应用。   高效的方法是用仿真软件得出电路开环BODE图来设计控制环路。市面的仿真软件非常多,功能也很
[模拟电子]
基于飞思卡尔芯片的汽车液压ABS系统及其仿真
引言   汽车制动性能的好坏,主要从以下3方面进行评价: 1)制动效能,即制动距离与制动减速度; 2)制动效能的恒定性,即抗热或水衰退性能; 3)制动时汽车的方向稳定性,即制动时汽车不发生跑偏、侧滑以及失去转向能力的性能。   通常,汽车在制动过程中存在着两种力:一种是制动器摩擦片与制动鼓或制动盘之间产生的摩擦阻力,这种阻力称为制动系统的阻力,由于它提供制动时的制动力, 因此也称为制动系制动力;另一种力是轮胎与道路表面之间产生的摩擦阻力,也称为轮胎- 道路附着力。如果制动系制动力小于轮胎- 道路附着力,则汽车制动时会保持稳定状态;反之,如果制动系制动力大于轮胎- 道路附着力,则汽车制动时会出现车轮抱死。如果前轮抱死,汽车基
[汽车电子]
基于飞思卡尔芯片的汽车液压ABS系统及其<font color='red'>仿真</font>
单片机仿真器是什么?单片机仿真器原理
单片机在体系结构上与PC机是完全相同的,也包括中央处理器,输入输出接口,存储器。 单片机仿真器等基本单元,因而与PC机等设备的软件结构也是类似的。因为单片机在软件开发的过程中需要对软件进行调试,观察其中间结果,排除软件中存在的问题。但是由于单片机的应用场合问题,其不具备标准的输入输出装置,受存储空间限制,也难以容纳用于调试程序的专用软件,因此要对单片机软件进行调试,就必须使用单片机仿真器。单片机仿真器具有基本的输入输出装置,具备支持程序调试的软件,使得单片机开发人员可以通过单片机仿真器输入和修改程序,观察程序运行结果与中间值,同时对与单片机配套的硬件进行检测与观察,可以大大提高单片机的编程效率和效果。 其实仿真器也就是模拟一
[单片机]
单片机<font color='red'>仿真</font>器是什么?单片机<font color='red'>仿真</font>器原理
C51单片机利用74hc138扩展流水灯的仿真电路图+程序
C51单片机利用74hc138扩展流水灯程序 包含源代码,仿真电路 可以随意扩展多个LED 电路原理图如下: 单片机源程序如下: #define uint unsigned int #define uchar unsigned char void delay1(uchar y) { uchar i; uint j; for(i=0;i y;i++) { for(j=0;j 5000;j++); } } void led(void) { P3=0x01; //01 P2=0x00; delay1(20); P2=0x01; delay1(20); P2=
[单片机]
C51单片机利用74hc138扩展流水灯的<font color='red'>仿真</font>电路图+程序
MSP430F5529系统升压与时钟配置
前言 相信入门MSP430F5529的你还在苦恼资料少,但是不妨换个角度想想,既然资料少,那就自己吃它!天道酬勤是吧,鸡汤少灌点哈哈,好了,补上上一篇博文所需要的内容,这一章主要就是讲一下系统升压与时钟配置问题,小建议运行程序前还是有必要进行一次时钟源配置,开讲啦! 一、如何系统升压 首先为什么要把系统的核心电压升高呢,自然就是他要与时钟频率相匹配,即1.8V(0~8MHZ),2.0V(0~12MHZ),2.2V(0~20MHZ),2.4V(0~25MHZ)四个级别,即要提高时钟频率,那么相对应的就要进行系统升压。MSP430手册上已经提到了:一表一图很好地说明了 这里大家可能不太明白0、1、2、3代表什么?简单用一个
[单片机]
MSP430F5529系统升压与<font color='red'>时钟</font><font color='red'>配置</font>
ADS软件对倍频器的嵌入式电特性仿真
摘要:利用ADS射频仿真软件和嵌入法对倍频器的环境阻抗、有效激励电平进行了研究,针对倍频器输出端外加负载后对倍频效率产生的影响,提出了改进方法并进行了实际验证。 关键词:ADS;环境阻抗;激励电平;倍频器;倍频效率 1 引言 众所周知,在用倍频链实现高频、高稳微波振荡源的过程中,倍频器倍频效率的高低不仅对简化电路和保持电路稳定性影响较大,而且对整个电路杂散、谐波的抑制都起着重要作用。传统的设计过程需要复杂的理论推导、大量的试验验证,或者依赖于经验进行设计而在现实工程应用中,有时却需要一些特殊的倍频器,如频率不是很常用,倍频次数又较高,采用外协加工,成本和时间都不划算等。对于这些既没有相关的工程设计经验,又无法获得倍频三极
[嵌入式]
一种智能频率计的设计与制作(AVR) 带仿真与源程序和原理图
基于avr单片机的频率计的仿真原理图 俺毕业设计的小玩意.也许有人可以拿去玩. 当时刚出毕业选题就赶紧的选了这个简单的.免得以后为毕业设计费神. 这是最初的,后来给学校也是交的这个. 花了三天时间. //*********************11月29日开始毕业选题 读了一点频率计原理,高频记数,低频测周期 规划了一下大体,坚决不用老师指定的51, //*********************11月30日开始写代码 凑合着开始了,偏差很大,很无聊,晚上跟123JJ在51hei灌水,灌了阵找到思维了,继续写,基本完成 //*********************12月1日调试 写了个串口上位机对数据进行分析和记录,方便
[单片机]
一种智能频率计的设计与制作(AVR) 带<font color='red'>仿真</font>与源程序和原理图
基于FPGA 的谐波电压源离散域建模与仿真
摘要: 用于 电能计量 的谐波电压源要求具有很强的谐波合成能力,因此,对采样频率要求较高。目前,绝大多数谐波电压源装置采用 DSP 作为控制 芯片 。DSP 虽然有着很强的信号处理能力,但其采样率不高,不能满足电能计量用谐波电压源采样精度的要求。对此,提出了将FPGA 应用于谐波电压源的研究中,采用基于SPWM 的双闭环PI控制策略,在VHS-ADC 高速信号处理平台上搭建离散域控制模型并进行仿真。仿真结果表明,输出波形稳定,具有较小的畸变率,说明了基于FPGA 进行谐波电压源研究的可行性。    0 引言   近年来,由于电力 电子 装置等非线性负荷的大量增加,电力系统的谐波污染越来越严重,严重地影响了电能计量的准确性和合理
[嵌入式]
基于FPGA 的谐波电压源离散域建模与<font color='red'>仿真</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved