msp430的存储器结构的操作说明及使用说明书

诺依曼结构——程序存储器和数据存储器统一编码;哈佛结构——程序存储器和数据存储器;msp430系列单片机属于前者,而常用的mcs51系列属于后者。C语言编程起步因为常用的430编程开发是c语言,所以下面讲解C语言对430编程的整体结构。

1、首先要了解msp430的内存结构。 典型的微处理器结构有两种: 冯. 诺伊曼结构——程序存储器和数据存储器的统一编码; 哈佛结构——程序存储器和数据存储器; msp430系列单片机属于前者,而常用的mcs51系列则属于后者。

0-0xf特殊功能寄存器; 0x10-0x1ff 外设模块寄存器; 0x200-? 地址根据不同型号从低位向高位扩展; 0x1000-0x107f seg_b0x1080_0x10ff seg_a 用于flash信息存储。 其余部分从0xffff开始,根据不同容量向下扩展。 例如149是60KB,0xffff-0x1100

2、复位信号是MCU工作的起点。 430有两个复位信号:上电复位信号POR和上电清零信号PUC。 POR 信号仅在上电时和 RST/NMI 复位引脚上设置复位功能,为低电平时复位系统。 PUC信号由POR信号产生,并产生其他信号如看门狗定时器溢出和安全密钥值错误。 然而,无论该信号触发何种复位,msp430都会读取地址0xffff处的复位中断向量,然后程序将从中断向量指向的地址开始执行。 复位后的状态不被写入。 详细请看参考书,呵呵。

3、系统时钟是程序运行的指挥者,定时和中断也是整个程序的核心和中轴。 430有多达三个振荡器,DCO内部振荡器; LFXT1外接低频振荡器,常见32768HZ,无需外接负载电容; 也可接高频450KHZ-8M,需要负载电容; XT2接高频450KHZ-8M,外加电容。 (我根据经验发现,连接XT2时,需要注意自己开启XT2,延时50us等待XT2开始振荡,然后手动清零IFG1中的OFIG位。操作顺序为:开启XT2-》等待XT2稳定-》切换XT2的系统时钟)

430有3个时钟信号:MCLK系统主时钟,可1 2 4 8分频,供CPU使用。 如果选择也可以使用其他外围模块; SMCLK 系统子时钟供外围模块使用,可以选择振荡。 处理器产生的时钟信号; ACLK 辅助时钟只能由 LFXT1 为外围模块产生。

4. 中断是430处理器的一大特点,因为几乎每个外围模块都可以产生中断。 430可以在没有任务时进入低功耗状态,有事件时中断唤醒CPU,处理完毕后再次进入低功耗状态。

整个中断响应流程是这样的。 当有中断请求时,如果CPU处于活动状态,会先完成当前命令; 如果是低功耗,则先退出,并将下一条指令的pc值压入栈; 如果有多个中断请求,优先级较高的将首先响应; 执行完毕后,等待中断请求标志位被复位。 注意,单个中断源的中断请求标志位自动复位,而多个中断的标志位需要软件复位; 然后系统总中断允许位SR.GIE 被复位,相应的中断向量值被加载到pc 中,程序从该地址继续执行。

这里需要注意的是中断使能位SR.GIE和中断嵌套问题。 如果在执行中断程序时要响应更高级别的中断请求,则必须在进入第一个中断时设置SR.GIE。

事实上,其他外设模块时钟是沿着时钟和中断核心执行的。 具体结构我不知道。 您可以参考430系列手册。

C 编程入门

由于常用的430编程开发是C语言,下面对C语言430编程的整体结构进行说明。 基本上属于框架结构,即整体模块化编程。 其实这也是硬件编程的基本规则(不是我规定的规则)。

首先是程序的头文件,包括#include“MSP430x14x.h”。 这是14系列,因为149常用; 其他型号可以自行修改。 您还可以包含数据库头文件,例如#include“data.h”或函数变量声明头文件,这些都是由您定义的。

接下来是函数和变量的声明void Init_Sys(void),也就是系统初始化。 系统初始化是一个整体概念。 广义上讲,它包括所有外围模块的初始化。 可以将外围模块初始化的子函数写入Init_Sys()中,也可以单独编写各个模块的初始化。 但由于结构简单,最好在写完系统时钟初始化后在这里初始化其他模块(包括一些中断初始化)。

无效 Init_Sys()

无符号整型 i;

BCSCTL1&=~XT2OFF; //打开XT2振荡器

IFG1 &= ~OFIFG; // 清除振荡器故障标志

for (i = 0xFF; i 》 0; i–); // 延时,等待XT2开始振荡

while ((IFG1 & OFIFG) != 0); //判断XT2是否振荡

BCSCTL2=SELM_2+SELS; //选择MCLK和SMCLK为XT2

//下面初始化各个模块、中断、外围设备等

。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。

_EINT(); //开启全局中断控制

这就涉及到时钟问题。 通常我们选择XT2作为8M晶振,即系统主时钟MCLK为8M,CPU根据这个时钟执行命令; 但其他外设模块可以在相应的控制寄存器中选择其他时钟ACLK; 当你对速度要求很低、定时间隔很大时,可以选择ACLK,比如在定时器Timea的初始化中设置。

主要程序:

无效主(无效)

WDTCTL = WDTPW + WDTHOLD;//关闭看门狗

初始化系统(); //初始化

//自己任务中的其他函数

。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。

同时(1);

说完了主程序,我想谈谈中断函数。 中断是你的单片机任务中不可缺少的一部分,也可以说是灵魂(是不是很夸张?)。

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

每个中断函数可以按照优先级顺序编写。

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

举一个定时中断的例子:

//初始化

无效 Init_Timer_A(无效)

TACTL = TASSEL0 + TACLR; // ACLK,清除TAR

CCTL0=CCIE; // CCR0 中断使能

CCR0=32768; //定时1s

TACTL|=MC0; //向上计数模式

//中断服务

#pragma向量=“TIMERA0”_VECTOR

__interrupt void TimerA0()

// 你请求中断执行的任务

当然,还有其他时序和多个中断,每个系列芯片的中断向量数量也不同。

学习并理解了以上知识后,建议阅读微控论坛上的msp430常用模块的应用原理。

单片机

单片机最小系统及其扩展设计(2016年10月21日)

2024-5-11 22:03:54

单片机

51单片机的最小系统原理图电源电路复位电路电源

2024-5-11 23:03:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索