MSP430系列是TI的低功耗系列,是用于入门TI单片机的最好选择,相当于TI单片机中的51单片机,使用简单,外设不丰富(但基本该有的都有)
1. MSP430简介
简介
MSP430是TI的超低功耗单片机,开发过程和51单片机差不多,但有比51单片机更多的资源以及更高的频率。
开发环境
MSP430使用TI的CCS作为开发环境,由于单片机的结构特殊,不能使用keil开发。ccs的开发环境比较好搭建,只需要注意全程英文环境就行。这里简单介绍一下获取例程的代码:
- 进入例程的网站
- 找到对应的例程下载
- 导入工程
2. io口控制
io控制寄存器
msp430的io控制寄存器特别多,不像51那样少,430的io控制寄存器在手册上有详细的说明,如下图所示:
有了详细的说明就可以对相应的寄存器进行控制了。
主要寄存器
- PxIN为只读寄存器,在输入模式下可以读取按键上的电平。
- PxOUT为输出控制寄存器,在输出模式下可以输出高电平或低电平。
- PxDIR为输入输出选择寄存器,可以选择io口为输入或者输出(Bit=0为输入)。
- PxREN上拉下拉是能寄存器,选择是否是能上下拉,是能条件下,PxOUT控制上下拉。
- 中断相关寄存器
- PxIFG中断标志位,当某些事件发生时置1,开启中断的情况下进入中断,必须由软件清0。注意:当写入PxOUT和PxDIR时会对将相应的寄存器置0或1
- PxIES确定什么边沿触发中断。0为上升沿,1为下降沿。
- PxIE选择是否使能中断
- PxSELx为功能选择寄存器,相当于复用。复用功能的选择在数据表(datasheet)中的Port Schematics中查看。
msp430作为输出配置步骤
- 配置PxDIR作为出
- PxOUT为输出多少
msp430作为输入配置步骤
- 配置PxDIR为输入模式
- 配置PxREN使能上下拉(可以不使能这个,实际情况决定)
- 配置PxOUT确定是上拉还是下拉
- 读取PxIN获得输入的电平
3. 时钟控制
时钟系统简介
MSP430有很多系列,不同的款式有不同的时钟系统,这里从msp430g2553为例,对时钟配置过程做大概的记录。
MSP430g2553的时钟树如下图所示
一般时钟树的看法就是从左到由,左边是输入,右边是输出。可以大概看出来左边有3个部分,右边有3个输出。上面的黑色小方框是相应的控制寄存器。就可以大概得出MSP430g2553的时钟构成和相应的配置过程。
时钟树的详细配置
时钟配置的寄存器
- DCOCTL 这是DCO时钟的控制寄存器,具体配置手册上有,用于确定DCO的频率和模式
- BCSCTL1
- BCSCTL2
- BCSCTL3
- IE1
- IFG1
具体配置查看手册
时钟配置过程
MSP430的高速时钟只能从内部获取,但是内部的时钟并不是很精确,所以有很多校准值可以直接使用。所以实际配置过程中使用系统给的宏定义就行。
配置举例
- MCLK 和 SMCLK 均为 1MHz, ACLK 设为 32.768kHz
BCSCTL1 = CALBC1_1MHZ; // 要取得精确的1MHz,一定要调取校正参数 DCOCTL = CALDCO_1MHZ; // ACLK保持默认即可
- MCLK 和 SMCLK 均为 16MHz, ACLK 设为 VLO
BCSCTL1 = CALBC1_16MHZ; // 调取16MHz校正参数 DCOCTL = CALDCO_16MHZ; BCSCTL3 |= LFXT1S_2; // 设为VLO
- MCLK 为 4MHz, SMCLK 为 2MHz
BCSCTL1 = CALBC1_8MHZ; // 先将DCO设为8MHz DCOCTL = CALDCO_8MHZ; BCSCTL2 |= DIVM_1 + DIVS_2; // 再对MCLK 2分频, SMCLK 4分频
- MCLK 设为 32.768kHz 外部晶振
BCSCTL3 |= LFXT1S_0 + XCAP_3; // clock system setup while(IFG1 & OFIFG) // wait for OSCFault to clear { IFG1 &= ~OFIFG; _delay_cycles(100000); } _bis_SR_register(SCG1 + SCG0); // clock system setup BCSCTL2 |= SELM_3;
4. 中断控制
中断简介
中断就是系统的某个事件发生,若为该事件配置有中断,则系统会进入中断函数。所以要搞懂一块单片机的中断至少要懂得他的中断向量表,如下图。
有了这个表就知道有哪些中断,哪些中断时公用一个中断向量。
中断的使用
中断系统配置
msp430的中断系统比较简单,配置的话只需要对应好中断向量,以及打开某个标志位的中断,并在中断服务函数里面写上中断函数即可。
中断配置步骤
- 配置中断事件并打开中断(即配置中断向量)
- 是能中断
- 创建中断服务函数
按键举例
- 初始化按键、使能中断、清空中断标志位。
- 使用
_BIS_SR(GIE)
指令使能全局中断。 - 编写中断服务函数
- 中断服务函数写法:
#pragma vector=PORT1_VECTOR // 编译指令,告诉编译器将函数与中断向量链接起来,vector后面是中断向量地址的宏定义。 __interrupt void Port_1(void)//__interrupt表示这是一个中断服务函数,后面的Port_1可以自己命名 { ...... }
5. 定时器
定时器简介
所有单片机中定时器都是非常重要的,定时器可以实现精准计时等操作。MSP430的定时器可以在手册上看到,由标题就可以轻易的知道,MSP430g2553的定时器分为TIM_A和TIM_B两个。定时器可以实现捕获、比较输出(PWM)等功能。
如何了解一个定时器
了解一个定时器,要从以下几个方面了解
- 计数器的位数(他的计数值保存在这里)
- 时钟来源
- 通道情况(可以作为比较、捕获等)
- 中断配置情况(如哪些状态位可以激活中断)
- 工作模式(连续、向上、向下等)
定时器的使用
定时器的不同工作模式
- 连续模式 连续模式下,定时器计数到溢出自动返回到0重新开始计数(有的单片机有自动重装载值,可能不一定返回到0)。
- 向上计数 向上跟连续模式不同的地方在于向上的溢出值可以自己设定,相当于可以自己设定多久过后溢出(这里其实是超过比较值、不应该叫做溢出。更方便)。
- 向上/向下 定时器达到设定的值后向下到0,这样才算一个周期,相当于周期乘以了2。
定时器中断
定时器的中断来源不同定时器不一样,msp430g2553的中断来源有CCR(捕获/比较)中断和TA0IFG(溢出)中断
- CCR0中断 计数器的值达到CCR0时产生的中断
- 溢出中断 溢出中断一般是指TAR(计数器)为0相应的标记为置位,产生溢出中断。
定时器寄存器
这里的寄存器是以MSP430g2553的为例
- TACTL 主要的控制寄存器,控制TIM_A的时钟来源、输入分频、模式、中断控制等等
- TACCRX 比较值
- TACCTLx 比较捕获配置
- TAIV 存放了一些中断的标志位
配置举例
配置流程
- 选择时钟来源和分频值
- 确定定时器工作模式
- 跟据模式选择哪个中断
- 编写对应的中断服务函数
捕获
- 一般设置计数器为连续模式,定义全局变量count来确定是否捕获中途发生溢出(需开启中断)。
- 配置捕获模式,设置TACCTLx寄存器的CAP为1。
- 选择哪个引脚作为捕获输入口,配置CCRx模块的捕获源寄存器CCISx。
- 选择什么边沿捕获,设定CMx寄存器。
- 确定同步捕获还是异步捕获,SCS寄存器(一般为同步,更精准)。
- CCR检测到带捕获功能IO口的电平边沿,瞬间读取TAR寄存器的值并写入TACCRx寄存器中等待读取。
比较
MSP430的PWM输出比较特殊。在该模式下,CCR0确定周期,CCRx确定占空比和输出引脚为TAx,步骤如下。
- 设定PWM的输出端口,跟据MSP430g2553的定义,.0端口不能用于输出。并设置IO口的功能为 TIMx_Ax ,如图所示。
- 设定 CCR0 和 CCRx 的值。
- 选择比较/捕获模块的输出模式(一般选用输出模式7来生成PWM波)。
- 选择定时器的时钟源和计数器源。
- MSP430自动生成PWM波,CPU可进入低功耗模式。
- 低功耗模式进入方法:
__BIS_SR(CPUOFF)
,__BIS_SR直接控制系统状态寄存器。
- 低功耗模式进入方法:
串行通信
串行通信简介
常见的串行通信
串行通信常见的位IIC,SPI,UART等,MSP430在硬件上都支持,只需要配置寄存器就可以使用。
串行通信的介绍和相关信息
这个参考我的另一篇博客(各种通信协议笔记)
MSP430串行通信的使用
寄存器
- UCAxCTLx 配置寄存器 (一般选择默认的即可,即不用配置)
- UCAxRXIE 接收中断配置寄存器
- UCAxTXIE 发送中断配置寄存器
- TXBUF发送缓冲器
- RXBUF接受缓冲器
- UCAxBRx、UCAxMCTL 控制波特率的寄存器
配置流程
- 配置UCAxCTLx寄存器,一般不用配置,因为默认配置就是常用的8位,无奇偶校验等
- 时钟选择,USCI的时钟为BRCLK,它可以选择3个时钟来源。
- 波特率设置,通过配置配置UCAxBRx、UCAxMCTL寄存器达到配置的效果,得到固定波特率。下图附上16M主频下的常用波特率配置。