
STM32定时器触发AD采样+DMA传输问题.docx
9页STM32定时器触发AD采样+DMA传输问题试验环境:EWARM 4.41A + J-link +目标板试验内容:TIM1->CC1触发ADC采样,单通道,采样结果使用DMA传输到SRAM中问 题:下载程序提示SRAM校验错误,拔下J-link 一端的USB 口再插上,下载OK --->停止程序, 再下载,提示错误,再拔下J-link USB 口,再下载,OK--->…如此反复仔细看了下Debuglog,发现存放DMA传输到的目标内存数据校验错误(IAR debugger选项中的verify download选上),如下:Verify error at address 0x2000007C, target byte: 0x3F, byte in file: 0x01分析:可能是停止程序的时候,TIM1和ADCQMA都没有停下来,下载的时候,DMA 一直写数据到 开辟的内存中,导致那部分内存数据校验错误以上只是个人的一些看法,不知道不否正确,有没有哪位帮分析下片*****************************************************************************/附录1:试验程序源码:/* Includes */#include "stm32f10x_lib.h"/* Private typedef *//* Private define */#define ADC1_DR_Address ((u32)0x4001244C)/* Private macro *//* Private variables */ADC_lnitTypeDef ADC_lnitStructure;DMA_lnitTypeDef DMA_InitStructure;TIM1_TimeBaseInitTypeDef TIM1_TimeBaseStructure;TIM1_OCInitTypeDef TIM1_OCInitStructure;TIM1_BDTRInitTypeDef TIM1_BDTRInitStructure;u16 ADC_RegularConvertedValueTab[32];ErrorStatus HSEStartUpStatus;/* Private function prototypes */void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);/* Private functions *//******************************************************************************** Function Name : main* Description : Main program* Input : None* Output : None* Return : None****************************************************************************** int main(void){#ifdef DEBUG debug();#endif/* System clocks configuration */RCC_Configuration();/* NVIC configuration */NVIC_Configuration();/* GPIO configuration */GPIO_Configuration();TIM1_Delnit();/* Time Base configuration */TIM1_TimeBaseStructure.TIM1_Prescaler = 0x00;TIM1_TimeBaseStructure.TIM1_CounterMode = TIM1_CounterMode_Up;TIM1_TimeBaseStructure.TIM1_Period = 3599;TIM1_TimeBaseStructure.TIM1_ClockDivision = 0x00;TIM1_TimeBaseStructure.TIM1_RepetitionCounter = 0x00;TIM1_TimeBaseInit(&TIM1_TimeBaseStructure);/* Channell Configuration in PWM mode */TIM1_OCInitStructure.TIM1_OCMode = TIM1_OCMode_PWM1;TIM1_OCInitStructure.TIM1OutputState = TIM1_OutputState_Enable;TIM1_OCInitStructure.TIM1_OutputNState = TIM1_OutputNState_Enable;TIM1_OCInitStructure.TIM1_Pulse = 100;TIM1_OCInitStructure.TIM1_OCPolarity = TIM1_OCPolarity_Low;TIM1_OCInitStructure.TIM1_OCNPolarity = TIM1_OCNPolarity_High;TIM1_OCInitStructure.TIM1_OCIdleState = TIM1_OCIdleState_Set;TIM1_OCInitStructure.TIM1_OCNIdleState = TIM1_OCIdleState_Reset;TIM1_OC1Init (&TIM1_OCInitStructure); /* TIM1 main Output Enable */ TIM1_CtrlPWMOutputs(ENABLE);/* TIM1 counter enable */TIM1_Cmd(ENABLE);/* DMA Channell Configuration */DMA_DeInit(DMA_Channel1);DMA_lnitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;DMA_lnitStructure.DMA_MemoryBaseAddr = (u32)&ADC_RegularConvertedValueTab;DMA_lnitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_lnitStructure.DMA_BufferSize = 32;DMA_lnitStructure.DMA_Peripherallnc = DMA_PeripheralInc_Disable;DMA_lnitStructure.DMA_Memorylnc = DMA_MemoryInc_Enable;DMA_lnitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_lnitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_lnitStructure.DMA_Mode = DMA_Mode_Circular;DMA_lnitStructure.DMA_Priority = DMA_Priority_VeryHi gh;DMA_lnitStructure.DMA_M2M = DMA_M2M_Disable;DMA_lnit(DMA_Channel1, & DMA_lnitStructure);/* Enable DMA channel */DMA_Cmd(DMA_Channel1, ENABLE);/* ADC1 configuration */ADC_lnitStructure.ADC_Mode = ADC_Mode_lndependent;ADC_lnitStructure.ADC_ScanConvMode = DlSABLE;ADC_lnitStructure.ADC_ContinuousConvMode = DlSABLE;ADC_lnitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;ADC_lnitStructure.ADC_DataAlign = ADC_DataAlign_Ri ght;ADC_lnitStructure.ADC_NbrOfChannel = 1;ADC_lnit(ADC1, & ADC_lnitStructure);/* ADC1 regular channel14 configuration */ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);/* Enable ADC1 DMA */ADC_DMACmd(ADC1, ENABLE);/* Enable ADC1 external trigger */ADC_ExternalTrigConvCmd(ADC1, ENABLE);/* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);/* TlM1 counter enable *///TIM1_Cmd(ENABLE);/* Test on channell transfer complete flag */ while(!DMA_GetFlagStatus(DMA_FLAG_TC1));/* Clear channell transfer complete flag */DMA_ClearFlag(DMA_FLAG_TC1);/* TlM1 counter disable *///TlM1_Cmd(DlSABLE);while (1){}}/******************************************************************************** Function Name : RCC_Configuration* Description : Configures the different system clocks.* lnput : None* Output : None* Return : None*********************************************************************** / void RCC_Configuration(void){/* RCC system reset(for debug purpose) */RCC_Delnit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){/* Enable Prefetch Buffer 。
