尊敬的所有人:
我们希望实现多音调生成、在该生成中以2种不同的频率发送一定数量的脉冲、例如6个500kHz 脉冲、随后是12个1MHz 脉冲、8个500kHz 脉冲、10个1MHz 脉冲等
我们决定使用 EVM430FR6043来解决此问题、首先从应用手册 SAPH_A_ex3_pulseGenerationDMA.c 开始
我们目前使用 DMA2和 DMA3、这两种情况都是在从 E-Pulse 转换到 X 脉冲时触发的、反之亦然、以更新 USS-Module 寄存器中的值。 在我们的应用中、MSP430绝不会进入任何睡眠模式。
MSP430以16MHz (MCLK)运行、我们允许首先传输足够的脉冲、以保证 DMA 完成向寄存器的传输所需的最长时间、从而根据系列的表11-3第350页更改脉冲数量 用户指南。
假设我们希望传输以下 x 和 e 脉冲序列
uint16_t 脉冲[4]={8、10、12、14};//->频率1
uint16_t xpuls[4]={7、9、11、13};//->频率2
然后,第一个脉冲的生成量与我们指定的脉冲量完全相同,尽管我们在开始序列传输之前“预加载”了这些值。 相比之下、我们的最后两个分别重复了一次、超出了预期。
在本例中、序列为:
7个 x 脉冲、后跟8个电子脉冲、9个 x 脉冲、 10个电子脉冲、11个 x 脉冲、12个电子脉冲、 11 x 个脉冲、12个电子脉冲、13个脉冲、14个电子脉冲、13个脉冲、 14个电子脉冲。
我们假设我们实施的 DMA 传输存在问题、但根本无法发现错误。 我附上了 DMA 设置的以下代码。
如果有任何帮助、我们将不胜感激! 如果我们弄错了、MSP430FR6043无法实现此类应用、请也告知我们。
提前感谢!
uint16_t dma_chan3_config[80];
uint16_t RAM_XE[10];
unsigned int i;
无符号长整型 SAPHPGC_addr、SAPHXPGCTL_addr;
SAPHPGC_addr =(无符号长整型)(uintptr_t)(&SAPHPGC); // EPULSE
SAPHXPGCTL_addr =(无符号长整型)(uintptr_t)(&SAPHXPGCTL);// XPULSE、XMOD、ETY
DMACTL1 = DMA2TSEL_27|DMA3TSEL_27;
dma_initParam dmaParam ={0};
dmaParam.channelSelect = dma_channel_2; //选择具有 PPG 触发器的通道
dmaParam.transferModeSelect = dma_transfer_repersed_single;// DMAEN 保持启用状态,每个都会触发一个块块大小
dma_init (&dmaParam);
// XPULSE,EPULSE 预设
dma_setSrcAddress (dma_channel_2、(uint32_t)(uintptr_t)&RAM_XE、dma_direction 不变);
dma_setDstAddress (dma_channel_2、(uint32_t)(uintptr_t)&SAPHXPGCTL、dma_direction 不变);
DMA_setTransferSize (DMA_CHANGE_2、1); //每个块1个寄存器(字)
dma_enableTransfers (dma_channel_2);
//编写 DMA2的新 SA 和 DA
//对于正确功能至关重要- DMA 缓冲临时变量中的新 SA、DA -地址需要提前一轮可用
dma_setSrcAddress (dma_channel_2、(uint32_t)(uintptr_t) RAM_XE+1、dma_Directoration_Increment);
dma_setDstAddress (dma_channel_2、(uint32_t)(uintptr_t)&SAPHPGC、dma_direction 不变);
//重复块传输,增加 src 地址和 dst 地址
dmaParam.channelSelect = dma_channel_3;
dmaParam.transferModeSelect = dma_transfer_ere重复 块;
dma_init (&dmaParam);
// X 脉冲
dma_setSrcAddress (dma_channel_3、(uint32_t)(uintptr_t)&dma_chan3_config、dma_direction、增量);
dma_setDstAddress (dma_channel_3、(uint32_t)(uintptr_t)&DMA2SA、dma_direction 递增);
DMA_setTransferSize (DMA_CHANGE_3、9); //每个块9寄存器
dma_enableTransfers (dma_channel_3);
//设置 RAM
//将 RAM 传输到 DMA2和 DMA3
对于(I = 0;I < 7;I++)
{
*(dma_chan3_config+i*9) =(unsigned int)(unsigned long)(uintptr_t)(RAM_XE + I + 2)); // DMA2SA
*(dma_chan3_config+1+i*9)=(unsigned int)((unsigned long)(uintptr_t)(RAM_XE + I + 2))>>16); // DMA2SAH
如果(I % 2 = 0){
*(dma_chan3_config + 2 + i*9)=(unsigned int)(SAPHXPGCTL_addr); // DMA2DA 低位 von SAPHPGC (0x0E40)-> EPULS;
}否则{
*(dma_chan3_config + 2 + i*9)=(unsigned int)(SAPHPGC_addr); // DMA2DA 低位 von SAPHXPGCTL (0x0E4A)-> XPULS;
}
*(dma_chan3_config+3+i*9)= 0x0000; // DMA2DAH
*(dma_chan3_config+4+i*9)= 0x0001; // DMA2SZ
*(dma_chan3_config+5+i*9)= 0x0000; // dummy -请参阅数据表 DMA2SZ 和 DMA3CTL 之间的3个字
*(dma_chan3_config+6+i*9)= 0x0000; //虚拟
*(dma_chan3_config+7+i*9)= 0x5000|DMASRCINCR|DMADSTINCR|DMAEN; // DMA3CTL
*(dma_chan3_config+8+i*9)=(unsigned int)(unsigned long)(uintptr_t)(dma_chan3_config +(i + 1)* 9); // DMA3SA
}
//set XMOD_2 in last cycle
对于(i = 0;i < 4;i++){//4
if (i ==3){ //最后的循环迭代
*(RAM_XE + 0 + I*2)= 0x6000; // X_MOD 2、XPULSE
*(RAM_XE + 1 + I*2)= 0x0000; // EPULSE
}否则{
*(RAM_XE + 0 + I*2)= xpuls[i+1]| 0x7000; // X_MOD 3、XPULSE
*(RAM_XE + 1 + I*2)=脉冲[I+1]; // EPULSE
}
}
DMACTL1 = DMA2TSEL_27|DMA3TSEL_27; //--似乎可以清除 DMATRIIG27--再次设置它
}