最近的项目捣鼓msp430需要用到dac转换以输出模拟信号,项目代码是接手前同事的 有些地方调试不通,以前没有接触过msp430芯片,更是没搞过这种芯片io口时序驱动层的东西,甚至纯c的都是头一次作为工作正式用。没办法 万事开头难嘛 ,硬着头皮网上到处翻资料 找芯片的手册 找dac外设的寄存器说明,功夫不负有心人 最终还是被我解决了。

记录一下解决的过程

首先对以前的代码浏览了一遍,以及对网上到处抄过去抄过来的文章有了个初步的大概套路了解。首先这是一个12位的dac外设 ,先对他进行初始化就是 设置参考电压源 设置各个寄存器 打开外设,然后12位嘛 自然是0x00~0xfff输出对应电压。就像下面这样,事先我已经确保了硬件连线是正确的,知道了DAC12_0CTL是寄存器控制位,知道了DAC12ENC是使外设工作,DAC12_0DAT是输出模拟量。

1 //不能使用内部参考电压 会影响到温度传感器
2   //ADC12CTL0 = REFON + REF2_5V;                        // 参考电压为内部2.5v
3   DAC12_0CTL = DAC12AMP_5 + DAC12IR + DAC12LSEL_0;//控制寄存器设置,自动更新数据,内基准为满量程
4   DAC12_0CTL |= DAC12SREF_2;//使用外部参考电压 外部的为3.3v
5   DAC12_0CTL |= DAC12ENC; // 启动DAC模块(DAC12LSEL_0时此句可以省,这里设置为1)
6   DAC12_0DAT = 0x0000;    //DAC初值为0,更新这个寄存器就可以更改DAC输出数据

好我们继续往下工作,然后在网上翻到了一篇芯片的中文手册  https://www.docin.com/p-301491113.html  找到了第119页关于DAC外设描述的位置,主要就是这幅图。

 

 

 

学单片机入门的时候这种框图也见识过 知道是单片机内部机制的描述 跟内部机制是对应的,自己凭这种图真正解决问题的话是头一遭。进而我观察到了自己代码跟图上有联系关系,怎么个联系法呢 ,那就是DAC12SREFX吸引了我的关注,因为代码里跟图上单词是相似的,原来代码里写的是DAC12SREF_0 ,进而我跟踪到了他的定义。

1 #define DAC12SREF_0         (0*0x2000u)  /* DAC12 reference 0: Vref+ */
2 #define DAC12SREF_1         (1*0x2000u)  /* DAC12 reference 1: Vref+ */
3 #define DAC12SREF_2         (2*0x2000u)  /* DAC12 reference 2: Veref+ */
4 #define DAC12SREF_3         (3*0x2000u)  /* DAC12 reference 3: Veref+ */

通过后面的注释以及其它网站的说明了解到Vref+是内部参考电压源 Veref+是外部参考电压源,再进而发现下面还有一个寄存器描述表,我知道事情有眉目了。

 

通过对照硬件原理图我已经事先知道了确实是使用的0号通道,也就是DAC12_0CTL,再结合上面的框图知道了第01是vref 通过框图看到也是对应的节点也是连在一起的。23是veref,我们是使用外部电压参考源那么使用2。对照框图和寄存器说明 以及注释 觉得直接使用

DAC12SREF_2应该就对了,那么我们还是来确保验证一下吧。
1 #define DAC12SREF_2         (2*0x2000u)  /* DAC12 reference 2: Veref+ */

 2*0x2000u对照上面的寄存器说明可以看到第14 和13 位是二进制的10 ,也正好契合到框图的DAC12SREFX处梯形的第三个。说明根据以前经验的推测都是正确的。由于我用的IAR工具里没法调试,于是把初始化的几个宏定义玲出来在vc++里查看了最终组合出的字节值,以及把对应的二进制位对照寄存器说明进行了一个确认。然后DAC12_0DAT进行输出 ,测试一下,大功告成,一切正常。

 

经过这一过程,感觉人真是神奇 对吧,  通过对现象规律关联思索  对现象的预测 建立假想模型  ,主观能动性加上摸索学习能力,竟然也可以解决未知的问题。