请选择 进入手机版 | 继续访问电脑版
查看: 3518|回复: 3

[分享] NXP Cortex-M3 LPC1768基础教程(三)

[复制链接]
  • TA的每日心情
    难过
    2023-9-6 15:15
  • 签到天数: 211 天

    [LV.7]常住居民III

    34

    主题

    805

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2030
    最后登录
    2024-3-21
    发表于 2019-12-17 14:34:22 | 显示全部楼层 |阅读模式
    本帖最后由 guoyuli 于 2019-12-17 16:25 编辑

    芯片编程介绍

    1.系统文件介绍
            在写程序的时候有一些东西是编译器自带的一些文件,比如芯片的头文件,再比如汇编的启动代码,在LPC17XX 里还有一个系统初始化文件。在我们的工程里主要有3 个头文件,2 个C 文件,1 个.S 文件。分别是:LPC17xx.h 、core_cm3.h、system_LPC17xx.h;core_cm3.c 、system_LPC17xx.c ; startup_LPC17xx.s ; 其中startup_LPC17xx.s 是系统自动加载的ARM 启动汇编代码。
            LPC17XX.h 是芯片的头文件,定义的是芯片寄存器的结构体。有时候有些寄存器和手册上写法有细微的区别,打开看一下就可以了哈,需要注意的是keil 在头文件里关于寄存器的定义都是以结构体的方式定义的,所以我们在写程序的时候访问寄存器也要以寄存器方式访问,比如在GPIO 的操作的时候由一个名叫“FIODIR”的方向寄存器,是一个32 位的寄存器,对应一个IO 口的32 位,如果某位为1 则对应的管脚为输出模式,因此在访问的时候写法
    如下:
    LPC_GPIO1->FIODIR=0x000000ff;
            GPIO1 表示P1 口,GPIO2 表示P2 口,上面这行代码表示P1 口的低8 位为输出模式。由于keil 版本的原因可能有些版本定义结构体的时候没有LPC_这个部分使得访问GPIO1 的写法如下:
    GPIO1->FIODIR=0x000000ff;
            关于这个的确认可以打开LPC17XX.h 看一下就知道了。还有一点需要注意的是在keil 的头文件里定义寄存器是以32 位的方式定义的,所以不能使用手册中说明的字,半字的访问方式只能使用32 位的访问方式。
            要访问端口x 需要使用结构体方式, LPC_GPIOx->FIODIR=0x00000000; 不能写成FIOxDIR0=0x00;
    core_cm3.c、core_cm3.h 分别是ARM M3 外围驱动源代码和头文件,在使用的过程中不需要修改什么,有兴趣的可以关注一下这些代码的注释就知道这些代码是用来干什么的了。        system_LPC17xx.h、system_LPC17xx.c 这两个文件是与编程有非常密切关系的文件。从名字上就可以知道是关于系统的文件,这两个文件为我们提供了一个系统初始化函数,SystemInit();默认使用外部晶振,外部晶振是12MHz,使用PLL0 倍频,LPC1700 的系统初始化包括时钟配置、电源管理、功耗管理等。其中比较复杂的是时钟配置,由于有2 个PLL,一个是主PLL0,可以为系统和USB 提供时钟,一个是PLL1 专门为USB 提供48M 时钟,可以不使用。由于LPC1700 的时钟灵活性较大,也使得配置时钟的过程稍微复杂一些。但是我们的系统文件都将这些做好了,我们要修改时钟频率或者其他参数只需要修改对应的宏定义即可。另外该文件还做了比较详尽的注释,只要潜心阅读没有太大难度的。在LPC17xx.h 里有core_cm3.h 和system_LPC17xx.h 的调用,因此我们不需要在主函数里再次调用。



    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    难过
    2023-9-6 15:15
  • 签到天数: 211 天

    [LV.7]常住居民III

    34

    主题

    805

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2030
    最后登录
    2024-3-21
     楼主| 发表于 2019-12-17 14:40:24 | 显示全部楼层
    本帖最后由 guoyuli 于 2019-12-17 16:24 编辑

    2 LPC17xx的基本使用介绍

    在LPC17xx 的编程过程中最基本的要注意的有两方面,一方面是系统配置,另一方面是外围基础配置。系统配置包括系统时钟,功耗管理,睡眠模式等等。外围的基础配置包括所使用模块的功耗管理(LPC17xx 出于降低总功耗的原因对每一个外设都有一个使能方式的功耗管理,默认复位后有一些外设是默认开启的有一些是默认关闭的,具体参见手册的第四章计时和功率控制的4.8.9外设功率控制寄存器PCONP)、时钟配置(外设时钟选择参见第4章计时和功率控制的4.7.4 节外设时钟选择寄存器PCLKSEL0 和PCLKSEL1 的对应位)、管脚配置(由于每一个管脚有多种功能因此有专门的寄存器参见第8 章引脚连接模块)等。
    关于系统初始化:
            在前面的介绍中我们知道LPC17xx 只要有3 个时钟源,分别是内部RC 振荡器、主晶振(1-24M)、RTC 晶振,主晶振、RTC、内部RC 都可以来驱动PLL0 从而给CPU 和片内外设提供时钟,当PLL0未连接时系统才可以安全的切换时钟源。时钟源的选择需要配置
    时钟选择寄存器:
    时钟源选择寄存器 (CLKSRCSEL,0x400FC10C)
    锁相环PLL0
            PLL0 接受输入的时钟范围是32KHz-50MHz。时钟源由CLKSRCSEL寄存器选择,输入频率可以倍频到一个较高的频率上,之后可以通过分频为CPU、外设以及可选的USB 子系统提供精确的时钟。值得注意的是USB 子系统又有自己专用的PLL。PLL0 可以产生最高至CPU 允许的最大100M 的频率。PLL0 的输入频率通过一个预分频器分频成为PLL 内部频率,预分频的值用变量N 表示,范围1-256 之间,然后通过一个电流控制振荡器(CCO)倍频到范围275-550M 之间,倍频器的值用M 表示,CCO 频率在通过CPU 频率设置寄存器分频成为提供给CPU 的CCLK 时钟。PPL 的使能是由PLL0CON 寄存器控制,PLL0 倍频器和分频器的值都是由PLL0CFG 寄存器控制。为了防止PLL0 参数发生意外改变或PLL0 失效,对这两个寄存器进行了保护。当PLL0 提供芯片时钟时,由于芯片的所有操作,包括看门狗定时器在内都依赖于它,因此PLL0 的设置的意外改变将导致CPU 执行不期望的操作。
    管脚输出配置:
            引脚连接模块使得微控制器的大部分引脚具有1 个以上的功能。配置寄存器控制多路开关以实现引脚与片内外设之间的连接。外设应优先连接到适当的引脚,再激活,需要的话使能相关中断。任何一个没有映射到相关功能引脚的使能外设,都将被认为是未定义的。当选择了引脚上的一个功能时,该引脚上其它可用功能无效。
            涉及的寄存器有:PINSEL0-PINSEL10;PINSEL 寄存器控制器件引脚的功能。这些寄存器的每一组位对应着特定的器件引脚功能。
    仅当引脚选择 GPIO 功能时,GPIO 寄存器中的方向控制位才有
    效。对于其它功能来说,方向是自动控制的。每个外围器件通常有不同的引脚配置,因此每个引脚可能有不同的功能组合。
    引脚模式选择寄存器
            PINMODE 寄存器控制所有端口的工作模式。这包括使用片内上拉/下拉电阻的特性和特定的开漏操作模式。除过用于IIC0 接口的IIC 引脚和USB 引脚。不管该引脚选择用作何种功能,都可以为每一个端口引脚选择片内上拉/下拉电阻。使用三个位来控制端口引脚的模式,其中二个位位于 PINMODE 寄存器中,另一个位于PINMODE_OD 寄存器中。在 PINSEL 寄存器中未使用的引脚看作为保留位。



    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 1334 天

    [LV.10]以坛为家III

    88

    主题

    4290

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9022
    最后登录
    2024-3-29
    发表于 2019-12-17 16:43:04 | 显示全部楼层
    这些是内核指令的介绍了。
    不过,自从有了库函数,这些很少学习了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2023-9-6 15:15
  • 签到天数: 211 天

    [LV.7]常住居民III

    34

    主题

    805

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2030
    最后登录
    2024-3-21
     楼主| 发表于 2019-12-17 20:50:31 | 显示全部楼层
    jobszheng5 发表于 2019-12-17 16:43
    这些是内核指令的介绍了。
    不过,自从有了库函数,这些很少学习了

    学习基础我感觉从基础学起会好点,库的话更加方便入门
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 14:38 , Processed in 0.125724 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表