历史上的今天
今天是:2025年03月09日(星期日)
2020年03月09日 | 学习MSP430G2553总结
2020-03-09 来源:eefocus
个人感觉TI做的这块430就是一坨屎,内部时钟根本不稳,而且连datesheet都没有,但作为比赛指定的东西我们还是学了,这个连51都不如的16位单片机费了我四天时间把内部的模块给调了一遍,但是我调IIC时一直调不出来连时钟都没有,估计是做这块垃圾是连这个模块都没有吧,而且还写的那么复杂,连份像样的技术文档都没有,看的是别的技术文档,真是蛋疼无比,好了牢骚就发这么多,下面开始讲讲这块片子。
首先介绍下MSP430G2553的时钟,这块芯片的时钟源是四个,时钟线是4个;时钟源我们就不说了,一般都是默认的选择内部的DCO作为时钟源,然后通过一系列的嫁接到MCLK SMCLK上,至于为什么这块芯片上不用锁相环的问题我深表不解,这个解释看来只有TI知道,是要低功耗呢,还是因为成本呢?建议大家以后学就学M3内核的STM32吧,低功耗而成本低还很稳。
至于MSP430的时钟寄存器的配置呢,看看内部的时钟图后我们就理解,其实只要配置两个寄存器DCOCTL BCSCTL1
这两个配置的值我还是在一份不知道什么时候的文档里面找到的,DCOCTL中的7-5位是频率选择,后面5位是调节器;BCSCTL1的低4位是频率范围的选择。下面贴出来时钟的配置贴图,如图1

图1 时钟选择图
这块芯片上的时钟你只能配置4M左右,大了都不稳,时钟的信号就是正弦了,你可以通过P1.4脚配置成时钟观察。
时钟介绍结束。
下面说说这块芯片的IO功能,这块芯片管脚只有20个,但是为了实现复杂的功能,所以这块芯片有芯片引脚功能选择寄存器(以P1口为例,P2是一样的,只是里面的P1改为P2),P1SEL P1SEL2;和其他芯片一样这块也有芯片的方向寄存器P1DIR,输入寄存器P1IN,输出寄存器P1OUT,上拉下拉使能寄存器P1REN,寄存器就这些,但是要注意的是输出寄存器P1OUT,这个寄存器在管脚配置成输入时是用于选择上拉下拉电阻的极性的。下面介绍功能:
P1DIR :每位对应一个管脚
0 输入
1 输出
P1OUT : 每位对应一个管脚
0 输出低电平 下拉
1 输出高电平 上拉
注意:这里的上拉下拉功能,如果你设置成输出,记住千万要关闭上拉下拉使能寄存器,因为资料明确说在P1REN使能时,P1OUT为上拉下拉极性选择,并没有说这些在选择输出时无效,千万要注意噢。
P1IN :每位对应一个管脚
0 输入时低电平
1 输入为高电平
注意:这个管脚在输出的时候然后反应管脚的IO电平,这个我测试过,而且这个寄存器的写时是会增加电流消耗的。
P1REN :每位对应一个管脚
0 禁用
1 使能
P1SEL P1SEL2的功能选择如图2.
图2
注意:这些里面的选择一定要正确,不然是出不来想要的结果的。
下面介绍串口,因为串口是经常使用的,所以调试串口是很重要的,MSP430这块芯片把spi uart集成一块了,命名曰USCI,虽然我不知道为什么,但我感觉真是很不舒服。对于这个所谓的USCI模块我要说说的是它里面说有B模块,但我们都没有调出来,估计是TI没做这个,也就是说只有A,所以你要是使用uart 就不能再使用spi了,呵呵,也就是调试方法也要改一改了。前面是闲话,下面不介绍寄存器,然后贴出来,uart的程序。
void uart_init(void)
{
UCA0CTL1_bit.UCSWRST = 1;/*禁止*/
P1DIR_bit.P1 = 0;/*配置接受管脚为输入,上拉*/
P1OUT_bit.P1 = 1;
P1REN_bit.P1 = 1;
P1SEL_bit.P1 = 1;/*配置为第二功能*/
P1SEL2_bit.P1 = 1;
P1DIR_bit.P2 = 1;/*配置发送管脚为输出*/
P1SEL_bit.P2 = 1;/* 配置为第二功能*/
P1SEL2_bit.P2 = 1;
UCA0CTL1_bit.UCSSEL0 = 1;/*选择时钟为SMCLK*/
UCA0CTL1_bit.UCSSEL1 = 1;
/* 波特率为9600*/
/* UCABR=BRCLK/baud*/
UCA0BR0 = 114;
UCA0BR1 = 0;
UCA0CTL1_bit.UCSWRST = 0;/*复位*/
return;
}
这段是初始化代码。
注意:在文档里面说明了初始化时必须先把UCA0CTL1的UCSWRST位置位,这个是为什么呢?原来是UCSWRST这个位是初始化和复位的,这个时候uart是不工作的,所以我们可以认为我们在操作这个模块时需要控制寄存器失效,所以这个时候写入控制寄存器是安全的,不会出现乱码什么的!
void uart_write(unsigned char uart_w_date)
{
/*发送数据,并等待发送完成*/
UCA0TXBUF = uart_w_date;
//while(UCA0STAT_bit.UCBUSY);
}
这段是写代码。
如果你写代码时下面的那个语句不屏蔽的话,那么程序也会运行。这就是为什么我没删掉的原因,嘿嘿,见谅,但是最好还是不用的好,因为在调试其他代码是它在这条语句上死循环过。
void uart_read(unsigned char *uart_r_date)
{
/*接受完成,并接受数据*/
while(UCA0STAT_bit.UCBUSY);
*uart_r_date = UCA0RXBUF;
}
这段是读代码。
首先判断下UART的设备是否忙碌,如果忙碌说明这个设备在执行读或者写,这时的读写是错误的,所以要等待下。当然这时因为我是在扫描查询来的,如果是中断就可以不用了,对了这里提一下,上面的初始化没有初始化接受中断,代码在下面
/*
* 中断的方式接受初始化
*/
void uart_enable_interrupt(void)
{
/*接受中断使能*/
IE2_bit.UCA0RXIE = 1;
/*接收中断标志清零*/
IFG2_bit.UCA0RXIFG = 0;
}
这是中断使能代码。
uart很简单,就不多介绍了,上面的程序是验证过的。
下面介绍下定时,也就是传说中的timer模块,在这块芯片中由于感觉资料不对,所以内部的就不说了,直接说说自己的理解,如果觉得有理大家就这样理解,如果感觉没道理,希望大家多多指教。
这个模块的基础构成是定时器单元也就是计数单元,然后才是输入捕捉,输出比较;既然定时器计数单元是基础,那就先说这个单元,定时器单元首先要有时钟了,时钟可以配置的,所以就有个寄存器的某些位是做这个工作的, 这就是TA0CTL中的TASSEL0 TASSEL1 ,时钟的分频也是在这个寄存器中,分频比是是由ID0 ID1决定的,时钟确定后就要记时钟的数了,但是计数是数值加一还是减一呢,这是由这个寄存器的MC0 MC1决定的;然后时钟数对应着时间了,所以就是定时器了;计数的数值也是存储在寄存器中,这个寄存器就是TA寄存器,这是个16位的寄存器,这就是基础单元------计数单元,剩下的工作都是在这个单元上建立的。
首先是定时单元,这个功能就是比较CCR0的数值和TA的数值,如果相等了,说明定时时间到了,TAIFG就会置位的,如果中断使能了,就发生中断。
然后是输出比较,这个主要是产生PWM波了,产生PWM波是通过CCR0,CCRx设定的,这个模块和计数的方向有关的,具体和计数模式有关;增模式时,如图3.连续模式如图4.up/down模式如图5.

图3 增模式

图4 连续模式

图 5 up/down模式
这些功能是通过寄存器TACCTLx中的CAP位决定的。
史海拾趣
|
我一直都喜欢设置开发板,对开发板也情有独钟,到现在一个设置了两款开发板,第一款是LPC2418的,这一块是AVR mega64/128的。这一块主要是围绕多DS18B20温度采集系统进行的,下面说说它的亮点: 1. 单总线8路DS18B20,8个温度传感器 ...… 查看全部问答> |
|
我在windows 7中用filedisk mount了一个drive Z: 当我点击computer,浏览Drive C:时,想要umount drive Z:, 却发现返回error:Access is denied 我查看源代码后发现是DeviceIOControl()在发送FSCTL_LOCK_VOLUME 这个request时,访问被拒绝了 ...… 查看全部问答> |
|
我想用ActiveSync通过usb把wince和PC相连,不知道需要加哪些组件,需要什么设置。应该是需要usb function吧,是用usb-rndis,还是usb-serial,能不能具体说明一下,谢谢… 查看全部问答> |
|
头给了我一个,要我自己学会玩先可是我不知道怎么加外设,那个图上4个红筐要用什么东西接到外设的板上啊,一般外设板用什么东西做?万能板?它和万能板怎么接啊… 查看全部问答> |
|
查看了很多关于STM32 FSMC连接TFT LCD (ILI9320)的讨论,还是困惑中。。。 我用GPIO方式已经可以正确的驱动LCD了,但FSMC方式一直不成功,所以请教各位。 下面是我的程序: #define FSMC_BCR1   ...… 查看全部问答> |
|
void Timbase(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; &n ...… 查看全部问答> |
|
【信号处理】:经典资料《数字信号处理的FPGA实现》中英版本等 最近恰好在研究数字信号处理的FPGA实现问题,搜集了几本实用的书籍: 《数字信号处理的FPGA实现》及其所附带光盘的vhdl、verilog代码,挺有用的 大家可以看看,还有无线通信FPGA设计 田耕等编著的《无线通信FPGA设计 》及其matlab和verilog代码XILI ...… 查看全部问答> |
|
为避免锁存器,可以在ALWAYS块中对变量预先进行无条件默认赋值,如下: 这是比较简单避免锁存器的方法,个人觉得即使默认赋值了也应该在判断语句中写全变量。 &nbs ...… 查看全部问答> |




