msp430F 5438时钟配置为25M时
- 格式:docx
- 大小:13.78 KB
- 文档页数:2
MSP430F5438uCOSII移植******************************** MSP430F5438 uCOSII 移植 ********************************1. MSP430F5438是TI公司的超低功耗微控制器,供电电压变态低,功耗也是变态低,CPU可以跑到18Mhz到25Mhz,说性能是比不上ARM的了,可能指令的密度也不及ARM。
但是MSP430超低功耗的特点使它能够应用在那些功耗敏感的应用,如手持设备,模拟数字传感系统等。
MSP430F5438是比较新的芯片(相对于1,2,3,4系列),外部资源很丰富,功耗比以前的系列更低了。
2. MSP430F5438的CPU很特别,里面大部分的寄存器都是20bit(只有SR为16bit),使用20bit主要是要扩大寻址范围,MSP430本身是16bit-RISC的MCU,由于内部flash大,外围资源丰富,于是就扩展了额外的4bit。
个人认为,还不如直接把MSP430做成32bit的CPU,因为在移植ucos-II,设计各个任务的堆栈的时候,20bit其实还是需要32bit的空间去存储,浪费RAM。
在这次移植中,就因为堆栈溢出的问题,耗了我两天才发现,搞得毫无表情。
不过也让我认识到移植过程中需要注意的问题。
3. MSP430F5438的CPU相对ARM来说比较简单,首先MSP430F5438没有各种模式的切换,因此保存堆栈的时候会比较简单。
MSP430F5438的R12-R15是用于函数传入参数和返回参数用的。
中断跳转时会自动保存PC,SR寄存器的值,而CALLA这类的分支函数跳转只会自动保存PC而已,具体堆栈结构查看datasheet。
4. 移植uCOS-II有几个函数需要修改,分别如下:l)开关中断函数OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()2)任务堆栈初始化函数OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt);3)开始就绪任务的函数void OSStartHighRdy(void);4)任务级的调度函数void OSCtxSw(void);5)中断级的调度函数void OSIntCtxSw(void);6)时钟中断服务函数TIMER1_A0_IS5. 开关中断函数声明及宏定义:-----------------------------------------------------------------------------------------------#define OS_CRITICAL_METHOD 3#if OS_CRITICAL_METHOD == 3#define OS_ENTER_CRITICAL() (cpu_sr = OSCPUSaveSR())#define OS_EXIT_CRITICAL() (OSCPURestoreSR(cpu_sr))#endif-----------------------------------------------------------------------------------------------函数实现:-----------------------------------------------------------------------------------------------OSCPURestoreSRMOV.W R12, SRRETAOSCPUSaveSRMOV.W SR, R12DINTRETA-----------------------------------------------------------------------------------------------对于MSP430这类的单片机,使用了方法3去开关中断,最合适不过了。
MSP430时钟设置程序MSP430时钟设置程序1/void main (void){unsigned int i;WDTCL = WDTPW+WDTHOLD; //停止看门狗P5DIR = 0x10; //设置P5.4输出P5SEL = 0x10; //设置P5.4口为外围模块用作MCLK信号输出BCSCTL1 &= ~XT2OFF; //使TX2有效,TX2上电时默认为关闭的.do{IFG1 &= ~OFIFG; //清振荡器失效标志for(i= 0xff; i>;0; i--); //延时,待稳定.}while ((IFG1 & OFIFG)!=0); //若振荡器失效标志有效BCSCTL2 |= SELM1; //使MCLK = XT2for(;;);}2/#include ;void main(void){unsigned int i;WDTCTL = WDTPW + WDTHOLD; //停止看门狗BCSCTL1 |= XTS;//设置时基寄存器1,使ACLK = LFXT1 = HF XTAL,也就是高频模式.P2DIR|= 0x01; //设置P2.0方向寄存器为输出P2SEL |= 0x01; //设置P2.0口为外围模块用作ACLK信号输出P1DIR |= 0x02; //设置P1.1方向寄存器为输do{IFG1 &= ~OFIFG; //清振荡器失效标志for (i = 0xFF; i >; 0; i--); //延时,待稳定}while ((IFG1 & OFIFG)); //若振荡器失效标志有效? BCSCTL2 |= SELM_3;//设置时基寄存器2,使主时钟信号MCLK = LFXT1 (可靠的) for (;;) //无穷循环{P1OUT |= 0x02; // P1.1 = 1P1OUT &= ~0x02; // P1.1 = 0}}1-LFXT1CLK:低频/高频时钟源.由外接晶体振荡器,而无需外接两个振荡电容器.较常使用的晶体振荡器是32768HZ。
msp430f5419/38学习笔记之时钟系统(2011-11-30 10:41:30)分类: msp430标签:msp430f541xmsp430f543xucs时钟系统注:msp5419/38中,如果你使用SMCLK做TIMER_A的时钟,那么进入低功耗3或低功耗4是不会把SMCLK关掉的,这点5系列和其他系列的不一样。
UCS模块是一个低成本超低功耗系统,通过选择使用3个内部时钟信号,用户可以得到性能和功耗的最佳平衡点。
UCS可以由软件配置其工作模式,如配置成:不需要任何外部器件、使用1或 2个外部晶振等。
一、时钟系统UCS模块具有5个时钟源:XT1CLK:低频/高频振荡器,既可以与低频 32768HZ钟振、标准晶振、外部振荡器,又可以与外部4M-32MHZ时钟源一起使用,XT1CLK可以作为FLL模块内部的参考时钟。
有些芯片XT1CLK只允许使用外部的低频晶振,具体可参考数据手册;XT2CLK:可选高频振荡器,可与标准晶振,振荡器或者 4MHZ~32MHZ外部时钟源一起使用;VLOCLK:内部低功耗、低频振荡器,频率典型值为10KHZ;REFOCLK:内部低频振荡器,典型值为 32768HZ,可作为 FLL基准时钟源;DCOCLK:可以通过 FLL来稳定的内部数字控制振荡器(DCO);DCOCLK经过 FLL分频后可得DCOCLKDIV。
UCS模块可以提供3种时钟信号:ACLK:辅时钟;MCLK:系统主时钟;SMCLK:子系统主时钟。
二、UCS操作PUC之后,UCS的默认配置模式如下:XT1CLK 选择LF模式下的XT1作为时钟源,ACLK 选择 XT1CLK 作为时钟源;MCLK 选择DCOCLKDIV作为时钟源;SMCLK 选择DCOCLKDIV作为时钟源;FLL操作使能,FLL基准时钟(FLLREFCLK)选择XT1CLK;XIN 和 XOUT作普通IO 口使用,禁止了 XT1 功能,直到 I/O 口重新配置为 XT1 模式;如果有 XT2IN 和XT2OUT,则一并配置为普通 IO 口,禁止 XT2 功能。
MSP430的时钟设置MSP430大部分都有三时钟脉冲可供运行时选择,这三个时钟是,1)辅助时钟ACLK;2)系统主时钟MCLK;3)子系统时钟SMCLK。
这三种时钟脉冲的选择主要靠下面三个控制寄存器来完成,这三个控制寄存器是1)控制寄存器DCOCT其存储单元地址是56h;2) 基本始终控制寄存器1,BCSCTL1,地址57h;3) 基本始终控制寄存器2,BCSCTL2,地址58h。
下面对这三个寄存器的控制的软件状态状态进行介绍。
1)控制寄存器DCOCTLDCO2;DCO1;DCO0这三位共八个状态,控制时钟脉冲的8个频段。
000~111对应0~7;频率由低到高8个频段。
MOD.4~MOD.0这5为共32种状态,定义在32个周期中插入插入其他频率。
DCO2=0x80;DCO1=0x40;DCO0=0x20;MOD4=0x10;MOD3=0x08;MOD2=0x04;MOD1=0x02;MOD0=0x01其中TX2OFF为0,开启TX2振荡器,为1关闭;XTS=0开启低频模式,1开启高频模式;DIVA1和DIVA0控制分频模式0 0 不分频0 1 2分频1 0 4分频1 1 8分频TX5V一般设置为0RSEL2~RSEL0三位决定八个频段的不同频率,这样,RSEL2~RSEL0和DCO2~DCO0共可实现8*8=64个不同的频率。
由于430没有位操作,所以定义了每一位状态对应的名称:TX2OFF=0x80TXS=0x40DIVA1=0x20DIVA0=0x10TX5V=0x08RSEL2=0x04RSEL1=0x02RSEL0=0x01也就是每位所在的位置为1,其余位为0,这样,要对某一位操作,就可通过运算,在不改变其他位的情况下,对某一位进行置1或清0(如何做后面讲)。
SELM.1- SELM.0DIVM.1- DIVM.0SELS时钟源选择DIVS.1-DIVS.0 DCOR0 0 默认DCOCLK0 0默认MCLK=DCOCLK00 默认SMCLK=MCLK选择电阻0 1选择DCOCLK0 1 2分频选择SMCLK01 MCLK 2分频内电阻1 0 选择XT2CLK1 0 4分频默认选择DCOCLK10 MCLK 4分频或外电阻1 1 选择LFXTICLK1 18分频11 MCLK 8分频SELM1=0x80;SELM0=0x40;DIVM1=0x20;DIVM0=0x10;SELS=0x08;DIVS1=0x04;DIVS0=0x02;DCOR=0x01;下面看如何让在保证其他位不变的情况下给某一位清0或置1.例1要给BCSCTL2的bit3清0。
MSP430 频率(时钟)配置MSP430时钟:1、在MSP430单片机中一共有四个时钟源:(1)LFXT1CLK,为低速/高速晶振源,通常接32.768kHz晶振(2)XT2CLK,可选高频振荡器,外接标准高速晶振,通常是接8Mhz,也可以接400kHz~16Mhz;(3)DCOCLK,数控振荡器,为内部时钟,由RC震荡回路构成,受温度和电压的影响较大;若外部不接稳定的晶振电路,直接由内部时钟工作,则会因环境变化而导致性能不稳定。
(4)VLOCLK,内部低频振荡器,12kHz标准振荡器。
(要得到标准的12k则必须外接32768等晶振)2、在MSP430单片机内部一共有三个时钟系统:(1)ACLK:辅助时钟,通常由LFXT1CLK或VLOCLK作为时钟源,可以通过软件控制更改时钟的分频系数;(2)MCLK:主时钟,为系统内核提供时钟,它可以通过软件从四个时钟源选择或者从四个时钟源分频后选择为主时钟;(3)SMCLK:子时钟,也是可以由软件选择时钟源。
3、MSP430的时钟设置包括3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3MOD0~MOD4: Modulation Bit,频率的微调。
一般不需要DCO的场合保持默认初始值就行了。
XT5V: 1.DIVA0~DIVA1:选择ACLK的分频系数。
DIVA=0,1,2,3,ACLK的分频系数分别是1,2,4,8;XTS: 选择LFXT1工作在低频晶体模式(XTS=0)还是高频晶体模式(XTS=1)。
XT2OFF: 控制XT2振荡器的开启(XT2OFF=0)与关闭(XT2OFF=1)。
正常情况下把XT2OFF复位就可以了.DCOR: 0,选择内部电阻;1,选择外部电阻DIVS0~DIVS1: DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8SELS: 选择SMCLK的时钟源, 0:DCOCLK; 1:XT2CLK/LFXTCLK.DIVM0~1: 选择MCLK的分频因子, DIVM=0,1,2,3对应分频因子为1,2,4,8.SELM0~1: 选择MCLK的时钟源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CLK我用的时候一般都把SMCLK与MCLK的时钟源选择为XT2。
MSP430F5438调试笔记
MSP430F5438 调试笔记1.JTAG 连接下载问题:
出现问题1:
说明JTAG 没有发现MSP430F5438 设备,JTAG 正确接法是:2 脚接VCC 默认为JTAG 供电,这个供电由USB 馈电得到,注:一般情况下在JTAG 供电时,4 脚需悬空。
在外部供电时2 脚也需接到VCC 上,4 脚悬空或接VCC 均可,一般是悬空,防止外部供电与JTAG 的供电电压不匹配,引起JTAG 异常。
JTAG 的TEST 管脚处理:之前看到利尔达关于IAR 烧写工具的描述,如下图所示:但是这个不适用5 系列的430,但手册中没说,深受其害。
和开发板的人沟通这个只试用与2 系列和4 系列的B 仿真器和并口仿真器不能同时试用。
可能的原因:1)并口FET 不要是什么精简版的没有Test 脚肯定不灵2)RST 引脚上不要有外接的复位片子通用原则3)IAR430 的版本要在4.21 及以上4.20/4.11b 可能也行,没试过;3.x 的版本应该还没有5 系吧...4)电源问题处理好是目标板供电还是并口供电,二选一吧,不要冲突了,这个是
不是决定因素不清楚,但是肯定需要考虑tips:感谢大家的阅读,本文由我司收
集整编。
仅供参阅!。
MSP430F5438USCI模块的详细介绍MSP430F5438是一款德州仪器(TI)推出的超低功耗微控制器,搭载了USCI模块,提供多种通信接口,包括UART、SPI和I2C。
本文将详细介绍MSP430F5438的USCI模块的特性和应用。
USCI模块在MSP430F5438上有两个实例,分别称为USCI_A和USCI_B。
每个实例都可以配置为UART、SPI或I2C模式,提供相应的寄存器和功能。
以下将分别介绍每个实例的特性和应用。
CI_A模块:USCI_A模块是一个通用的串行通信模块,可配置为UART、SPI或I2C模式。
它提供了几个寄存器和功能,用于配置串口参数、接收和发送数据。
在UART模式下,USCI_A可以实现异步串行通信,支持多种波特率和数据格式。
在SPI模式下,它可以与其他设备进行高速的全双工通信,支持主从模式和多主模式。
在I2C模式下,USCI_A可以作为主设备或从设备,与其他I2C设备进行双向通信。
应用方面,USCI_A模块可用于实现与外部设备的通信,如串行打印机、传感器、外部存储器等。
通过UART模式,MSP430F5438可以与PC进行通信,进行数据传输和远程调试。
通过SPI模式,可以与其他MSP430微控制器或外部器件进行高速数据传输,如液晶显示屏、无线模块等。
通过I2C模式,可以与其他I2C设备(例如传感器、实时时钟等)进行双向通信,实现数据采集和控制。
CI_B模块:USCI_B模块也是一个通用的串行通信模块,可配置为UART、SPI或I2C模式。
它与USCI_A模块类似,提供了相应的寄存器和功能,用于配置通信参数和执行数据传输。
在UART模式下,USCI_B支持多种波特率、数据格式和校验方式。
在SPI模式下,它支持全双工通信和多种传输模式。
在I2C模式下,USCI_B可以作为主设备或从设备,与其他I2C设备进行双向通信。
应用方面,USCI_B模块与USCI_A模块相似,可应用于串行通信和外设接口。
MSP430F5438外接25M晶振。
void initClock(void)
{
// 初始化P7.0(#13)和P7.1(#14)为复用功能, XT1 外部时钟晶体接线
GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P7 , GPIO_PIN0 | GPIO_PIN1 );
// 启动XT1
//Initializes the XT1 crystal oscillator with no timeout
//In case of failure, code hangs here.
//For time-out instead of code hang use UCS_LFXT1StartWithTimeout()
UCS_LFXT1Start( UCS_XT1_DRIVE0 , UCS_XCAP_3);
// DCO参考时钟选择XT1,选择了默认参数
//UCS_clockSignalInit( UCS_FLLREF, UCS_XT1CLK_SELECT , UCS_CLOCK_DIVIDER_1 );
// 初始化P5.2(#89)和P5.3(#90)为复用功能, XT2 外部时钟晶体接线
GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P5 , GPIO_PIN2 | GPIO_PIN3 );
// 启动XT2
UCS_XT2Start( UCS_XT2DRIVE_24MHZ_32MHZ );
// DCO参考时钟选择XT1,选择了默认参数
//UCS_clockSignalInit( UCS_FLLREF, UCS_XT1CLK_SELECT , UCS_CLOCK_DIVIDER_1 );
// ACLK参考时钟源选择REFO, 32768Hz
//UCS_clockSignalInit(UCS_ACLK,
UCS_REFOCLK_SELECT,UCS_CLOCK_DIVIDER_1);
// DCO参考时钟源选择REFO,32768Hz
//UCS_clockSignalInit(UCS_FLLREF, UCS_REFOCLK_SELECT , UCS_CLOCK_DIVIDER_1);
// DCO时钟16MHz, used as MCLK and SMCLK frequency
// 该函数第1个参数为系统工作频率16384KHz/1024=16MHz,第2个参数为工作频率/DCO参考频率=16*1024*1024/32768=512
#define FRQ_DIV 1
//UCS_initFLLSettle(16384/FRQ_DIV , 512/FRQ_DIV);
//! Initializes the XT2 crystal oscillator, which supports crystal frequencies
//! between 4 MHz and 32 MHz, depending on the selected drive strength. Loops
//! until all oscillator fault flags are cleared, with no timeout. See the
//! device-specific data sheet for appropriate drive settings.
UCS_clockSignalInit(UCS_MCLK,UCS_XT2CLK_SELECT ,UCS_CLOCK_DIVID ER_1);
//SMCLK参考时钟源选择DCO,16MHz/4=4MHz,4*1024*1024=4194304Hz
//UCS_clockSignalInit(UCS_SMCLK,UCS_DCOCLK_SELECT,UCS_CLOCK_DIV IDER_4);
UCS_clockSignalInit(UCS_SMCLK,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVI DER_4);
//延时0.5秒, 让时钟源稳定
delay_ms(500);
UCS_setExternalClockSource(32768,MCLK_FRQ);
cvMCLK = UCS_getMCLK();
cvSMCLK = UCS_getSMCLK();
cvACLK = UCS_getACLK();
}。