【故障现象】
12路ADC 通过DMA传输,其他全局数组定义小时,DMA数据OK,定义大时,DMA数据错乱。
【原因总结】
- ADC的数据采集偏了4位,DMA OK。
- ADC_Init()中少了一句代码 导致全局变量变大时,配置中的右对齐实际上变成了左对齐。初始化增加ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;即OK。
- 为什么全局变量变大 会引起ADC寄存器变化,全局变量和ADC寄存器都没在一个段,需要继续揣摩;
- 关于外设的结构体初始化中,一定将每个成员都赋值,否则容易引起异常问题。
因为这两个成员变量都在同一个寄存器中,未赋值的成员变量如果值乱了 会把已赋值成员变量的值覆盖掉 都是或的关系
//ADC3转换序列
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //12位模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //禁止触发检测,使用软件触发
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfConversion = 10; //10个转换在规则序列中
ADC_Init(ADC3, &ADC_InitStructure); //ADC初始化