打印
[STM32F1]

stm32f103cb低字节有数据,高字节全是零

[复制链接]
255|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2023-6-27 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请各位帮我看看,我如下设置DMA及ADC后,DMA 32位DR数据到内存中,为什么只有低字节有数据,高字节全是零?
到底是那个地方有问题?请求帮助!!


void DMA_Configuration(void)
     {
   DMA_InitTypeDef DMA_InitStructure;
   //DMA1 channel1 configuration ----------------------------------------------
     DMA_DeInit(DMA1_Channel1);//将DMA1的通道1重新设置为缺省值
     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_Address;//定义DMA外设基地址
     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCValue;//定义DMA内存基地址
     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//规定外设是作为数据传输的目的地还是来源。DST=目的地/SRC=来源
     DMA_InitStructure.DMA_BufferSize = 6;//定义指定DMA通道的DMA缓存的大小,单位为数据单位。
     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设定外设地址寄存器递增与否。Enable=外设地址寄存器递增/Disable=外设地址寄存器不变
     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设定内存地址寄存器递增与否。Enable=内存地址寄存器递增/Disable=内存地址寄存器不变
     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//设定外设数据宽度。Byte=8位/HalfWord=16位/Word=32位
     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;////设定内存数据宽度。Byte=8位/HalfWord=16位/Word=32位
     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的CAN的工作模式。Circular=工作在循环缓存模式/Normal=工作在正常缓存模式
     DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA通道的软件优先级。VeryHigh=非常高优先级 High=高优先级 Medium中优先级 Low低优先级
     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA通道的内存到内存传输。Enable=通道设置为内存到内存传输/Disable=通道没有设置为内存到内存传输
     DMA_Init(DMA1_Channel1, &DMA_InitStructure);//   
   // Enable DMA1 channel1
     DMA_Cmd(DMA1_Channel1, ENABLE);//使能或者失能指定的DMA通道。使能DMA1的通道1
   while(DMA_GetFlagStatus(DMA1_FLAG_TC1));
        
   }
void ADC_Configuration(void)
     {
   
   ADC_InitTypeDef ADC_InitStructure;
/*ADC1设置*/
   ADC_DeInit(ADC1);//复位
/* ADC1 configuration ------------------------------------------------------*/
     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//设置ADC工作在独立或者双ADC模式。ADC_Mode_Independent独立模式;ADC_Mode_RegSimult双模式
     ADC_InitStructure.ADC_ScanConvMode = ENABLE;//ENABLE模数转换工作在扫描模式(多通道);DISABLE模数转换工作在单次(单通道)模式。
      ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE连续转换模式;DISABLE单次转换模式
     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//设置外部触发来启动规则通道的模数转换。_None转换由软件而不是外部触发启动
     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//设置ADC数据左/右边对齐。_Right数据右边对齐   _Left数据左对齐
     ADC_InitStructure.ADC_NbrOfChannel = 2;//设置顺序进行规则转换的ADC通道的数目。取值范围1到16
     ADC_Init(ADC1, &ADC_InitStructure);//。在调用完ADC_InitStructure后必须调用ADC_RegularChannelConfig()来配置每个所使用通道的转换次序和采样时间
   /* ADC1 regular channel_0 configuration */
     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
   
/* ADC1 regular channel_1 configuration */
      ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
     
/* Enable ADC1 DMA */
     ADC_DMACmd(ADC1, ENABLE);//使能或失能指定的ADC的DMA请求。
   /*ADC2设置*/
   ADC_DeInit(ADC2);//复位
   /* ADC1 configuration ------------------------------------------------------*/
     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//设置ADC工作在独立或者双ADC模式。ADC_Mode_Independent独立模式;ADC_Mode_RegSimult双模式
     ADC_InitStructure.ADC_ScanConvMode = ENABLE;//ENABLE模数转换工作在扫描模式(多通道);DISABLE模数转换工作在单次(单通道)模式。
      ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE连续转换模式;DISABLE单次转换模式
     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//设置外部触发来启动规则通道的模数转换。_None转换由软件而不是外部触发启动
     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//设置ADC数据左/右边对齐。_Right数据右边对齐   _Left数据左对齐
     ADC_InitStructure.ADC_NbrOfChannel = 2;//设置顺序进行规则转换的ADC通道的数目。取值范围1到16
     ADC_Init(ADC2, &ADC_InitStructure);//。在调用完ADC_InitStructure后必须调用ADC_RegularChannelConfig()来配置每个所使用通道的转换次序和采样时间
/* ADC2 regular channel_8 configuration */
      ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
  
/* ADC2 regular channel_9 configuration */
      ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 2, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
    ADC_ExternalTrigConvCmd(ADC2, ENABLE);
/* Enable ADC1 */
     ADC_Cmd(ADC1, ENABLE);//使能或失能指定的ADC。
   /* Enable ADC1 reset calibaration register */   
     ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器。1=初始化校准寄存器
   /* Check the end of ADC1 reset calibration register */
     while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态。0=校准寄存器已初始化
   /* Start ADC1 calibaration */
     ADC_StartCalibration(ADC1);//指定ADC的A/D校准。1=开始校准
   /* Check the end of ADC1 calibration */
     while(ADC_GetCalibrationStatus(ADC1));//获取指定的ADC校准状态。0=校准完成
/* Enable ADC2 */
     ADC_Cmd(ADC2, ENABLE);//使能或失能指定的ADC。
   /* Enable ADC2 reset calibaration register */   
     ADC_ResetCalibration(ADC2);//重置指定的ADC的校准寄存器。1=初始化校准寄存器
   /* Check the end of ADC2 reset calibration register */
     while(ADC_GetResetCalibrationStatus(ADC2));//获取ADC重置校准寄存器的状态。0=校准寄存器已初始化
   /* Start ADC2 calibaration */
     ADC_StartCalibration(ADC2);//指定ADC的A/D校准。1=开始校准
   /* Check the end of ADC2 calibration */
     while(ADC_GetCalibrationStatus(ADC2));//获取指定的ADC校准状态。0=校准完成
   /* Start ADC1 Software Conversion */
     ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ENABLE使能或者失能指定的ADC的软件转换启动功能。开始转换规则通道。
   }

使用特权

评论回复
沙发
光辉梦境| | 2023-7-17 21:45 | 只看该作者
你使用cubemx配置一下估计就不会出现这种问题吧

使用特权

评论回复
板凳
暖了夏天蓝了海| | 2023-7-17 23:05 | 只看该作者
没遇到过啊,你现在这种低字节有数据,高字节的数据直接丢了?

使用特权

评论回复
地板
江河千里| | 2023-7-18 01:13 | 只看该作者
按理来说不应该的,高字节是被删掉了?

使用特权

评论回复
5
冰春彩落下| | 2023-7-18 03:45 | 只看该作者
你是不是设置的那里有问题啊

使用特权

评论回复
6
一秒落纱| | 2023-7-18 05:55 | 只看该作者
DMA你是往那里搬运啊?

使用特权

评论回复
7
夜阑风雨| | 2023-7-18 07:33 | 只看该作者
你直接看存储的数据不就好了么,依然缺数据吗?

使用特权

评论回复
8
远山寻你| | 2023-7-18 09:07 | 只看该作者
有点意思,正常DMA开启之后就没关注过它,根本不考虑数据传输的怎么样

使用特权

评论回复
9
淡漠安然| | 2023-7-18 11:26 | 只看该作者
ADC没啥问题,我看着

使用特权

评论回复
10
别乱了阵脚| | 2023-7-18 13:22 | 只看该作者
你定义的DMA32位的?

使用特权

评论回复
11
三生万物| | 2023-7-18 15:17 | 只看该作者
可能ADC就用不了这么长数据呢,也不一定

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1997

主题

7007

帖子

10

粉丝