今天写多通道adc,通过dma搬运数据,遇到一个大坑问题 在次记录
这是我写的代码
uint16_t BendingSensoValue[12] = {0};
uint16_t fifterad[MAX_AD_NUM/2][FIFTER_BOX_SIZ]={0};
uint16_t Bendingfifter[MAX_AD_NUM/2] = {0};
uint16_t *fifter(void)
{
u8 i = 0;
int32_t temp1=0,temp2=0,temp3=0,temp4=0,temp5=0;
static u8 filter_cnt = 0;
fifterad[i++][filter_cnt] = BendingSensoValue[0];
fifterad[i++][filter_cnt] = BendingSensoValue[2];
fifterad[i++][filter_cnt] = BendingSensoValue[4];
fifterad[i++][filter_cnt] = BendingSensoValue[6];
fifterad[i++][filter_cnt] = BendingSensoValue[8];
for(i=0;i<FIFTER_BOX_SIZ;i++)
{
temp1 += fifterad[0][i];
temp2 += fifterad[1][i];
temp3 += fifterad[2][i];
temp4 += fifterad[3][i];
temp5 += fifterad[4][i];
}
Bendingfifter[0] = temp1 / FIFTER_BOX_SIZ;
Bendingfifter[1] = temp2 / FIFTER_BOX_SIZ;
Bendingfifter[2] = temp3 / FIFTER_BOX_SIZ;
Bendingfifter[3] = temp4 / FIFTER_BOX_SIZ;
Bendingfifter[4] = temp5 / FIFTER_BOX_SIZ;
filter_cnt++;
if(filter_cnt == FIFTER_BOX_SIZ) filter_cnt=0;
return Bendingfifter;
}
void BendingSensorInit(void)
{
MyADC_Init();
DMA_ConfigInitCmd(RCC_AHBPeriph_DMA1,DMA1_Channel1,(u32)&ADC1->DR,(u32)&BendingSensoValue,5);
}
运行结果 我通过jink查看变量如下
这边数据按理来说应该是从数组0下标开始存入数据,但是我这边是从下标1开始存入数据,然后我去变量的地址0x20000082看了下
发现变量地址是从0x2000082开始,但是adc存入数据是从0x20000080开始的,也就是dma存入数据是有经过4字节对齐的。
只要在变量前面加一个
__align(4) uint16_t BendingSensoValue[12] = {0};
运行结果如下, 变量的地址4字节对齐,变成了0x20000084,这样dma就可以正常搬运数据了