我花了太多的时间敲我的头,需要从一个直接的问题得到一个直接的答案。 我的目标是从运行在向上计数模式下的定时器 tb0触发转换、以比较寄存器中的速率翻转、ADC 结果进入 ADD 存储器寄存器0、然后通过 DMA 传输到缓冲器。 我已经使用软件触发的转换连续测试了 A/D。 现在、我已经尽可能地设置了计时器、添加和 DMA。 以下是初始化代码:
//设置在计时器和上触发的单通道转换
//数据发送到 FRAM 缓冲区。
setPortField (ADC12CTL0、1、0); //禁用 ADC
setPortField (ADC12CTL0、4、1); //打开 ADC
setPortField (ADC12CTL0、15、12、0);// ADC12SHT1x 4个时钟
setPortField (ADC12CTL0、11、8、0); // ADC12SHT0x 4个时钟
setPortField (ADC12CTL1、12、10、2); //采样/保持触发源2选择、TB0、CCR0
setPortField (ADC12CTL1、9、1); // ADC12SHP 脉冲模式
setPortField (ADC12CTL1、4、3、0b11); //时钟源= SMCLK
setPortField (ADC12CTL1、2、1、0); // ADC12CONSEQx ->单 通道、单次转换
setPortField (ADC12CTL3、4、0、0); //转换结果为 mem 0
setPortField (ADC12MCTL0、4、0、5); //为通道中的测量值0选择 A5、P1.5单端
//设置定时器 TB0
setPortField (TB0CTL、9、8、0B10); //选择 SMCLK
setPortField (TB0CCTL0、8、0); // CAP = 0、比较模式
常量浮点频率= 100e3; // 200kHz
const float CLK = 16e6; //计时器时钟
浮点周期寄存器=(CLK/FREQ)- 1;
TB0CCR0 =(周期寄存器+ 0.5);
setPortField (TB0CTL、2、1); //清除计时器
//配置 p1.5,输入的模拟输入,没有上拉电阻
setPortField (P1DIR、5、5、0); //输入
setPortField (P1REN、5、5、0); //上拉或下拉被禁用
//设置 DMA,默认情况下,字传输,边沿触发
setPortField (DMACTL0、4、0、26); // DMA 通道0、触发26 (ADC EOC)
setPortField (DMA0CTL、14、12、0); //单次传输
setPortField (DMA0CTL、11、10、3); //目标地址递增
setPortField (DMA0CTL、9、8、0); //源地址不变
setPortField (DMA0CTL、7、7、0); //字目的
setPortField (DMA0CTL、6、0); //字源
DMA0DA =(_SFR_FARPTR)(unsigned long) bigArray; //起始目标地址
DMA0SA =(_SFR_FARPTR)(无符号长整型)&ADC12MEM0; //当前 ADC 结果的地址
DMA0SZ = array_size; //块大小
setPortField (DMACTL4、2、0、0b001);
setPortField 是我编写的函数、用于将第四个参数值写入由参数2至3指定的字段中、并写入由第一个参数指定的位置。 通过广泛的测试和调试、我知道该函数工作正常。
当我运行程序时、我可以看到计时器正在调试器中运行、并且计时器中断标志正在设置 我不太理解的是将 A/D 触发器与计时器达到比较寄存器设置的机制。 我可以从相应的 msp30用户和数据表手册中看出、根据文档、a/d 采样保持源应设置为源2、TB0、CCR0。
以下代码启动正在进行的操作、并在填充缓冲区后循环等待 DAM 中断。
setPortField (ADC12CTL0、1、1); //启用 ADC
setPortField (DMA0CTL、4、4、1); //启用 DMA
setPortField (TB0CTL、5、4、1); //启动 ADC 触发计时器
//进行测试
//等待 DMA 突发完成
volatile unsigned int dmaFlags = DMAIV;
while (dmaFlags =0)
{
dmaFlags = DMAIV;
}
循环永远不会退出、因此我暂停调试器以查看寄存器值。 我看到没有迹象表明 A/D 曾经触发过。
我缺少什么、 这是什么?