MSP4305438
- 格式:pdf
- 大小:983.46 KB
- 文档页数:3


第十五章第十五章 UART USCI支持的通讯方式☐USCI_A0UARTIrDASPI自适应波特率下的LIN通讯☐USCI_B0I2CSPI异步通讯特性概述7位或8位数据位,支持奇偶校验独立的发送和接收移位寄存器独立的发送和接收缓存可选择先发送(接收)MSB还是LSB空闲位多机模式和地址位多机模式通过有效的起始位检测将msp430从低功耗唤醒 状态标志检测错误或者地址位独立的接收和发送中断可编程实现波特率的调整UART内部结构图UART内部结构图初始化流程置位UCSWRST。
初始化USCI的各个相关寄存器。
设置端口。
清除UCSWRST。
使能UCAxRXIE和UCAxTXIE。
UART下不同通讯方式UART下不同通讯方式☐UCACTL0寄存器:UCSYNC• 0 异步• 1 同步UCMODEx•00 点对点异步通讯•01 线路空闲多机模式•10 地址位多机模式•11 自适应波特率的异步通讯线路空闲多机模式(UCMODEx=01)•当UCMODEx=01的时候,选择了线路空闲多机模式,具体看如下图:如何发送空闲帧1、先置位UCTXADDR,然后把地址字符写入UCAxTXBUF。
(UCAxTXIFG=1为前提)•当地址字符从发送缓存转入到发送移位寄存器的时候,UCTXADDR会自动复位2、把要发送的数据写到发送缓存UCAxTXBUF中。
☐F449在发送空闲帧时要置位TXWAKE,在写个任意数据到UCAxTXBUF产生11个空闲位,再才写地址字符到发送缓存。
关注标志位UCDORM 0ALLcharacters•UCAxRXIFG置位,进入接收中断•数据装载到接收缓存UCAxRXBUF中1Addresscharacters•UCAxRXIFG置位,进入接收中断•数据装载到接收缓存UCAxRXBUF中•假如UCRXEIE=1,错误标志位也会被置位Non-ddresscharacters•在接收端接收但不置位UCAxRXIFG,也不进入接收中断•数据不装载到接收缓存UCAxRXBUF中UCTXADDRUCTXADDR 先置位UCTXADDR,然后把地址字符写入UCAxTXBUF。
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去开关中断,最合适不过了。
MSP430F5438 开发板使用说明
1.电源
开发板使用DC5V的外部供电,跳线J3实现了开关功能。
电源接通后D6的LED点亮。
2. 复位按键
S13为复位按键。
按下复位按钮,即可将程序复位,从头开始执行。
3.键盘
开发板设有12个按键,为3*4的行列扫描键盘。
使用P3.0到P3.7端口,P3.0、P3.1、P3.2为行线,P3.4、P3.5、P3.6、P3.7为列线。
列线分别由上拉电阻拉到VCC,在行线与列线的每一个交接处有一个按键,按键的两端分别接在行线和列线上。
如果有键按下,则与只相连的行线与列线被连通,即可检测按键。
4.LCD显示
表1:12864LCD的引脚说明
IO口连接
P9.5------RS P9.6------R\W P9.7------E P10.0~10.7--------DB0~DB7 P11.0-------CS1 P11.1-------CS2 P11.2------RST
跳线J4是背光开关;
电位器R13背光亮度调节。
5.LED
P9.0 9.1 9.2 9.3 9.4 口接有LED,设置各口为输出高电平时LED点亮,低电平时熄灭。
6.扩展IO口
开发板两侧的双排插针。
MSP430F5438管脚。
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 );// 启动XT2UCS_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();}。