4235|8

19

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

TI - MCU - MSP430使用指南2 -> CPU/CPUX [复制链接]

本帖最后由 骑IC看MCU 于 2019-12-23 13:49 编辑

此内容由EEWORLD论坛网友骑IC看MCU原创,如需转载或用于商业用途需征得作者同意并注明出处

 

首先,先说明一下CPU位数代表的是什么意思,从市面上看8位,16位,32位甚至64位的MCU内核都已出现,位数指的是什么呢:

严谨说法:指CPU一次能处理的数据宽度,也就是参与运算的寄存器的数据长度。

MSP430 16位的MCU

我们平时对MCUC语言编程,都会经过编译器编译成机器码,也就是二进制,最后通过CPU内部寄存器(一般有20-100个)来实现运算数据,因此我们写的所有程序,实现的所有功能,最终都要由CPU内部寄存器的读写来完成。

CPU寄存器一般分为专用寄存器和通用寄存器,对于MSP430来说,总共有16个寄存器:R0 - R15, 其中四个(R0 – R3)为专用寄存器,其余的为通用寄存器,下面详细讲解一下CPU的内部结构和寄存器的功能。

1. CPUCPUX

多看MSP430User Guide你会发现,对于CPU介绍的章节,有些是CPU,有些则是CPUX,那么这两个有什么区别呢? 为什么要出现CPUX呢:

我们来计算一下:

首先,16位的寄存器,也就是说我们由于需要寻址去执行相应的程序,即我们最多只有16跟地址总线,那么寻址范围呢:216=64K,每个地址可以存储1B的数据,因此CPU的最大寻址空间为64KB,这也就是CPU内核的MCU内部最大的FlashFRAM空间了,但是如果用户程序很复杂呢,算法量很多呢,或者需要在内部FlashFRAM中存储大量数据呢,必定会造成一个问题,内存不够,这就很尴尬,基于此,TI才开发了CPU的升级版CPUX内核,地址总线为20为,那么最大可以支持1MB的存储,这就可以解决这个问题了。 什么?1MB还不够?程序占有量没那么大的,1MB的内存基本满足90%以上的要求了,这是MCU,MCU,不是高端CPU

2.CPU/CPUX的结构图:

 

上侧是CPU的内部结构,下侧为CPUX的结构图,从图上看,唯一的区别就是寄存器位数和地址总线了,因此,这两个CPU内核是一致的,仅仅区别在地址总线上而已。

PS: 不论是ARM内核,还是AVR内核,MSP430内核等,基本原理都大同小异,包含的CPU寄存器也很相似,不需要一致迷恋ARM内核好等,理性来说,适合自己项目的最好,ARM内核性能高,但内部也比较复杂,MSP430内核则比较简单,操作起来更便利,因此在很多场合下,MSP430内核更好理解和上手。

好啦,内核结构基本就这样,什么?What’s the fuck? 看不懂? 没事呀,作为硬件工程师甚至是嵌入式软件工程师,不需要理解,就知道它就这样子,内部就是一堆寄存器和运算器就OK了,我们也很少会接触到它。

 

3.CPU/CPUX内部寄存器:

首先介绍一下MSP430 CPU/CPUX的主要特征:

  • 丰富的寄存器资源
  • 单周期操作寄存器
  • 16位数据总线 16/20位地址总线
  • 常数发生器
  • 直接存储器到存储器的访问
  • 位,字节和字的操作方式。

寄存器列表:
 

寄存器

描述

R0

程序计数器PC,指示下一条程序将要执行的指令地址。

R1

堆栈指针SP,指向堆栈栈顶

R2

状态寄存器SR/常数发生器CG1

R3

常数发生器CG2

R4

通用寄存器

…………………

R15

通用寄存器

 

下面以CPU16位地址线)为例讲解一下每个寄存器的作用:

R0寄存器:PC 程序计数器

CPU中最核心的寄存器,指示下一条即将执行指令的地址。 PC寄存器的内容总是偶数,指向偶字节地址。程序计数器PC可以像其他寄存器一样用所有指令和所有寻址方式访问,但对程序存储器的访问必须以字为单位,否则会清除高位字节。PC的宽度决定了可以直接寻址的范围。16bits -> 64KB, 20bits -> 1MB

汇编Code示例:

MOV #LABLE, PC              ;跳转到地址LABLE开始执行

MOV LABLE, PC                ;程序开始执行的地址为LABLE所在内存中的数

MOV @R14, PC                程序开始执行的地址为寄存器R14中的数

 

R1寄存器:SP 堆栈指针

堆栈指针的所用主要是保护当前程序执行的地址,当正在执行一段程序,突然进来了一个中断,因此需要把当前执行程序的地址保护起来,将中断服务程序的矢量地址写入PC寄存器,开始执行中断服务程序,当中断服务程序执行完后,再将堆栈中的数据赋给PC寄存器,返回到原本程序位置接着执行。同时堆栈再函数调用期间也可以保存寄存器变量,局部变量参数等。

堆栈指针SP总是指向堆栈的顶部,系统在将数据压入堆栈时,总是先将堆栈指针SP的值减2,然后再将数据送到SP所指的RAM单元中。将数据从堆栈中弹出正好与压入过程相反;先将数据从SP所指示的内存单元取出,再将SP值加2

汇编Code示例:

MOV 2(SP), R6                ;将内存单元I2中的数据放到R6中。

MOV R7, 0(SP)                ;将R7中的数据放到堆栈顶所在的单元(I3)中。

PUSH #0123h                  ;将SP的值减2,再将#0123h放到SP所指向的单元中。

POP R8                             ;将SP所指单元中的数(#0123h)放到R8中,再将SP的值加2

实现功能的图如下:

R2寄存器:SR 状态寄存器

状态寄存器指示CPU目前工作遇到的一些零标志,负标志等,同时可以控制CPU的中断功能,具体功能见下表:

0

C

进位标志。当运算结果产生进位时C置位,否则C复位。

1

Z

零标志。当运算结果为零时Z置位,否则Z复位。

2

N

负标志。当运算结果为负时N置位,否则N复位。

3

GIE

中断控制位。控制可屏蔽中断,当GIE置位CPU可响应可屏蔽中断,否则不可响应可屏蔽中断。

4

CPUOFF

置位CPUOFF位可使CPU进入关闭模式,可用所有允许的中断将CPU唤醒。

5

OSCOFF

置位OSCOFF位可使晶体振荡器处于停滞状态,同时CPUOFF也需要置位。可用外部中断或者NMI唤醒。

6

SCG0

SCG0置位关闭SMCLK,与SCG1一起控制系统时钟发生器的四种状态。

7

SCG1

SCG1置位关闭DCO发生器,与SCG0一起控制系统时钟发生器的4中状态。

8

V

溢出标志。当运算结果超出有符号数范围时置位。溢出情况如下:

正数 + 正数 = 负数

负数 + 负数 = 正数

正数 - 负数 = 负数

负数 - 正数 = 正数

9~15

 

保留未用

 

R3寄存器:常数发生器

常熟发生器用于产生一些常用的常数,而不必占用一个16 bits的字。所用常数的数值由寻址位As来定义,硬件完全自动地产生数字:-101248   具体如下:

寄存器

As

常数

说明

R2

00

-

寄存器模式

R2

01

(0)

绝对寻址模式

R2

10

00004H

+4位处理

R2

11

00008H

+8位处理

R3

00

00000H

0字处理

R3

01

00001H

+1

R3

10

00002H

+2位处理

R3

11

0FFFFH

-1字处理

 

R4~R15寄存器:通用寄存器,可用于自由的读写操作。

汇编Code示例:

MOV #1234H, R15         ;执行后R15内容为1234H

MOV.B #23H, R15          ;执行后R15内容为0023H

ADD.B #34H, R15           ;执行后R15内容为0057H

 

4.CPU/CPUX存储结构:

特点:MSP430 MCU采用“冯-诺依曼”结构,物理上完全分离的存储区域,如ROM,FLASH,FRAM,RAM外围模块,特殊功能寄存器SFR等,被安排在同一地址空间,这样就可以使用一组地址、数据总线、相同的指令访问。

 

  • 中断向量被安排再相同的空间:0FFE0~0FFFFH;
  • 8位,16位外围模块占用相同范围的存储器地址;
  • 所有器件的特殊功能寄存器占用相同范围的存储器地址:00H~0FH
  • 数据存储器开始于相同的地址,即从0200H处开始;
  • 代码存储器的最高地址都是0FFFFH.

 

5.编程时内联函数:

再使用CCSIAR编程过程中,你可能会发现,有一些函数类似于库里面的,找不到定义,这些函数是内联函数,具有一些特殊功能,在使用过程中可以减少自己的开发时间。

MSP430总共有42个内联函数,这里列出几种常用的,并描述其功能:

  • __no_operation();

仅仅是空操作而已,类似于NOP(); 调试使用,可以定位到程序运行的位置。

  • __delay_cycles(10);

延时函数,参数指的是MCLK时钟周期,比如:MCLK  1MHz,那么参数写1000,则大约延时1ms

  • __bis_SR_register();

针对寄存器中单独的某一位进行置位,常用的如:

__bis_SR_register(SCG0);                 // disable FLL

__bis_SR_register(LPM3_bits|GIE);         // Enter LPM3, interrupts enabled

 

  • __bic_SR_register();

针对寄存器中单独的某一位进行复位,常用的如:

__bic_SR_register(SCG0);                 // enable FLL

  • __bic_SR_register_on_exit();

针对寄存器中单独的某一位进行复位同时退出到main中,常用的如:

__bic_SR_register_on_exit(LPM0_bits + GIE);  // Exit LPM0 on return to main

针其他内联函数平时很少使用,有些也不太需要很深入的了解函数的含义,具体内容,可以参见MSP430 Optimizing C C++ Compiler.pdf文件。

连接如下:http://www.ti.com/lit/ug/slau132u/slau132u.pdf?keyMatch=MSP430%20OPTIMIZING%20C%20C%20COMPILER&tisearch=Search-EN-everything

 

最新回复

手册啊,太基础了,好东西。   详情 回复 发表于 2021-2-28 21:11
 
点赞(1) 关注

回复
举报

6040

帖子

205

TA的资源

版主

沙发
 

您的这些系列写的非常赞,内容全面,解释很详细,可以作为用户手册的重要补充了!

 
 

回复

6040

帖子

205

TA的资源

版主

板凳
 

期待全系列的,哈哈!

 
 
 

回复

9717

帖子

24

TA的资源

版主

4
 

__delay_cycles我用的最多 剩下就是在低功耗模式下切换的操作

 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

7452

帖子

18

TA的资源

五彩晶圆(高级)

5
 

430架构也有些老了,得跟上时代,要不cortex太强势。

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

6
 
lcofjp 发表于 2019-12-23 18:02 期待全系列的,哈哈!

正在慢慢写,会介绍整个MSP430系列的资源 下一次分享Timer 欢迎一起讨论

 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

7
 
freebsder 发表于 2019-12-24 10:04 430架构也有些老了,得跟上时代,要不cortex太强势。

确实内核比较老了 不过也比cortex-m系列简单点,上手也比较快。而且工业场合,在能满足要求的基础上还是有一定的市场份额的。

 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

8
 

EDA在哪里?我怎么找不到

 
 
 

回复

2618

帖子

0

TA的资源

纯净的硅(高级)

9
 

手册啊,太基础了,好东西。

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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