MSP430F6638单片机复习笔记

2019-10-10来源: eefocus关键字:MSP430F6638  单片机  复习笔记

果SMCLK或ACLK作为WDT_A时钟源发生故障,WDT将自己的时钟自动调整为VLOCLK(注意这里是VLOCLK,而不是REFOCLK )

WDT_A提供故障安全时钟功能,确保在看门狗模式下不能禁止WDT_A的时钟。 这意味着LPM可能会受到WDT_A时钟选择的影响。


当WDT_A模块用于间隔定时器模式时,WDT A中没有用于时钟源的故障安全功能。


5.4 低功耗模式下的操作

用程序的要求和使用的时钟类型决定了WDT_A的配置方式。 例如,如果用户想要使用LPM3,则WDT_A不应配置为看门狗模式,其时钟源最初来自DCO,XT1为高频模式,XT2为SMCLK或ACLK。 在这种情况下,SMCLK或ACLK将保持启用状态,从而增加LPM3的当前消耗。


5.5 关闭看门狗的方法

//1. 正确的方法

WDTCTL = (WDTPW + WDTHOLD);

WDTCTL = WDTPW | WDTHOLD;


//2. 错误的方法

WDTCTL |= (WDTPW + WDTHOLD);//错误


第6章 定时器Timer_A


6.1 各种寄存器(x代表数字,比如我们用的TA1,那么x=1)

6.1.1 TAxR——16位计数器


16位定时器/计数器寄存器TAxR随时钟信号的每个上升沿递增或递减(取决于工作模式)。 可以使用软件读取或写入TAxR。 另外,定时器在溢出时可以产生中断。

可以通过将TAxCTL寄存器中的TACLR位置1来清零TAxR。 将该位置1会复位TAxR,定时器时钟分频器逻辑和计数方向。 TACLR位自动复位,始终读为0。


6.1.2 TAxCTL——时钟控制

TASSEL——选择时钟

MC——设置计数模式

MC Mode 中文 Description

image.png

TACLR——清空TAxR

TAIE——中断使能


6.1.3 TAxCCTLn——Timer_Ax捕捉/比较控制寄存器n

捕获比较模块一共7个,n=(0~6)


CAP——设置捕获模式/比较模式

OUTMOD——设置输出方式(共8种)

第一种是电平输出,可以指定输入的电平(OUT位)

模式 2, 3, 6, and 7 对于 TAxCCR0 是没有用的因为 EQUx = EQU0.

CCIE——中断使能

【注意】:这个是捕获比较的中断使能,和上面的Timer_A的中断不同。

6.1.4 TAxCCRn——捕捉/比较寄存器n

放数的


6.1.5 TAxIV——中断寄存器

用于查询是哪个中断到来

其中包含的中断事件不包括TAxCCR0中断


6.2 中断

6.2.1TAxCCR0中断

TAxCCR0 CCIFG具有最高的Timer_A中断优先级,并具有专用中断向量(TIMER0_A0_VECTOR)。 当TAxCCR0中断请求被服务时,TAxCCR0 CCIFG自动复位。

这是一个单源中断


6.2.2 TAxIV中断

TAxCCRy CCIFG和TAIFG被优先化并组合以获得单个中断向量。(这表明其优先级可以被软件设置,这和所谓中断优先级是两个概念) 这话大错特错!!优先级不能设置,写错了!


TAxIV用于确定请求中断的标志。

禁用Timer_A中断不会影响TAxIV值。

TAxIV寄存器的任何访问,读取或写入都会自动重置最高的待处理中断标志。 如果设置了另一个中断标志,则在服务初始中断后立即产生另一个中断。(如果你们做过实验会发现后边的串口通信也有这个性质)

这是一个多源中断,但是不用手动清中断标志位


6.3 程序

6.3.1 TA0CCR0 中断

下面程序采用增计数模式,那么增加到TA0CCR0 就会产生TA0CCR0 中断,然后计数器自动清零,重新计数


【注意】:这是一个单源中断


#include

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

P4DIR |= BIT1; // P4.1 output

TA0CCTL0 = CCIE; // 开启TA0CCR0 的中断

TA0CCR0 = 50000;

TA0CTL = TASSEL__SMCLK + MC__UP + TACLR; // 时钟源选SMCLK,增计数模式,清零计数器

_BIS_SR(LPM0_bits + GIE); // Enter LPM0, enable interrupts

_NOP(); // For debugger

}

// Timer_A0 ISR

#pragma vector=TIMER0_A0_VECTOR

__interrupt void TIMER0_A0_ISR(void) // 注意这个中断向量

{

P4OUT

}


6.3.2 TAxIV中断

下面程序,由于是连续计数模式,计数器会从0到FFFF重复计数,但是又未设置TA0CCRn的值,所以只在0FFFFh的时候才产生TAIFG这个中断,这个中断的查询在TAxIV=14的位置


【注意】:这是多源中断

#include

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

P4DIR |= BIT1; // P4.1 output

TA0CTL = TASSEL__ACLK + MC__CONTINUOUS + TACLR + TAIE; // 时钟源为ACLK,连续计数模式,清空计数器,是能中断

__bis_SR_register(LPM3_bits + GIE); 

//【区分】:__bic_SR_register()这个函数是和上面的作用相反,

    //比如__bic_SR_register(LPM0_bits + GIE);是关闭低功耗并且关闭总中断

_NOP(); 

}


#pragma vector=TIMER0_A1_VECTOR // 这个中断向量和上面的程序不一样

__interrupt void TIMER0_A1_ISR(void)

{

switch(__even_in_range(TA0IV,14))// __even_in_range()本征函数,用于多源中断的查询。

{

case 0: break; // No interrupt

case 2: break; // CCR1 not used

case 4: break; // CCR2 not used

case 6: break; // reserved

case 8: break; // reserved

case 10: break; // reserved

case 12: break; // reserved

case 14: P4OUT ^= BIT1; // TAIFG

break;

default: break;

}

}


第7章 模数转换器ADC12_A


7.1 概述

7.1.1 ADC12

这是一个12位的模拟量转换为数字量的内部外设

主要的过程为:

将模拟量通过某个单片机的引脚输入进去

ADC读取该引脚的电压值,并根据参考电压的大小,将其转化为12位的数字量的值

将这个12位的数字值保存到一个12位寄存器中

在ADC12的中断服务函数中读取这个寄存器的值,从而进行相应的操作


7.1.2 分辨率

用数字量的二进制位数来表示。如12位ADC的分辨率就是12位

用1个LSB使输出变化的程度表示,如12位ADC的分辨率为满刻度的1/212


7.1.3 量化间隔

满量程输入电压/(2n-1)

其中n为ADC的位数,这里为12

满量程输入电压一般为正参考电压,即VR+


7.1.4 量化误差

是ADC的有限位数对模拟量进行量化而引起的误差,有两种计算方法:


绝对误差=量化间隔/2

相对误差=1/(2n+1)

这里的n还是12

7.1.5 关于参考电压的选取(REFMSTR的设置)

在REFCTL这个寄存器中有一个神奇的位叫做REFMSTR,可以通过它来设定由谁控制ADC12的参考电压。


当REFMSTR=1时,ADC12允许通过REFCTL寄存器控制参考系统,ADC寄存器组(ADC12REFON,ADC12REF2_5,ADC12TCOFF和ADC12REFOUT)内的原先的控制位就失去了作用,但是 ADC12SR和ADC12REFBURST仍由ADC12_A控制,因为它们非常特定于ADC12_A模块。

当REFMSTR=0时,ADC12的参考电压由它自己的寄存器组设置,就是上边提到的那些寄存器


7.1.6 转换的计算公式

image.png


其中4095的由来是212−1=4095 2^{12}-1=40952 

12

 −1=4095

当输入电压大于正参考电压时,寄存器的值为0x0fff,当输入电压小于负参考电压时,寄存器的值为0x0000


7.2 ADC12的采样

7.2.1 SHI

一次AD转换由采样输入信号SHI的上升沿触发

SHI的来源:

ADC12SHSx

7.2.2 SAMPCON

采样控制信号SAMPCON控制采样周期和转换开始,当SAMPCON 为高时采样激活, SAMPCON 的下降沿触发模数转换。

ADC12SHP 定义了2种采样时序(方法):

扩展采样模式

ADC12扩展采样模式

SAMPCON的长度由SHI的时间控制。即,采样输入信号SHI直接作为采样控制信号SAMPCON,决定采样的起始时刻、采样周期和转换时刻

ADC12脉冲采样模式

脉冲采样模式

脉冲采样模式下,采样输入信号SHI仅用于触发采样,采样周期由采样定时器(ADC12SHT0x和ADC12SHT1x设置)确定


7.3 各种寄存器

7.3.1 ADC12CTL0

ADC12SHT1x & ADC12SHT0x

用于设定采样的周期,其中

ADC12SHT1x配置ADC12MEM8 ~ADC12MEM15寄存器的采样周期

ADC12SHT0x配置ADC12MEM0 ~ADC12MEM7寄存器的采样周期

ADC12REF2_5V

内部参考电压的设置

ADC12REFON

内部参考电压开启/关闭

ADC12ON

ADC12的开启/关闭

ADC12ENC

ADC12_A的转换使能,这个位在配置寄存器之前应该置0,配置结束后置1

ADC12SC

ADC12的转换开始,这个位在转换结束后会自动复位,所以在应用程序中转换结束后应该将这一位软件置1


7.3.2 ADC12CTL1

ADC12CSTARTADDx

转换地址选择,即ADC12MEMx的选择

ADC12SHSx

SHI信号选择

ADC12SHP

采样模式选择(扩展采样和脉冲采样)

ADC12SSELx

ADC12CLK的选择

ADC12CONSEQx

模式选择,一般选择单通道单次转换,即00


7.3.3 ADC12MEMx

转换出来的值存放在这里,一般在终端服务函数中查看这个寄存器。当转换结果写入选定的ADC12MEMx, ADC12IFGx中对应标志位置位;当这个寄存器的值被读取之后,IFG自动复位。


强调一下:转换结果写入ADC12MEMx时对应的ADC12IFGx置位,若对应的ADC12IEx 和GIE 置位,将会产生中断请求。


7.3.4 ADC12MCTLx

这里的x是由ADC12CTL1寄存器中的ADC12CSTARTADDx位确定的


ADC12SREFx参考电压选择

ADC12INCHx模拟量输入通道选择


7.3.5 ADC12IE

中断使能寄存器,使能哪一位也是由ADC12CTL1寄存器中的ADC12CSTARTADDx位确定的


7.3.6 ADC12IV

这个寄存器可以查看是哪个中断标志位置位,具体的代码是:


switch(__even_in_range(ADC12IV,34))// 注意这个内置函数,用于查看是哪个中断到来

{

case 0: break; // Vector 0: No interrupt

case 2: break; // Vector 2: ADC overflow

case 4: break; // Vector 4: ADC timing overflow

case 6: break;// Vector 6: ADC12IFG0

case 8: break; // Vector 8: ADC12IFG1

case 10: break; // Vector 10: ADC12IFG2

case 12: break; // Vector 12: ADC12IFG3

case 14: break; // Vector 14: ADC12IFG4

case 16: break; // Vector 16: ADC12IFG5

case 18: break; // Vector 18: ADC12IFG6

case 20: break; // Vector 20: ADC12IFG7

case 22: break; // Vector 22: ADC12IFG8

case 24: break; // Vector 24: ADC12IFG9

case 26: break; // Vector 26: ADC12IFG10

case 28: break; // Vector 28: ADC12IFG11

case 30: break; // Vector 30: ADC12IFG12

case 32: break; // Vector 32: ADC12IFG13

case 34: break; // Vector 34: ADC12IFG14

default: break;

}


7.4 例程

注释都在例程里,仔细看哦~


#include

void main(void)

{

//1. 关闭看门狗

WDTCTL = WDTPW | WDTHOLD; 


//2. 使用ADC12_A参考电压控制寄存器

REFCTL0 &= ~REFMSTR; 

//3.1 ADC12ENC置零来设置ADC12

ADC12C

[1] [2] [3] [4]
关键字:MSP430F6638  单片机  复习笔记 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476728.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430(F5529)学习笔记——UCS配置详解
下一篇:MSP430学习笔记——MSP430的系统时钟

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430G2553与MSP430F5336系列单片机总结[4]——比较器B的使用
比较器B是什么,顾名思义,它其实就是用来比较模拟电压+输入端和-输入端的电压大小,然后设置输出信号CBOUT的值的,如果 + 端电压高于 - 端电压,则CBOUT置高,否则置低。主要的控制寄存器有CBCTL0,CBCTL1,CBCTL2,CBCTL3,CBINT,CBIV,在MSP430G2553中没有比较器B,但是F5336中有,所以接下来的代码全都是F5336的比较器B使用程序:1.比较器B输入通道CB0接外部模拟输入信号,并且引至比较器+输入端,内部参考电压发生器利用共享电压源产生2.0V参考电压。最后当CB0输入模拟信号电压高于2.0V时,CBOUT输出高电平,当CB0输入模拟信号电压低于2.0V时,输出低电平
发表于 2019-11-06
MSP430F5529 时钟 25MHz 设置方法
MSP430F5529的launchpad是 TI送的比较多的一款开发套件,至少我们实验室就是人手一块,很多人都嫌他慢,确实相比较于STM32F103(72MHz) 和STM32F407(168MHz)的速度而言  默认状态下主频只有1MHz的 MSP430F5529就是个弟弟,而且处理位宽也是只有16位,,, 还不支持位带操作  ,但是就超低功耗这一点就足以让他在单片机界立足 ,废话少说,来正题。这次跟大家分享的是标题所说的  MSP430F5529的升频方案。要升频,首先我们得能‘看见’系统的频率,TI的工程师们充分考虑到了这个问题,他们有得引脚可以直接输出时钟信号!!!在芯片datesheet中
发表于 2019-10-29
MSP430F5529 时钟 25MHz 设置方法
win10下使用Energia开发MSP430F5529LP 基本流程及遇到的问题
energia.nu上下载energia安装驱动,部分电脑可能要禁用数字签名,常规操作不多说,官网上也有禁用数字签名的方法。都装好后打开energia,页面几乎和arduino一样,就是红得晃眼睛。什么东西都不写,先编译一下,就报错 大概意思是一个文件中的浮点数常量超出double范围 从来没见过这种错误,检查了一下自己安装的64位也没啥问题,到处找方法,论坛贴吧资料都很少,最后看到energia.exe附近有个arduino-builder.exe点击运行一下,再回去编译,就ok了,blink烧写进去也完全正常。后来发现还是有点问题,直接把报错的那个文件删除就好,不会有任何问题,亲测。当然最好留个备份,后面有关于这个函数的问题了再
发表于 2019-10-28
win10下使用Energia开发MSP430F5529LP 基本流程及遇到的问题
MSP430F149学习笔记——时钟
由于近期的需要,开始学习TI的MSP430 MCU。脑子不好使记不下来,只能辛苦一一敲在这里,便于大脑短路时随时查阅。首先学习了F149的时钟系统。F149拥有一个名为DCOCLK的内部数控振荡器,可外接两个晶振,通常一个晶振提供32768Hz实时时钟(LFXT1CLK),另一个晶振提供最大8MHz的系统主时钟(XT2CLK)。以上3个时钟源可以产生三个时钟信号:ACLK:辅助时钟。可由LFXT1CLK经1/2/4/8分频得到,可软件配置作为各种外设提供时钟信号。MCLK:主时钟。可由DCOCLK/LFXT1CLK/XT2CLK经1/2/4/8分频得到,作为CPU和系统时钟。SMCLK:副时钟。可由DCOCLK/LFXT1CLK
发表于 2019-10-25
基于MSP430F5529的μc/os嵌入式实时操作系统移植
()    //OS启动时调用,加载用户最高优先级的任务 OSCtxSw()       //任务级调度 OSIntCtxSw()      //中断级调度 OSTickISR()       //时钟中断响应,将检测到延时结束的任务加入就绪队列,    .cdecls C, LIST, "msp430.h";用户钩子,对应os_cpu_c.c中的HOOK函数    .ref     OSIntExit    .ref     OSIntNesting 
发表于 2019-10-25
MSP430F149;一、基本时钟
//  ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2//  //* XTAL's REQUIRED - NOT INSTALLED ON FET *////  //* Min Vcc required varies with MCLK frequency - refer to datasheet *// ////                MSP430F149//           
发表于 2019-10-25
MSP430F149;一、基本时钟
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved