【故障现象】
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初始化





文章讲述了在12路ADC通过DMA传输数据时遇到的问题,当全局变量定义较大时,DMA数据出现错乱。原因是ADC初始化缺少关键代码,导致数据对齐方式错误。添加ADC_ExternalTrigConv_T1_CC1初始化后问题解决。作者提醒在初始化外设结构体时应确保所有成员都被赋值,以防未赋值的成员覆盖已赋值的成员,因为它们可能在同一寄存器中。

2417

被折叠的 条评论
为什么被折叠?



