大家好、
IM 使用 ADC 转换圆中的所有16个通道。 如果我的程序可以在需要时使用它、DMA 会将结果以圆的方式复制到 FRAM 中的16个连续16位寄存器。
这种情况运行良好、但不是100%。 有时、soming (ADC 或 DMA)会停止工作。 我的客户看到的是、价值保持不变。
供参考:我将 TEST-Pin 保持断开状态。 问题很少出现。 我无法重现错误。 我阅读勘误表修订版 U
希望您能帮助我重现错误并解决问题。
勘误表旁边是否存在 DMA 的已知问题?
如果我漏掉了一个字、我将尝试向您提供我能提供的任何信息。
此致
Jannes
main.c
//***** 时钟配置 //配置 ACLK = SMCLK = MCLK =~24MHz CSCTL0_H = 0xA5;//写入密码以启用寄存器访问 CSCTL1 |= DCORSEL + DCOFSEL0 + DCOFSEL1;//设置最大值 DCO 设置 MSP430_ADC_init (); MSP430_ADC_START (); while (1){ }
ADC.c /* 在 ADC-Trigger 上初始化 DMA * DMA 监视 ADC10IFG 寄存器在位0处的上升沿。 *在每个上升沿、它会将当前的 ADC-Result 从 ADC10MEM0传输到以数组索引15开头的 ADC_Result 数组 *每次传输后、目标数组的索引将会减少、以便我们在 16次传输后用值*每行填充结果数组行 索引被复位为15、16个新值将被写入结果数组 *从位置&ADC_RESULSE[15]开始、并在传输到位置&ADC_RESULSE[0]后重新启动 * / void MSP430_DMA_INIT (void){ //配置 DMA0 (ADC10IFG 触发器) DMACTL0 = DMA0TSEL_ADC10IFG;// ADC10IFG 触发 器__data16_write_addr ((无符号短整型)&DMA0SA、(无符号长整型)&ADC10MEM0);//源单地址 __data16_write_addr ((无符号短整型)无符号 DMA0DA、(long)&ADC_Result [15]);//目标数组 地址= DMA0Z // 16次转换 DMA0CTL |= DMADD_4;//重复单次传输 DMA0CTL |= DMASRCINCR_0;//源地址不变 DMA0CTL |= DMADSTINCR_2;//目标地址递减(nächstes 数组元素) DMA0CTL &&~DMADSTBYTE; // DMA destination 是一个字 DMA0CTL &&~DMASRCBYTE; // DMA 源是一个字 DMA0CTL &=~DMALEVEL; //上升沿敏感 DMA0CTL |= DMAEN;//启用 DMA0 } // *使用2.0V 基准电压和10位分辨率初始化 ADC *为 ADC 输入配置 VHI/VRX 引脚 * ADC 在 MODCLK 的第一个上升沿之后开始第一次转换, 然后、它将连续测量 * ADC 将测量一个序列中的所有 ADC 通道、完成一个序列后、它将重新启动。 *一次转换的采样保持时间为 MODCLK 的96个时钟周期 * *使用对齐的 µC 值计算斜率和偏移温度值 * // void MSP430_ADC_init (void){ MSP430_DMA_init ();//初始化 DMA ADC_PxSEL0 |= ADC_VHI_Pin + ADC_VRX_Pin;//为 ADC 输入 ADC_PxSEL1配置引脚|= ADC_VHI_Pin + ADC_VRX_Pin;//为 ADC 输入 ADC10CTL0 &=~ADC10ENC 配置引脚;//禁用 ADC10 while (REFCTL0 & REFGENBUSY);//等待参考生成器正忙 REFCTL0 |= REFVSEL_1 + REFON;//将参考电压设置为2.0V 并启用参考模块 // ADC10MCTL0 = ADC10SREF_1 + ADC10INCH_15; //将 ADC 基准设置为 RefGenerator 并将通道15设置为最后转换的通道 ADC10CTL0 = ADC10SHT_5 + ADC10MSC + ADC10ON;// 96个 ADCclks 采样保持时间、第一个上升沿之后的多个采样和转换、启用 ADC10 ADC10CTL1 = ADC10SHP + ADC10SSEL_0 +ADC10CONSEQ_3; //采样和脉冲模式、选择 MODCLK、重复通道序列 ADC10CTL2 |= ADC10RES;//将转换分辨率设置为10位 } //* 仅启动 ADC 转换 */ void MSP430_ADC_start (void){ while (ADC10CTL1 & BUSY); //等待 ADC10内核处于活动状态 ADC10CTL0 |= ADC10ENC + ADC10SC; //采样和转换开始 }