今天写多通道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字节对齐就可以了


运行结果如下, 变量的地址4字节对齐,变成了0x20000084,这样dma就可以正常搬运数据了



Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐