历史上的今天
今天是:2024年12月17日(星期二)
2020年12月17日 | MSP430F5418的详细解析
2020-12-17 来源:elecfans
1)UCS
时钟如同处理器的心脏,每一个周期就是心脏的一次脉动。以前使用其他处理器时,只需要选择合适频率的晶体,接在XT1和XT2两端,再加两个电容就可以了。而MSP430F5418的时钟系统略显复杂,容易让刚开始接触它的人一头雾水。5418的时钟设置由UCS(Unified Clock System)来管理,使用起来比较灵活,其结构图如下所示。

UCS模块有XT1CLK和XT2CLK两个外部时钟源,以及VLOCLK、REFOCLK和DCOCLK(DCOCLKDIV是DCOCLK的分频输出)三个内部时钟源。其中XT1CLK、REFOCLK和XT2CLK可以作为FLLREFCLK输入到FLL单元来改变DCO的输出。所有这些时钟源经分频后都可以作为MCLK、SMCLK和ACLK输出。
下面是一个UCS设置的例子,使用32768Hz的内部时钟源REFOCLK,并通过FLL倍频使MCLK为16.384MHz。
void UCS_Init(void)
{
UCSCTL3 |= SELREF__REFOCLK; // 选取REFOCLK作为FLLREFCLK
__bis_SR_register(SCG0); // 禁止FLL
UCSCTL0 = 0x0000;
UCSCTL1 = DCORSEL_6;
UCSCTL2 = FLLD_1 + 499; // 将REFOCLK 500倍频到16.384MHz
__bic_SR_register(SCG0); // 使能FLL
UCSCTL5 |= DIVS__32; // SMCLK 32分频后输出
UCSCTL4 |= SELA__REFOCLK; // 选取REFOCLK为ACLK
do
{// 清除时钟错误标志位
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG; // 清除时钟错误中断标志
} while (SFRIFG1 & OFIFG); // 等待时钟稳定
}
2)SPI
在进行SPI接口的设置时,如果处理器作为主器件,那么一定要根据从器件的时序确定正确的时钟相位和时钟极性。如果使能了SPI的发送中断,需要注意的一点是,在发送第一个字节来启动整个发送过程时,该字节的发送不是瞬间的,需要等待一定的时间,以UCB1为例即:
UCB1TXBUF = data;
while (UCB1STAT & UCBUSY); // 等待data发送完毕
3)UART
通过串口调试助手向UART发送数据时,如果使能了接收中断,那么每接收一个字符都会触发一次中断,两次中断之间程序是会回到主程序继续执行的。如何判断接收数据的结束?一种方法是固定指令的长度,以长度来界定;另一种更常用的方法是设计一定的通信协议来针对不定长的指令,如把每个指令都封装成帧,给其加上特定的帧头、帧尾。
4)RTC
MSP430F5418的RTC在日历模式下存在BUG,直接对日期及时间寄存器赋值经常会不成功。解决的方法是读写日期和时间寄存器时使用TI公司在RTC_Workaround中给出的例程。
5)其他
设计中应尽量避免中断嵌套,中断服务程序中的代码量尽量少。
史海拾趣
|
上两次我们做过两个实验,都是让P1.0这个引脚使灯亮,我们可以设想:既然P1.0可以让灯亮,那么其它的引脚可不可以呢?看一下图1,它是8031单片机引脚的说明,在P1.0旁边有P1.1,P1.2….P1.7,它们是否都可以让灯亮呢?除了以P1开头的外,还有以P0, ...… 查看全部问答> |
|
框架结构中,使用m_wndCommandBar.Create(this)创建命令栏,但不添加Menu,ToolBar,以及关闭按钮等,这样命令栏就显示不出来,请教高人如何才能得到一个空白命令栏呢?… 查看全部问答> |
|
如题: 本人接触的是XScale 270的平台,但是当我把整个串口驱动读完之后,切没有发现串口是否是使用中断来实现的? 为什么在代码里面看不到呢?急!!!!!!!… 查看全部问答> |
|
请问各位大哥,pda能通过无线网络与pc之间进行udp通信吗?我用evc写的一个udp通信的程序,在pda上自己给自己发是可以收到的,但是给pc机发送时pc机收不到,pc机上的udp接收程序是用CB写的,不知道是不是我的程序有问题?望各位大虾指点一下,谢谢了!… 查看全部问答> |




