你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 6828|回复: 5

ADC+DMA

[复制链接]

1

主题

33

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2009-8-10 17:15:03 | 显示全部楼层 |阅读模式
试验环境:EWARM 4.42A + 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和ADC,DMA都没有停下来,下载的时候,DMA一直写数据到开辟的内存中,导致那部分内存数据校验错误。
以上只是个人的一些看法,不知道不否正确,有没有哪位帮分析下。

 
/******************************************************************************/
附录1:试验程序源码:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define ADC1_DR_Address ((u32)0x4001244C)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef 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_DeInit();
/* 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);
/* Channel1 Configuration in PWM mode */
TIM1_OCInitStructure.TIM1_OCMode = TIM1_OCMode_PWM1;
TIM1_OCInitStructure.TIM1_OutputState = 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 Channel1 Configuration ----------------------------------------------*/
DMA_DeInit(DMA_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_RegularConvertedValueTab;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 32;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA_Channel1, &DMA_InitStructure);
/* Enable DMA channel1 */
DMA_Cmd(DMA_Channel1, ENABLE);
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* 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);
/* TIM1 counter enable */
//TIM1_Cmd(ENABLE);

/* Test on channel1 transfer complete flag */
while(!DMA_GetFlagStatus(DMA_FLAG_TC1));
/* Clear channel1 transfer complete flag */
DMA_ClearFlag(DMA_FLAG_TC1);
/* TIM1 counter disable */
//TIM1_Cmd(DISABLE);
while (1)
{
}
}
/*******************************************************************************
* Function Name : RCC_Configuration
* Description : Configures the different system clocks.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);

/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* ADCCLK = PCLK2/4 */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);

/* PLLCLK = 8MHz * 7 = 56 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}

/* Enable peripheral clocks --------------------------------------------------*/
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);
/* Enable GPIOA, GPIOC, ADC1 and TIM1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC |
RCC_APB2Periph_ADC1 | RCC_APB2Periph_TIM1, ENABLE);
}
/*******************************************************************************
* Function Name : GPIO_Configuration
* Description : Configures the different GPIO ports.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure PC.01 and PC.04 (ADC Channel11 and Channel14) as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/*******************************************************************************
* Function Name : NVIC_Configuration
* Description : Configures NVIC and Vector Table base location.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}

/******************************************************************************/

附录2:Debug Log
Thu Jan 03 20:00:46 2008: DLL version: V3.62a, compiled Feb 23 2007 17:06:09
Thu Jan 03 20:00:46 2008: Firmware: J-Link compiled Jun 14 2007 14:36:33 ARM Rev.5
Thu Jan 03 20:00:46 2008: JTAG speed is initially set to: 32 kHz
Thu Jan 03 20:00:46 2008: Found Cortex-M3, Little endian.
Thu Jan 03 20:00:46 2008: TPIU fitted.
Thu Jan 03 20:00:46 2008: FPUnit: 6 code (BP) slots and 2 literal slots
Thu Jan 03 20:00:46 2008: Software reset was performed
Thu Jan 03 20:00:46 2008: Initial reset was performed
Thu Jan 03 20:00:46 2008: J-Link found 2 JTAG devices. ARM core Id: 3BA00477(Cortex M3), ARM core Id: 00000000(ARM9)
Thu Jan 03 20:00:46 2008: Device at TAP0 selected
Thu Jan 03 20:00:47 2008: 3080 bytes downloaded and verified (5.20 Kbytes/sec)
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000007C, target byte: 0x42, byte in file: 0x01
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000007D, target byte: 0x08, byte in file: 0x80
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000007E, target byte: 0xCE, byte in file: 0x70
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000007F, target byte: 0x07, byte in file: 0x47
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000080, target byte: 0x42, byte in file: 0x50
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000081, target byte: 0x08, byte in file: 0xF0
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000082, target byte: 0xCF, byte in file: 0x00
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000083, target byte: 0x07, byte in file: 0x60
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000084, target byte: 0x43, byte in file: 0x81
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000085, target byte: 0x08, byte in file: 0x05
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000086, target byte: 0xCE, byte in file: 0x02
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000087, target byte: 0x07, byte in file: 0xD0
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000088, target byte: 0x42, byte in file: 0x5F
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000089, target byte: 0x08, byte in file: 0xF0
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000008A, target byte: 0xCE, byte in file: 0xFF
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000008B, target byte: 0x07, byte in file: 0x30
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000008C, target byte: 0x42, byte in file: 0x70
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000008D, target byte: 0x08, byte in file: 0x47
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000008E, target byte: 0xCF, byte in file: 0x2E
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000008F, target byte: 0x07, byte in file: 0x49
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000090, target byte: 0x41, byte in file: 0x0A
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000091, target byte: 0x08, byte in file: 0x68
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000092, target byte: 0xCE, byte in file: 0xD2
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000094, target byte: 0x41, byte in file: 0xFB
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000095, target byte: 0x08, byte in file: 0xD4
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000096, target byte: 0xCB, byte in file: 0x2D
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000097, target byte: 0x07, byte in file: 0x4A
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000098, target byte: 0x42, byte in file: 0x13
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000099, target byte: 0x08, byte in file: 0x68
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000009A, target byte: 0xCD, byte in file: 0x53
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000009B, target byte: 0x07, byte in file: 0xF0
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000005C, target byte: 0x40, byte in file: 0x15
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000005D, target byte: 0x08, byte in file: 0x00
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000005E, target byte: 0xC8, byte in file: 0x00
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000005F, target byte: 0x07, byte in file: 0x20
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000060, target byte: 0x3E, byte in file: 0x03
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000061, target byte: 0x08, byte in file: 0x4C
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000062, target byte: 0xD3, byte in file: 0x4F
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000063, target byte: 0x07, byte in file: 0xF0
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000064, target byte: 0x49, byte in file: 0x00
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000065, target byte: 0x08, byte in file: 0x00
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000066, target byte: 0xD2, byte in file: 0xA0
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000067, target byte: 0x07, byte in file: 0x47
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000068, target byte: 0x45, byte in file: 0x02
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000069, target byte: 0x08, byte in file: 0x4C
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000006A, target byte: 0xD1, byte in file: 0x03
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000006B, target byte: 0x07, byte in file: 0x4D
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000006C, target byte: 0x42, byte in file: 0xAE
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000006D, target byte: 0x08, byte in file: 0x46
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000006E, target byte: 0xCE, byte in file: 0x20
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000006F, target byte: 0x07, byte in file: 0x47
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000070, target byte: 0x41, byte in file: 0xC1
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000071, target byte: 0x08, byte in file: 0x05
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000072, target byte: 0xCA, byte in file: 0x00
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000073, target byte: 0x07, byte in file: 0x20
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000074, target byte: 0x40, byte in file: 0xC9
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000075, target byte: 0x08, byte in file: 0x06
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000076, target byte: 0xC9, byte in file: 0x00
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000077, target byte: 0x07, byte in file: 0x20
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x20000078, target byte: 0x3B, byte in file: 0x9D
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000007A, target byte: 0xD1, byte in file: 0x00
Thu Jan 03 20:00:47 2008: Warning:
Verify error at address 0x2000007B, target byte: 0x07, byte in file: 0x20
Thu Jan 03 20:00:47 2008: There were warnings during download of FLASH loader, see Log Window
Thu Jan 03 20:00:48 2008: Failed to load flash loader: C:\Program Files\IAR Systems\Embedded Workbench 4.0 Evaluation\ARM\config\flashloader\ST\FlashSTM32F10x.d79
 
以上是在某个网站上看到的文章,还没有人解决。我现在遇到了和这个几乎一模一样的问题,希望各位高手帮帮忙,积分不多,只有这些,谢谢啊
回复

使用道具 举报

1

主题

33

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2009-8-11 08:51:05 | 显示全部楼层

RE:ADC+DMA

怎么这么久还没有人解答呢?不会是只有我一个人遇到过这种情况吧?
回复 支持 反对

使用道具 举报

1

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2009-8-11 10:24:23 | 显示全部楼层

回复:ADC+DMA

你是程序下载时出错吗,前几天我也是,别人帮我把从flash启动改成从ram启动,下载一次程序再还原成原来的flash启动下载一次程序就好了,切换启动方式是把jp4 jp5从0拨到1,黄色的跳线的口,我是3210e的板子,不知道你的是什么,你的程序貌似和我写的差不多,应该没问题
回复 支持 反对

使用道具 举报

1

主题

33

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2009-8-12 00:07:38 | 显示全部楼层

RE:ADC+DMA

谢谢楼上的关注,RAM启动没有问题,但是只要下到FLASH里面就不能下载新程序了,需要改成RAM方式擦除FLASH中的数据,正常情况下是不会出现这样的问题的,有人说是JLINK的版本太低的原因,我正在下载新版本调试呢,不知道能不能解决这个问题
回复 支持 反对

使用道具 举报

1

主题

33

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2009-8-13 00:18:46 | 显示全部楼层

RE:ADC+DMA

是不是的水下,还没解决呢,千万不能沉
回复 支持 反对

使用道具 举报

1

主题

33

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2009-8-17 18:05:42 | 显示全部楼层

RE:ADC+DMA

唉  封贴吧…………
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版