MSP430F5529测周法测量信号频率

合集下载

MSP430F5529实验指导书V1.0

MSP430F5529实验指导书V1.0

MSP430F5529 实验指导书(V1.0)2014年10月27日东北林业大学机电工程学院“3+1”实验室实验一基础GPIO实验实验二键盘与液晶显示实验实验三时钟系统配置实验实验四看门狗与定时器实验实验五 AD/DA实验实验六比较器实验实验七 Flash实验实验八串行通信实验实验一基础GPIO实验【实验目的】1、熟悉CCS的基本使用方法;2、掌握MSP430系列单片机程序开发的基本步骤;3、掌握MSP430 IO口的基本功能。

【实验仪器】1、SEED-EXP430F5529v1.0开发板一套;2、PC机操作系统Windows XP或Windows 7,CCSv5.1集成开发环境。

【实验原理】CCS(Code Composer Studio)是 TI 公司研发的一款具有环境配置、源文件编辑、程序调试、跟踪和分析等功能的集成开发环境,能够帮助用户在一个软件环境下完成编辑、编译、链接、调试和数据分析等工作。

CCSv5.1 为 CCS 软件的最新版本,功能更强大、性能更稳定、可用性更高,是 MSP430 软件开发的理想工具。

SEED-EXP430F5529v1.0开发板上的有8个可操作的LED灯,与MCU的IO口对应关系如图1-1所示:图1-1 LED与MCU的IO对应关系电路我们可以通过控制单片机IO口的输出电平状态来控制各个LED灯的亮灭。

开发板上还有2个可操作的按键S1,S2。

如图1-2所示。

图1-2 按键电路我们可以通过读取与按键相连的IO口的输入电平状态来执行相应的操作。

此外,S1,S2还可以作为外部中断源,触发中断。

【实验内容】1、用调用头文件的方法,使能MSP430F5529开发板上的8个LED灯依次按顺序循环点亮;2、用按键S1控制开发板上LED1的亮灭状态(查询法);3、用按键S2控制开发板上跑马灯的循环速度(中断方式)。

【实验步骤】内容1:使能开发板上的8个LED灯依次按顺序循环点亮1、打开CCSv5并确定工作区间,然后选择File-->New-->CCS Project 弹出图1-3对话框。

MSP430F5529测频法测量信号频率

MSP430F5529测频法测量信号频率

MSP430F5529测量频率-----测频法信号变换电路过零比较器,lm393输出上拉电阻,两电阻分压程序#include <>#include ""//测频法,上限1Mhz//看门狗定时1s,开门狗中断处理程序开启捕获器,捕获1s中所有的上升脉冲,脉冲个数即为频率/*优化的反向可以将开门够定时1S使用定时器去定时1s**/long fre=0;char buf[60]="\0";void SetVcoreUp (unsigned int level){// Open PMM registers for writePMMCTL0_H = PMMPW_H;// Set SVS/SVM high side new levelSVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;// Set SVM low side to new levelSVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;// Wait till SVM is settledwhile ((PMMIFG & SVSMLDLYIFG) == 0);// Clear already set flagsPMMIFG &= ~(SVMLVLRIFG + SVMLIFG);// Set VCore to new levelPMMCTL0_L = PMMCOREV0 * level;// Wait till new level reachedif ((PMMIFG & SVMLIFG))while ((PMMIFG & SVMLVLRIFG) == 0);// Set SVS/SVM low side to new levelSVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;// Lock PMM registers for write accessPMMCTL0_H = 0x00;}void init_clock(){SetVcoreUp (0x01);SetVcoreUp (0x02);SetVcoreUp (0x03);UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFOUCSCTL4 |= SELA_2; // Set ACLK = REFO__bis_SR_register(SCG0); // Disable the FLL control loopUCSCTL0 = 0x0000; // Set lowest possible DCOx, MODxUCSCTL1 = DCORSEL_7; // Select DCO range 50MHz operationUCSCTL2 = FLLD_0 + 609; // Set DCO Multiplier for 25MHz// (N + 1) * FLLRef = Fdco// (762 + 1) * 32768 = 25MHz// Set FLL Div = fDCOCLK/2__bic_SR_register(SCG0); // Enable the FLL control loop__delay_cycles(782000);do{UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);// Clear XT2,XT1,DCO fault flagsSFRIFG1 &= ~OFIFG; // Clear fault flags}while (SFRIFG1&OFIFG); // Test oscillator fault flag}void send_char(char sc){UCA0TXBUF=sc;while(!(UCA0IFG&UCTXIFG));}void send_string(char *s){while(*s!='\0'){send_char(*s++);}}init_uart(){P3SEL |= BIT3+BIT4; // ,4 = USCI_A0 TXD/RXDUCA0CTL1 |= UCSWRST; // **Put state machine in reset**UCA0CTL1 |= UCSSEL__SMCLK; // SMCLKUCA0BR0 = 173; // 1MHz 115200 (see User's Guide)UCA0BR1 = 0; // 1MHz 115200 UCA0MCTL |= UCBRS_5 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**// UCA0IE |= UCRXIE; // Enable USCI_A0 RX interruptsend_string("CLS(0);\r\n");}int main(void) {WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timerinit_clock();//初始化系统时钟为20 MHzinit_uart();//串口波特率为115200bpsWDTCTL=WDT_ADLY_1000 ;//开门狗定时1sP1DIR &= ~BIT2; // inP1SEL |= BIT2; //捕获输入SFRIE1|=WDTIE; //开看门狗定时器中断__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts__no_operation(); // For debugger return 0;}void measure_fre(){if(fre>=500)sprintf(buf,"DS16(0,60,'频率:% ',4);\r\n",fre*;if(fre<=52)sprintf(buf,"DS16(0,60,'频率:% ',4);\r\n",(fre)*;else if(fre<=208)sprintf(buf,"DS16(0,60,'频率:% ',4);\r\n",(fre+1)*;else if(fre<=496)sprintf(buf,"DS16(0,60,'频率:% ',4);\r\n",(fre+3)*;send_string( buf);fre=0;TA0CTL = TASSEL_2 + MC_2 + TACLR+TAIE; // SMCLK, 连续mode, clear TAR 8分频下限可以测到8Hz。

基于MSP430的低频频率测量计

基于MSP430的低频频率测量计

0 . 1 8 0 . 0 0 4 6 l 9 0 . 1 9 0 . 0 0 4 7 7 7 0 . 2 0 0 . 0 0 4 8 8 6 O 1 9 0 . 0 0 4 6 1 9 O . 1 9 0 . 0 0 4 4 6
4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4
工 l 堡 功 能・ 要 I 上升沿捕获 J

3实验结果及结论 ‘ 、 ‘ 。
实验采用信号发生器输 出 相应频率到I / 0 口 P 1 . 2 , 高 … … … … ’
电平为+ 3 v , 低 电平为0 V 。
———T——一
疆 百雨丽
从实 验 结果可 以看 出,
3 7. 82
0 . 1 7 0 . 0 0 4 7 3 7 O . 1 8 0 . 0 0 4 8 9 6
0.1 8 0. 00 4 69 8
3 9 4 0
£ 篓当寓 盅葛 霜寄是 MS P 4 3 0 F 1 4 9
2 5 . 7 6 2 5 . 1 2 2 4 . 5 1 2 3 . 9 2 2 3 . 3 6 2 2 . 8 4 2 2 . 3 3 2 1 . 8 4 2 1 . 3 8 2 O . 9 4 2 O . 5 1 2 0 . 0 9 l 9 . 6 9 1 9 . 3 2 1 8 . 9 7 l 8 . 6 1
是否再 次有上 升沿?~ 二= = = — 率 , 则应选用其它方法。
— —
— —\

工 一

一 l 的测量。 若要测量更高的频
否 r …一 … …一 ~ …… ’
[ 参考文献] [ 1 ] 沈建华, 杨艳琴・ M s P 4 3 0 系列

MPF测周法测量信频率完整版

MPF测周法测量信频率完整版

M P F测周法测量信频率HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】M S P430F5529测量频率-----测周法信号变换电路过零比较器,lm393输出上拉电阻,两电阻分压程序#include <>#include ""#include ""//测周法,在捕获过程中,定时溢出不能被检测出,选择时钟频率为低频时能测出低频,频率高能测出频率高的部分/***/long long start=0;//long long int stop=0;double fre=;unsigned char i=0;unsigned char over=0;void SetVcoreUp (unsigned int level){// Open PMM registers for writePMMCTL0_H = PMMPW_H;// Set SVS/SVM high side new levelSVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;// Set SVM low side to new levelSVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;// Wait till SVM is settledwhile ((PMMIFG & SVSMLDLYIFG) == 0);// Clear already set flagsPMMIFG &= ~(SVMLVLRIFG + SVMLIFG);// Set VCore to new levelPMMCTL0_L = PMMCOREV0 * level;// Wait till new level reachedif ((PMMIFG & SVMLIFG))while ((PMMIFG & SVMLVLRIFG) == 0);// Set SVS/SVM low side to new levelSVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;// Lock PMM registers for write accessPMMCTL0_H = 0x00;}void init_clock(){SetVcoreUp (0x01);SetVcoreUp (0x02);SetVcoreUp (0x03);UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFOUCSCTL4 |= SELA_2; // Set ACLK = REFO__bis_SR_register(SCG0); // Disable the FLL control loopUCSCTL0 = 0x0000; // Set lowest possible DCOx, MODxUCSCTL1 = DCORSEL_7; // Select DCO range50MHz operationUCSCTL2 = FLLD_0 + 609; // Set DCO Multiplierfor 25MHz// (N + 1) * FLLRef = Fdco// (762 + 1) * 32768 = 25MHz// Set FLL Div = fDCOCLK/2__bic_SR_register(SCG0); // Enable the FLLcontrol loop__delay_cycles(782000);do{UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);// Clear XT2,XT1,DCO fault flagsSFRIFG1 &= ~OFIFG; // Clear fault flags}while (SFRIFG1&OFIFG); // Test oscillator fault flag}void send_char(char sc){UCA0TXBUF=sc;while(!(UCA0IFG&UCTXIFG));}void send_string(char *s){while(*s!='\0'){send_char(*s++);}}init_uart(){P3SEL |= BIT3+BIT4; // ,4 = USCI_A0 TXD/RXDUCA0CTL1 |= UCSWRST; // **Put state machine in reset**UCA0CTL1 |= UCSSEL__SMCLK; // SMCLKUCA0BR0 = 173; // 1MHz 115200 (seeUser's Guide)UCA0BR1 = 0; // 1MHz 115200UCA0MCTL |= UCBRS_5 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**UCA0IE |= UCRXIE; // Enable USCI_A0 RX interruptsend_string("CLS(0);\r\n");}int main(void) {char buf[60]="\0";WDTCTL = WDTPW + WDTHOLD; // Stop WDTinit_clock();init_uart();P1DIR &= ~BIT2; // inP1SEL |= BIT2; //捕获输入TA0CTL = TASSEL_2 +ID__8 + MC_2 + TACLR+TAIE; // SMCLK, 连续mode, clear TAR 8分频下限可以测到8Hz。

标准实验二MSP430F5529_25Hz方波发生及测量实验

标准实验二MSP430F5529_25Hz方波发生及测量实验

电子科技大学实验报告学生姓名:学号:指导教师:邮箱:一、实验室名称:MSP430单片机实验室二、实验项目名称:25Hz方波发生及峰值幅度测量三、实验原理:(1)通用功能I/O参见实验一中相关原理介绍。

(2)定时器(Timer)定时功能模块是MSP430应用系统中经常用到的重要部分,可用来实现定时控制、延迟、频率测量、脉宽测量和信号产生、信号检测等等。

一般来说,MSP430所需的定时信号可以用软件和硬件两种方法来获得。

MSP430系列有丰富定时器资源:看门狗定时器(WDT),定时器A(Timer_A),定时器B(Timer_B)和定时器D(Timer_D)等。

MSP430系列定时器部件功能,如表2-1所示:表2-1 MSP430中定时器的功能(a)看门狗定时器,主要作用在于当“程序跑飞”时,会产生溢出,从而产生系统复位,CPU需要重新运行用户程序,这样程序就可以又回到正常运行状态。

MSP430 看门狗模块具有以下特性:●8 种软件可选的定时时间●看门狗工作模式●定时器工作模式●带密码保护的WDT 控制寄存器●时钟源可选择●为降低功耗,可停止●时钟失效保护(b)定时器A由一个16位定时器和多路捕获/比较通道组成。

MSP430X5XX / 6XX系列单片机的Timer _A有以下特性:●带有4 种操作模式的异步16 位定时/计数器●输入时钟可以有多种选择,可以是慢时钟,快时钟以及外部时钟●可配置捕获/比较寄存器数多达7 个●可配置的PWM(脉宽调制)输出●异步输入和同步锁存。

不仅能捕获外部事件发生的时间还可锁定其发生时的高低电平●完善的中断服务功能。

快速响应Timer_A中断的中断向量寄存器●8种输出方式选择●可实现串行通讯Timer_A由以下4部分组成:定时计数器:16 位定时/计数寄存器——TAxR时钟源的选择和分频:定时器时钟TACLK 可以选择ACLK,SMCLK 或者来自外部的TAxCLK。

430实现频率的检测

430实现频率的检测

1 引言由于频率信号具有抗干扰性强、易于传输、测量准确度较高等优点,因此许多非频率量的传感信号都转换为频率量来进行测量和处理。

因此频率测量方法愈来愈引起关注和研究。

频率测量是测量和控制系统领域的最基本测量之一。

当今用的最多的测量信号频率的仪器是频率计,由于频率计在测量过程中需要一个时基信号作为测量信号频率的时基。

时基信号一般是由本机振荡电路发生的,尽管现在多用石英晶体振荡器,但是仍然不能保证时基信号的精度,因此频率计的测量精度也就成了问题。

传统的频率测量方法有两种[1]:一种是测频法,在一定时间间隔T内测出待测信号重复变化次数N,频率即为;另一种方法是测周法,在被测信号的一个周期内测出标准高频信号f的个数N,则被测频率。

本文介绍了一种测宽法[2],借助光电耦合原理,将交流信号转变成周期脉冲信号,通过捕获脉冲信号的下降沿,由定时器计数,通过二次计数的差值便能得到脉冲信号的周期,进而可以计算出所测交流信号的频率。

2 硬件电路设计硬件电路完成的任务是:(1)模拟电路部分的设计,其功能是进行信号的转化。

交流信号通过整流桥、光电耦合器等模拟器件便能得到周期脉冲信号。

(2)数字电路部分的设计,其功能是进行信号的检测。

MSP430单片机内部的16位定时器A具有脉冲捕获功能,能将脉冲信号的占空比检测出来。

图1为它的基本结构图。

图1 系统的基本结构2.1 模拟电路部分的设计图2为模拟部分原理。

下面主要阐述该电路的工作原理:图2模拟部分原理图考虑到交流信号中可能含有一定的直流信号,而直流信号会引起交流波形的上移或下移,这可能会导致原有交流信号没有零点,这就谈不上过零检测、周期脉冲了,因此要根据交流信号的实际情况,在交流信号的出口处用设个适当的电容,起到隔直的作用。

R1和R2是限流电阻,保护后面的稳压管、二极管、光电耦合器在额定功耗范围内。

由于这里的交流信号源选取的是220V市电正弦信号,所以R1和R2的阻值要比较大而且功率要比较大,该系统使用的是、1W的电阻。

MSP430频率计程序

MSP430频率计程序

这两天在搞频率计的问题,开始的时候思路很清晰,但是实现起来比较麻烦。

想测量一个方波的频率,有两种方法,一个是测频率,就是定时1S然后计数方波的高电平个数。

另一个是测周期法,就是测量方波的一个周期的时长,从而得到频率。

第一种方法很简单,下面讲讲我用的第二种方法。

思路是这样的,利用定时器的捕获功能,捕获方波的上升沿,将两次比较的值相减,就能得出两个上升沿之间定时器的计数值,然后处理一下计数值,就能得到正确的频率。

设置两个变量,一个是new_cap,一个是old_cap。

捕获得到新的TAR数值赋给new_cap,再将上一次捕获的数值赋给old_cap,然后两值相减就能得到一个周期的计数值。

(程序中将体现)最开始写的时候,显示的频率不对,今天改动了一下。

用定时器A1,然后比较TAIV的值再进行频率数值计算。

再将显示函数放在主函数里面循环就对了。

(昨天把显示函数放在中断里面了,不知道有啥关系不,知道的提示下,谢谢了)程序贴出来供大家参考//*****************************************************////*****P1.2为定时器A1的CCI1A输入端,信号从P1.2输入********////*****定时器时钟为SMCLK(DCO=1Mhz),不用分频*********////************ ————————————————*************////*****P1.0 ->|(比较器输入) |************////*****P1.1 ->|(LCDRS) P2.0|->D0*******////*****P1.2 ->|(定时器输入)<--- ~ | ~********////*****P1.3 ->|(LCDEN) | P2.7|->D7*****////*****P1.7 ->|(比较器输出)---- |*********////***********| msp30g2553 |********////***********| 制作人:wusong |*******////*********************************************//#include<msp430g2553.h>#include<1602.h>#define uchar unsigned char#define uint unsigned intuchar table[]={"frequency:"};uchar table_num[]={"0123456789"};uint new_cap,old_cap,cap_diff,fre;void LCD_display(){write_com(0x80);fre = 10000000/cap_diff;/////////////这个是将计数值转换为频率。

Msp430f5529开发板测周期和AD

Msp430f5529开发板测周期和AD

Msp430f5529开发板测频率和ADC采样电压必备资料:f5529的中文指导和数据手册(遗憾是汇编语言不是C)中文指导:网上有大侠把英文版的用户指导翻译成中文了数据手册:还没有出现中文版这种神器,不过多看几遍就OK一.定时器A一些基本资料至于寄存器里面含义自己应该可以看懂!这句话我认为有一个极容易产生一个误区,就是TA有7个比较捕获寄存器,当你查看msp430f5529.h的时候,我就发现只有TAxCCTL0,TAxCCR0TAxCCTL1,TAxCCR1TAxCCTL2,TAxCCR2它们都是共用一个TACTL。

压根就是没有3~6例如没有TAxCCTL3,TAxCCR3,我认为单片机上肯定是有7个比较捕获寄存器,就是msp430f5529没有对剩余的四个进行宏定义。

个人想法。

这个最高级,好像大部分的430单片机写的程序都是优先写它。

特点:增计数模式连续计数模式增减计数模式!!!!!!!这几种模式都能用例如增计数模式:TA0CCTL0 = CCIE; // CCR0 interrupt enabledTA0CCR0 = 50000;TA0CTL = TASSEL_2 + MC_1 + TACLR; // SMCLK, upmode, clear TAR __bis_SR_register(GIE); // Enter LPM0, enable interrupts 就凭它的权力最多,就应该单独想用一个中断函数与CCTL1,CCTL2区分开来!// Timer0 A0 interrupt service routine#pragma vector=TIMER0_A0_VECTOR__interrupt void TIMER0_A0_ISR(void){}其中的R0代表你用的TA定时器的第几个TA0-----R0TA1-----R1TA2-----R2CCTL0---A0 一个中断对应一个中断源例如我写的是TA2CCTL0和TA2CCR0,则对应的中断就是#pragma vector=TIMER2_A0_VECTOR应该明白了吧!TAxCCTL2,TAxCCR2特点:连续计数模式经我调试TA0CCTL1 = CCIE; // CCR0 interrupt enabledTA0CCR1 = 50000;TA0CTL = TASSEL_2 + MC_1 + TACLR; // SMCLK, upmode, clear TAR是进不了中断的,这是血的教训,(如果你采用的是比较模式,千万别想着,TMD 理论上就是这样,为什么进不了中断)应该把 MC_1改为MC_2就OK了.官方这样说这样可以从侧面提问,上文中为什么不是TAxCCRx,而只是TAxCCR0!应该明白了,这里有一点千万要区分开来,这是晕死的教训!TA0R,与TA0CCR1的区别,我也不知道是看了那本破书,或者就是那些5系列一下的430单片机程序可以,我只能感叹F5529真是神器!在中断函数里把cap=TA0CCR1,或者是TA1CCR1,还说TA0R,TA0CCRx其实是一样的,就是计数的储存。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MSP430F5529测量频率
-----测周法信号变换电路
过零比较器,lm393输出上拉电阻,两电阻分压
程序
#include <msp430f5529.h>
#include "stdio.h"
#include "math.h"
//测周法,在捕获过程中,定时溢出不能被检测出,选择时钟频率为低频时能测出低频,频率高能测出频率高的部分
/*
* main.c
*/
long long start=0;
//long long int stop=0;
double fre=0.0;
unsigned char i=0;
unsigned char over=0;
void SetVcoreUp (unsigned int level)
{
// Open PMM registers for write
PMMCTL0_H = PMMPW_H;
// Set SVS/SVM high side new level
SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
// Set SVM low side to new level
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
// Wait till SVM is settled
while ((PMMIFG & SVSMLDL YIFG) == 0);
// Clear already set flags
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
// Set VCore to new level
PMMCTL0_L = PMMCOREV0 * level;
// Wait till new level reached
if ((PMMIFG & SVMLIFG))
while ((PMMIFG & SVMLVLRIFG) == 0);
// Set SVS/SVM low side to new level
SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
// Lock PMM registers for write access
PMMCTL0_H = 0x00;
}
void init_clock()
{
SetVcoreUp (0x01);
SetVcoreUp (0x02);
SetVcoreUp (0x03);
UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_7; // Select DCO range 50MHz operation UCSCTL2 = FLLD_0 + 609; // Set DCO Multiplier for 25MHz
// (N + 1) * FLLRef = Fdco
// (762 + 1) * 32768 = 25MHz
// Set FLL Div = fDCOCLK/2 __bic_SR_register(SCG0); // Enable the FLL control loop
__delay_cycles(782000);
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
}
void send_char(char sc)
{
UCA0TXBUF=sc;
while(!(UCA0IFG&UCTXIFG));
void send_string(char *s)
{
while(*s!='\0')
{
send_char(*s++);
}
}
init_uart()
{
P3SEL |= BIT3+BIT4; // P3.3,4 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL__SMCLK; // SMCLK
UCA0BR0 = 173; // 1MHz 115200 (see User's Guide)
UCA0BR1 = 0; // 1MHz 115200
UCA0MCTL |= UCBRS_5 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
send_string("CLS(0);\r\n");
}
int main(void) {
char buf[60]="\0";
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
init_clock();
init_uart();
P1DIR &= ~BIT2; // P1.2 in
P1SEL |= BIT2; //捕获输入
TA0CTL = TASSEL_2 +ID__8 + MC_2 + TACLR+TAIE; // SMCLK, 连续mode, clear TAR 8分频下限可以测到8Hz。

上限200K左右
TA0CCTL1 =CM_1 +SCS +CAP +CCIE;
__bis_SR_register( GIE); // Enter LPM0, enable interrupts
while(1)
{
sprintf(buf,"DS16(0,60,'频率:%1.1f',4);\r\n",fre);
send_string( buf);
__delay_cycles(314574);
}
}
//下限频率15,上限200K左右
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case 0: break; // No interrupt
case 2: //CCR1
{
i++;
if(i==1)
{over=0;
TA0CTL |=TACLR;
}
if(i>=51)
{
i=0;
TA0CCTL0&=~CCIE;
start=over*65536+TA0CCR1;
fre=125000000/start;
TA0CTL |=TACLR;
}
}
break;
case 4: break; // CCR2 not used
case 6: break; // CCR3 not used
case 8: break; // CCR4 not used
case 10: break; // CCR5 not used
case 12: break; // CCR6 not used
case 14: over++;
break; //定时器溢出
default: break;
}
}。

相关文档
最新文档