OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8201|回复: 22

ST标准库里Example的同步规则双ADC采集例程,都是2个通道,为什么DMA_BufferSize = 16?4个字节不够吗?

[复制链接]

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-14 15:56:11 | 显示全部楼层 |阅读模式
5金钱
ST标准库里Example的双ADC同步规则+DMA采集例程,ADC1和ADC2都是2个通道,为什么DMA_BufferSize = 16?4个字节够不够?每次采集完,高16位放ADC2结果,低16位放ADC1结果,不是正好吗?
我理解的不管怎么采集,都4个字节够了。目前没板子测试,谁给解释下为什么是16个字节?

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define ADC1_DR_Address    ((uint32_t)0x4001244C)

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
__IO uint32_t ADC_DualConvertedValueTab[16];
    
/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
  
/* Private functions ---------------------------------------------------------*/
int main(void)
{     
  /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();

  /* GPIO configuration ------------------------------------------------------*/
  GPIO_Configuration();

  /* DMA1 channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_DualConvertedValueTab;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 16;//为什么???????????
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  /* Enable DMA1 Channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);

  /* ADC1 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 2;
  ADC_Init(ADC1, &ADC_InitStructure);
  /* ADC1 regular channels configuration */ 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);    
  ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 2, ADC_SampleTime_239Cycles5);
  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);

  /* ADC2 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 2;
  ADC_Init(ADC2, &ADC_InitStructure);
  /* ADC2 regular channels configuration */ 
  ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC2, ADC_Channel_12, 2, ADC_SampleTime_239Cycles5);
  /* Enable ADC2 external trigger conversion */
  ADC_ExternalTrigConvCmd(ADC2, ENABLE);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
  /* Enable Vrefint channel17 */
  ADC_TempSensorVrefintCmd(ENABLE);

  /* Enable ADC1 reset calibration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));

  /* Enable ADC2 */
  ADC_Cmd(ADC2, ENABLE);

  /* Enable ADC2 reset calibration register */   
  ADC_ResetCalibration(ADC2);
  /* Check the end of ADC2 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC2));

  /* Start ADC2 calibration */
  ADC_StartCalibration(ADC2);
  /* Check the end of ADC2 calibration */
  while(ADC_GetCalibrationStatus(ADC2));

  /* Start ADC1 Software Conversion */ 
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  /* Test on DMA1 channel1 transfer complete flag */
  while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  /* Clear DMA1 channel1 transfer complete flag */
  DMA_ClearFlag(DMA1_FLAG_TC1);

  while (1)
  {
  }
}

补充:根据库函数里解释
DMA_BufferSize
DMA_BufferSize is used to define the buffer size, in data unit, of the specified Channel. The 
data unit is equal to the configuration set in DMA_PeripheralDataSize or 
DMA_MemoryDataSize members depending in the transfer direction.

如何理解?

中文版解释如下:
DMA_BufferSize 
DMA_BufferSize 用以定义指定 DMA 通道的 DMA 缓存的大小,单位为数据单位?。根据传输方向,数据单
位等于结构中参数 DMA_PeripheralDataSize 或者参数 DMA_MemoryDataSize 的值。
  因为:
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
那么照上面所说,buffersize的单位是word,32位。那我岂不是赋值为1就可以了,怎么是16个word呢?

有的程序中是这样 DMA_InitStructure.DMA_BufferSize = Sample_Num*Channel_Num;//也有类似的N*M
这就更搞不懂了,这是把dma当内存用吗,每次采集完1个通道DMA就该把数据搬到内存才对。
还是说我们把缓冲区设置很大,就可以多从ADC->DR取几次,再一次放到内存?

网上也有好几个程序是设置DMA_BufferSize = 通道数;

最佳答案

查看完整内容[请看2#楼]

这个DMA_BufferSize 就是要传输的次数。 作者设置为16,是因为要传输16次,即采集十六次? 这个并不是指buf的字节大小,而是指DMA的传输次数,一次传输可以是:1字节,2字节,4字节。
小小蜗牛
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-14 15:56:12 | 显示全部楼层
这个DMA_BufferSize 就是要传输的次数。
作者设置为16,是因为要传输16次,即采集十六次?

这个并不是指buf的字节大小,而是指DMA的传输次数,一次传输可以是:1字节,2字节,4字节。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2014-10-14 15:56:12 | 显示全部楼层
回复【8楼】jiutianshenjian:
---------------------------------
DMA设置循环模式,放到buf缓冲区,这个缓冲区大小自己设置,有DMA中断可以判断是否传输完成或者是传输完成一半
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-14 18:40:39 | 显示全部楼层
没人来,床前明月光,疑是地上霜。对酒当歌,人生几何。
小小蜗牛
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-10-14 18:44:41 | 显示全部楼层
没玩过双ADC同步。。。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-14 19:02:01 | 显示全部楼层
回复【3楼】STM32VBT6:
---------------------------------
好吧,等待大侠。。。
小小蜗牛
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-8-24
在线时间
0 小时
发表于 2014-10-14 20:04:09 | 显示全部楼层
http://bbs.21ic.com/icview-210875-1-1.html
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-14 20:16:43 | 显示全部楼层
回复【5楼】yaohua:
---------------------------------
没看懂,啥意思?能解释下吗?
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-15 09:07:25 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
ADC1和ADC2都是7个通道循环采集,要一直采集。如果是次数,岂不是得设置 无穷大 了。我觉得每次采集完就放到内存了,第二次仍然是一个32位的值再放到内存地址+4?,如此重复。
但不知道如何测试。
小小蜗牛
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-16 09:33:21 | 显示全部楼层
请问为什么我按照标准库里双ADC模式程序会死在while(!DMA_GetFlagStatus(DMA1_FLAG_TC1))啊?(我设置ADC单次转换,DMA循环模式)
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-16 11:59:00 | 显示全部楼层
不知道。你看看这个: 
void DMA1_Channel1_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA1_IT_HT1)) //判断DMA传输过半中断是否产生,过半则一个周期结束
    {
        DMA_ClearITPendingBit(DMA1_IT_HT1); //清除DMA中断标志位
       
        OSTimeDlyResume(ADC_TASK_PRIO);//adc任务优先级,让其就绪。较高优先级时会立刻执行
    }
    else if(DMA_GetITStatus(DMA1_IT_TC1)) //判断DMA传输完成中断是否产生
    {
        DMA_ClearITPendingBit(DMA1_IT_TC1); //清除DMA中断标志位
        
        OSTimeDlyResume(ADC_TASK_PRIO);//adc任务优先级,让其就绪。较高优先级时会立刻执行
    }
}
小小蜗牛
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-17 16:08:08 | 显示全部楼层
回复【11楼】jiutianshenjian:
---------------------------------
好的,但你按你最上面那样初始化不会卡死在那吗
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-17 16:13:16 | 显示全部楼层
回复【12楼】zzj:
---------------------------------
最上面不是我写的。是库里自带的。
小小蜗牛
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-17 17:00:46 | 显示全部楼层
回复【13楼】jiutianshenjian:
---------------------------------
我也是用库这个例程,修改ADC1和ADC2各一个通道,用PC2通道12(ADC1),PC3通道13(ADC2),屏蔽掉最后两句:
//while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
//  DMA_ClearFlag(DMA1_FLAG_TC1);
可以采集了,但是用printf打印出来一直是固定一个数据,不管我有没有接PC2和PC3都一样。这是怎么回事呢?
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-17 17:10:02 | 显示全部楼层
回复【14楼】zzj:
---------------------------------
我没用那个。

都忘了那个写了些什么了。

两个月前发的。记不清了都。。。
小小蜗牛
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-17 17:59:57 | 显示全部楼层
回复【15楼】jiutianshenjian:
---------------------------------
刚刚发现问题,单次转换时,MDA缓存不止1时会卡死在上面那里。不过现在打印有问题,明明打印两次,竟然会出现四个数字。。真是晕啊
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-18 08:17:31 | 显示全部楼层
回复【16楼】zzj:
---------------------------------
你把程序贴上来,让别人给看看。
小小蜗牛
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-18 10:33:27 | 显示全部楼层

这是代码:

[mw_shl_code=c,true]#define ADC1_DR_Address ((uint32_t)0x4001244C) vu32 ADCConvertedValue; void ADC_DMA_Init(void) { DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCm(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2 | RCC_APB2Periph_GPIOC, ENABLE ); //P2,PC3 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚 GPIO_Init(GPIOC, &GPIO_InitStructure); /* DMA channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; //DMA内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1,  &DMA_InitStructure);  DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换[/mw_shl_code] [mw_shl_code=c,true] ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_239Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* ADC2 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC2, &ADC_InitStructure); [/mw_shl_code] [mw_shl_code=c,true] /* ADC2 regular channels configuration */ ADC_RegularChannelConfig(ADC2, ADC_Channel_13, 1, ADC_SampleTime_239Cycles5); /* Enable ADC2 external trigger conversion */ ADC_ExternalTrigConvCmd(ADC2, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable Vrefint channel17 */ ADC_TempSensorVrefintCmd(ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Enable ADC2 */ ADC_Cmd(ADC2, ENABLE); /* Enable ADC2 reset calibaration register */ ADC_ResetCalibration(ADC2); /* Check the end of ADC2 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC2)); /* Start ADC2 calibaration */ ADC_StartCalibration(ADC2); /* Check the end of ADC2 calibration */ while(ADC_GetCalibrationStatus(ADC2)); /* Start ADC1 Software Conversion */ // ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* Test on Channel 1 DMA_FLAG_TC flag */ // while(!DMA_GetFlagStatus(DMA_FLAG_TC1)); /* Clear Channel 1 DMA_FLAG_TC flag */ // DMA_ClearFlag(DMA_FLAG_TC1); } int main(void)[/mw_shl_code] [mw_shl_code=c,true]{[/mw_shl_code] [mw_shl_code=c,true] delay_init();[/mw_shl_code] [mw_shl_code=c,true]NVIC_Configuration();[/mw_shl_code] [mw_shl_code=c,true]uart_init(9600);[/mw_shl_code] [mw_shl_code=c,true]   LED_Init();[/mw_shl_code] [mw_shl_code=c,true] ADC_DMA_Init();[/mw_shl_code] [mw_shl_code=c,true]ADC_SoftwareStartConvCmd(ADC1, ENABLE);[/mw_shl_code] [mw_shl_code=c,true]  printf("%d\r\n",ADCConvertedValue); //打印接收到的数据[/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true]} [/mw_shl_code]

在战舰开板上我用杜邦线连接PC2,PC3,用板上的3.3v和GND进行测试,当都连接3.3v时输出0147853311268374015或者0145756159268374015,都连接GND时输出014784921665536,01478492160,0147849217131072这些数字。不知道是配置有问题还是ADC有问题?

回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-12-18 13:11:16 | 显示全部楼层
回复【18楼】zzj:
---------------------------------
你采集了两个数据,为什么放到一起打印呢?高低16位不拆开吗?你跟踪调试看看ADCConvertedValue这个内存里放的数字。int查看,应该是0xxx0xxx就应该对的吧。
小小蜗牛
回复

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-18 17:13:41 | 显示全部楼层
回复【19楼】jiutianshenjian:
---------------------------------
是不是串口调试助手显示有问题啊,我用明明才打印两个,每次都打印4个出来。就用下面这两句打印:
printf("%d\r\n",((u16)ADC_DualConvertedValueTab[0]));
printf("%d\r\n",(u16)(ADC_DualConvertedValueTab[0]>>16));

另外我用液晶显示就正常,高低位显示正常。
回复

使用道具 举报

4

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-11-18
在线时间
0 小时
发表于 2015-1-26 14:09:33 | 显示全部楼层
回复【19楼】jiutianshenjian:
---------------------------------
你好,ST的标准库能分享一下么,我找半天没找到啊。谢谢了
我是伸手党 ←_←
回复

使用道具 举报

25

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-5-14
在线时间
6 小时
发表于 2015-5-13 15:13:55 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
您好,这个DMA通道x传输数量寄存器(DMA_CNDTRx)是设置传输次数而不是传输字节数是吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-13 23:33:44 | 显示全部楼层
回复【22楼】dinghongyan:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 14:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表