历史上的今天

今天是:2025年07月31日(星期四)

正在发生

2019年07月31日 | 关于一个STM32编译报错问题,变量声明不能在语句后面

发布者:电子科技爱好者 来源: eefocus关键字:STM32  编译报错  变量 手机看文章 扫描二维码
随时随地手机看文章

先来看一段STM32外设初始化代码:代码内容为初始化两个外设,在这里把他们都写到同一个函数里面了


static void ADC1_Mode_Config(void)

{


ADC_InitTypeDef ADC_InitStructure;

DMA_InitTypeDef DMA_InitStructure;

DMA_DeInit(DMA1_Channel1);

//设置DMA源:内存地址&串口数据寄存器地址

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;

//内存地址(要传输的变量的指针)

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;


//传输方向:从内存到外设

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_Disable;//内存地址固定

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_High;

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;


DMA_Init(DMA1_Channel1, &DMA_InitStructure);

DMA_Cmd(DMA1_Channel1, ENABLE);


ADC_InitTypeDef ADC_InitStructure;

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfChannel = 1;//要转换的通道数目

ADC_Init(ADC1, &ADC_InitStructure);


//配置ADC的时钟

RCC_ADCCLKConfig(RCC_PCLK2_Div8);


//配置采样周期

ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);

//设置ADC与DMA联通

ADC_DMACmd(ADC1, ENABLE);

//使能ADC

ADC_Cmd(ADC1, ENABLE);


//先复位校准,再ADC校准,顺序不要不能调换

ADC_ResetCalibration(ADC1);

while(ADC_GetResetCalibrationStatus(ADC1))

{

;

}


ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1))

{

;

}


//设置为软件触发

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}


这段代码是可以正确编译通过的,这里想引出的问题就在红色代码部分,注意,两个不同模块的结构体变量的声明放在一起了,按正常的思维逻辑是用到哪个结构体就声明哪一个。但是这里不能分开声明!也就是不能将ADC_InitTypeDef ADC_InitStructure;这一句放到DMA初始化语句的后面,也就是绿色字体部分,会报错!


adc.c(127): error:  #268: declaration may not appear after executable statement in block

        ADC_InitTypeDef ADC_InitStructure;


也就是不能将变量的声明放在语句之后,这是早期的C语言规定的,要求所有变量必须在函数开头声明。但是C++可以这么做,现在很多C编译器也允许变量的声明在语句后面。这里的MDK5.10不允许这么做,这个现象比较奇怪,不知道是不是为了优化内存分配才规定的


关键字:STM32  编译报错  变量 引用地址:关于一个STM32编译报错问题,变量声明不能在语句后面

上一篇:STM32高级开发(18)-使用VS Code搭建STM32开发环境
下一篇:STM32之三标准外设版USB驱动库详解(架构+文件+函数+使用说明

推荐阅读

对所有机器人而言,动力来源是一个非常关键的基本问题,但对微型机器人更是如此,使用的话太重,靠万接电源又使应用充满限制;现在科学家们终于找到了突破口,他们研发出一只靠雷射供给电力飞行的无线微型机器人 RoboFLy。 根据《New Atlas》报导,RoboFLy 由华盛顿大学的技术团队制作,重量约与一根牙签相仿;尽管时间非常短暂,它仍是世上首个成功...
随着人工智能、等技术的进步发展,机器人的应用开始从工业场景走向大众生活,例如商业场所、家庭社区、医院等,越来越多地进入人们工作和生活的领域。相关机构曾经预测,未来可能有一半的工作将会被机器人代替。机器人的快速发展,引发了观众的普遍担心。 近年来,机器换人已经成来社会人们关注的焦点,机器人科技公司正在推动其产品和技术的应用,并衍...
世界光伏看中国,中国光伏看青海!青海格尔木东出口的光伏园区内,一望无垠的太阳能电池板微微昂头,如同绿色的庄稼给古老的高原带来勃勃生机。第三方TüV SüD发布的格尔木光伏电站《运行指标及发电性能技术尽职调查》指出:该光伏电站三期采用的4939台华为智能组串式逆变器,在583天统计期内可用度高达99.996%。“华为逆变器很省心,几乎不需要维护”...
日前,以“智启现在、领跑未来”为主题的百度Apollo智能车联探寻之旅在上海Apollo Park举行。凯迪拉克CT6等车型迎来Apollo Park开园后首批体验者。凯迪拉克移动互联体验CUE虽然沿用了原来的名字,但是其是基于百度Apollo智能车联技术打造,具有语音助手、百度地图汽车版、车家互联、车载智能小程序等功能,可为用户带来便捷的智能出行体验。图片来源: ...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved