stm32f10x adc 4字节对齐问题



今天写多通道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就可以正常搬运数据了



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
查看文章 STM32 keil mdk启动代码发分析_转2010年01月29日 星期五 13:50 ;// Stack Configuration ;// Stack Size (in Bytes) ;// Stack_Size EQU 0x00000200 ;//定义堆栈大小 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0 Stack_Mem SPACE Stack_Size ;//保留Stack_Size大小的堆栈空间 分 配连续 Stack_Size 字节的存储单元并初始化为 0 __initial_sp ;//标号,代表堆栈顶部地址,后面有用 ;// Heap Configuration ;// Heap Size (in Bytes) ;// Heap_Size EQU 0x00000020 ;//定义堆空间大小 AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段,8字节对齐 __heap_base Heap_Mem SPACE Heap_Size ;//保留Heap_Size的堆空间 __heap_limit ;//标号,代表堆末尾地址,后面有用 PRESERVE8 ;//指示编译器8字节对齐 THUMB ;//指示编译器为THUMB指令 ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY ;//定义只读数据段,其实放在CODE区,位于0地址 EXTERN NMIException EXTERN HardFaultException EXTERN MemManageException EXTERN BusFaultException EXTERN UsageFaultException EXTERN SVCHandler EXTERN DebugMonitor EXTERN PendSVC EXTERN SysTickHandler ;//声明这些符号在外部定义,同C ;//在××it.c中实现这些函数 ,中断就能自动调用了 EXPORT __Vectors EXPORT __initial_sp ;EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用;I
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值