12554|18

152

帖子

0

TA的资源

裸片初长成(初级)

楼主
 

【EEWORLD】救火车和你一起学ARM系列活动之三 [复制链接]

上期回顾:
【EEWORLD】救火车和你一起学ARM系列活动之一——发起活动和组建工作环境
https://bbs.eeworld.com.cn/thread-73857-1-1.html
【EEWORLD】救火车和你一起学ARM系列活动之二——最小系统电路和建立第一个软件工程
https://bbs.eeworld.com.cn/thread-74133-1-1.html



LPC2103系统模块设置
在上一个实验中,我们已经让芯片“跑”起来了。但是它是工作在默认的状态,并没能发挥出芯片的性能。我们在这次活动中,研究一下芯片的系统模块配置,使ARM芯片的性能得到充分的发挥。了解芯片的时钟源,为后续的实验打好基础。所以必须先把系统模块设置搞清楚。


在这次活动中,我们的学习目的
第一、了解LPC2103芯片的时钟系统。分清晶振频率(FOSC)、处理器时钟(Fcclk)、系统外设时钟(Fpclk)、CCO时钟。
第二、通过对锁相环PLL和VPB分频器的配置,实现我们想要的时钟系统。

我们开始。先看下面的图。

(图一 几种频率的关系。括号里是有关的寄存器名)
PLL锁相环:可以通过PLL升频和增强抗干扰性能。
VPB分频器: 对PLL时钟分频,供给片上外设使用。

区分下面四种时钟频率的概念
晶振频率(FOSC):外部晶振的频率,我们的板子焊的是11.0592M的。
处理器时钟(Fcclk):芯片执行指令的频率。Fcclk = FOSC × PLL倍频。相关寄存器:PLLCFG[4:0]。
VPB时钟(Fpclk):给片内外设提供的时钟频率。Fpclk=Fcclk/PLL分频。相关寄存器:APBDIV
CCO时钟:不用管它是干什么的。只要把它设置成156MHz~320MHz就行。相关寄存器:PLLCFG[6:5]

下面是IAR5.4和MDK4.2的起动文件的默认配置。


IAR5.4
MDK3.24
文件名
lpc2xxx_cstartup
Startup.s
版本
Revision: 21638
未标识
PLL
锁相环
未设置
默认值为
PLL倍增器值M=1
PLL分频器值P=1
PLLCFG=0x04;
PLL倍增器值M=5
PLL分频器值P=2

VPB
分频器
未设置
默认值为VPB总线时钟为处理器时钟的1/4
未设置
默认值为VPB总线时钟为处理器时钟的1/4

我们发现,IAR的起动文件中没有对PLL进行配置,它是工作在默认配置下,没有倍频。相比之下,MDK的默认配置更能发挥出芯片的性能。MDK启用了PLL,ARM指令工作在5倍于晶振频率。我们现在准备在IAR中把PLL配置成6倍频、VPB  2分频的状态。

PLL配置需要的寄存器如下:
PLLCON:PLL控制寄存器。控制PLL使能和PLL连接的状态。
PLLCFG:PLL配置寄存器。设置PLL倍频和PLL分频。
PLLSTAT:PLL状态寄存器。只读寄存器,读出PLL状态。
PLLFEED:PLL馈送寄存器。将值0xAA、0x55写入PLLFEED,才能使PLLCON和 PLLCFG的配置生效。

VPB配置需要的寄存器
APBDIV:VPB分频器。

计算频率值
Fosc = 11.0592MHz //外部晶振频率
Fcclk = 11.0592*6 = 66.3552MHz    //必须低于芯片的最高频率70MHz
Fpclk = Fcclk/4 = 16.5888MHz      
Fcco = 66.3552*2*P = 265.4208MHz
//必须在156MHz~320MHz之间

设置过程
先对PLLCFG设置,PLLCON置成使能,但不连接的状态。等待PLL频率锁定以后,最后把PLL设置成连接入状态,把经过PLL倍增的频率接入,作为系统时钟使用。

下面是程序例子,在main函数中调用。
void Init_VPB_PLL()
{
    //Fosc = 11.0592MHz
    //Fcclk = 11.0592*6 = 66.3552MHz
    //Fcco = 66.3552*2*P =265.4208MHz
    //Fpclk =16.5888MHz
   
   // 配置VPB分频器相关寄存器
    APBDIV = 0x00; // Fcclk * 1/4   


  //配置PLL锁相环相关寄存器
    PLLCFG = 0x25; // 0 01 00101  分频器值(P=2) 倍增器值(M=6)
    PLLCON = 0x01; // PLLE=1 PLL使能 但PLL未连接
    PLLFEED = 0xAA;// 0xAA 和0x55,为固定数据,写入以后。配置才会生效。
    PLLFEED = 0x55;

    while((PLLSTAT&(1<<10))==0);

    PLLCON = 0x03; //PLLE=1 PLLC=1 PLL使能并连接
    PLLFEED = 0xAA;
    PLLFEED = 0x55;
}

下面是main函数调用

PLL说明和设置详细内容请参考如下文档:
user.manual.lpc2101.lpc2102.lpc2103.PDF      46-53(英文原版)      
LPC2101_2102_2103_01-user_cn.PDF             19-24页 (周立功翻译)
ARM嵌入式系统基础教程+周立功 电子文档        158-164页(周立功翻译)

我们把上面程序加入上一个实验的程序中。结果发现,发光二极管闪动明显加快,这就是调置倍频的结果。

下期活动内容
LPC2103 定时器中断。
救火车单片机工作室(http://www.qm999.cn/)为您准备了“百元ARM实验套件”,为参加EEWORLD活动的朋友提供。
  包括H-JTAG仿真器(并口)、LPC2103核心板、并口延长线1条、USB延长线1条、面包板2块。一共98元(含邮费)。联系QQ:849046309
此帖出自单片机论坛

最新回复

写有太好了,我正需要学习这个  详情 回复 发表于 2009-12-5 16:03
点赞 关注
个人签名我是有火救火,无火灌水的救火车
救火车单片机工作室
http://www.qm999.cn
 

回复
举报

152

帖子

0

TA的资源

裸片初长成(初级)

沙发
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

与本次活动无关的贴子,请发到别处。
此帖出自单片机论坛
 
个人签名我是有火救火,无火灌水的救火车
救火车单片机工作室
http://www.qm999.cn
 

回复

1万

帖子

16

TA的资源

版主

板凳
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

不错,顶一下
此帖出自单片机论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

152

帖子

0

TA的资源

裸片初长成(初级)

4
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

关于VPB分频器配置的寄存器名称,在这里说一下,有的资料说是VPBDIV,有的资料说是 APBDIV。。。但是在IAR编译器下,我们经过实验,确定为APBDIV。
此帖出自单片机论坛
 
个人签名我是有火救火,无火灌水的救火车
救火车单片机工作室
http://www.qm999.cn
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

5
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

救火车:
我要一ARM实验套件
此帖出自单片机论坛
 
 
 

回复

152

帖子

0

TA的资源

裸片初长成(初级)

6
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

to:  sdiven
    有多种方式可以联系到我,加我QQ或其它方式详谈。。。
此帖出自单片机论坛
 
个人签名我是有火救火,无火灌水的救火车
救火车单片机工作室
http://www.qm999.cn
 
 

回复

477

帖子

0

TA的资源

五彩晶圆(高级)

7
 
原帖由 救火车 于 2009-4-1 16:19 发表
关于VPB分频器配置的寄存器名称,在这里说一下,有的资料说是VPBDIV,有的资料说是 APBDIV。。。但是在IAR编译器下,我们经过实验,确定为APBDIV。

这个具体的文档我没看过,但是我觉得寄存器的名字可以改的啊,一般是在类似于cpu.h的文件里面,有个#define APBDIV 0x00001234这样一句话,然后如果改成#define VPBDIV 0x00001234就可以了。其中00001234为这个SFR的地址。跟编译器是没有什么关系的。如果你喜欢,也可以改成#define VAPBDIV 0x00001234的。
此帖出自单片机论坛
 
 
 

回复

477

帖子

0

TA的资源

五彩晶圆(高级)

8
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

查了下,地址应该是0xE01F C100

Name:APBDIV
Description:Controls the rate of the APB clock in relation to the processor clock.
Access:R/W
Reset value:0x00
Address:0xE01F C100
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

9
 
顶上几下
此帖出自单片机论坛
 
 
 

回复

285

帖子

3721

TA的资源

五彩晶圆(中级)

10
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

/* SCK引脚 */
#define  SPI_SCK                                (0x01 << 4)                                               
#define  SPI_SCK_GPIO()                        PINSEL0 &= ~(0x03 << 8)                        /* 设置 SCK 口为GPIO口 */
#define  SPI_SCK_OUT()                        IODIR |= SPI_SCK                                /* 设置 SCK 口为输出口 */
#define         SPI_SCK_CLR()                        IOCLR = SPI_SCK                                        /* 置 SCK 为低电平 */       

/* MISO 引脚 */       
#define  SPI_MISO                                (0x01 << 5)                                               
#define  SPI_MISO_GPIO()                PINSEL0 &= ~(0x03 << 10)                /* 设置 MISO 口为GPIO口 */
#define  SPI_MISO_OUT()                        IODIR |= SPI_MISO                                /* 设置 MISO 口为输出口 */
#define         SPI_MISO_CLR()                        IOCLR = SPI_MISO                                /* 置 MISO 为低电平 */

/* MOSI 引脚 */       
#define  SPI_MOSI                                (0x01 << 6)
#define  SPI_MOSI_GPIO()                PINSEL0 &= ~(0x03 << 12)                /* 设置 MOSI 口为GPIO口 */
#define  SPI_MOSI_OUT()                        IODIR |= SPI_MOSI                                /* 设置 MOSI 口为输出口 */
#define         SPI_MOSI_CLR()                        IOCLR = SPI_MOSI                                /* 置 MISO 为低电平 */

/* CS 引脚 */               
#define  SPI_CS                              (0x01 << 8)                              
#define  SPI_CS_GPIO()                        PINSEL0 &= ~(0x03 << 16)                 /* 设置 CS 口为GPIO口 */
#define  SPI_CS_OUT()                        IODIR |= SPI_CS;                                 /* 设置 CS 口为输出口 */
#define         SPI_CS_SET()                        IOSET |= SPI_CS;                                /* 置 CS 为高电平 */
#define         SPI_CS_CLR()                        IOCLR |= SPI_CS;                                /* 置 CS 为低电平 */


这个是ZLG的开发板SD卡读写程序,我的开发板不是这样的,CS引脚对应的是P0.20   MOSI引脚对应的是P0.19,SCK引脚对应的是P0.17,MISO引脚对应的是P0.18,请问上面那段代码要如何修改,我刚学,请帮帮我,万分感谢!
此帖出自单片机论坛
 
 
 

回复

152

帖子

0

TA的资源

裸片初长成(初级)

11
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

呵呵。事实上,周立功这样的预定义确实让很多人 都感觉摸不着头脑。明明是很简单的端口定义,非要写的这么复杂。。很多大公司都是这样的,,程序写了很多预定义,使用者却找不到怎么用。。你可以直接通过写寄存器的方法对所使用的I/O口进行定义。。比如定义I/O口的方向,而置高低电平的时候,,直接写0  或者1 就可以了。。象对AVR单片机那样操作它。。
此帖出自单片机论坛
 
个人签名我是有火救火,无火灌水的救火车
救火车单片机工作室
http://www.qm999.cn
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

12
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

简单又明了啊  谢谢楼主了
此帖出自单片机论坛
 
 
 

回复

73

帖子

0

TA的资源

纯净的硅(中级)

13
 

Re: [讨论] 【EEWORLD】救火车和你一起学ARM系列活动之三

简单又明了啊  谢谢楼主了
此帖出自单片机论坛
 
 
 

回复

152

帖子

0

TA的资源

裸片初长成(初级)

14
 
自己顶一下
此帖出自单片机论坛
 
个人签名我是有火救火,无火灌水的救火车
救火车单片机工作室
http://www.qm999.cn
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

15
 
我也顶一下
此帖出自单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(高级)

16
 
没有相关下载了?
此帖出自单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

17
 
这一篇经典
学习了
此帖出自单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

18
 
问一下,为什么我设置完PLL不能锁定频率?
PLLSTAT值一直是0
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

19
 

写有太好了,我正需要学习这个
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表