历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-07-31 来源:eefocus

先来看一段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不允许这么做,这个现象比较奇怪,不知道是不是为了优化内存分配才规定的


推荐阅读

史海拾趣

DCD [Digital Core Design]公司的发展小趣事

在市场竞争日益激烈的情况下,DCD公司意识到单打独斗难以取得更大的发展。因此,公司开始寻求与其他企业建立战略合作关系。通过与上下游企业的紧密合作,DCD公司实现了资源共享和优势互补,进一步提升了自身的竞争力。同时,公司还积极参与行业标准的制定和推广工作,为行业的健康发展贡献了自己的力量。

Cybernetic Micro Systems公司的发展小趣事

Cybernetic Micro Systems(简称CMS)的创始人李华,是一位热衷于电子技术的天才工程师。他在大学期间就研发出了一款高效能、低功耗的微处理器原型,这一成果引起了业界的广泛关注。毕业后,李华决定创业,将他的研究成果商业化。于是,Cybernetic Micro Systems应运而生,专注于研发和生产高性能的微处理器和配套设备。凭借独特的技术优势,CMS很快在电子行业中崭露头角。

驰芯微(CHIPWISE)公司的发展小趣事

在发展过程中,驰芯微公司成功完成了多轮融资,为公司的发展提供了强有力的资金支持。这些资金主要用于车规级传感和控制类芯片的系列化业务以及新能源电池管理系统汽车电子系统一站式车规级芯片套片解决方案的研发和推广。未来,驰芯微将继续加大在技术研发和产品创新方面的投入力度,致力于成为国际领先的汽车电子芯片供应商。同时,公司还将积极拓展海外市场,提升品牌知名度和影响力。

以上五个故事框架分别围绕驰芯微公司的初创历程、技术突破、面对“芯片限制”的机遇与挑战、与明然科技的合作以及融资与未来规划等方面进行了描述。这些故事展示了驰芯微在电子行业中的发展历程和取得的成就,同时也揭示了公司未来的发展方向和目标。

Crocus公司的发展小趣事

Crocus公司成立于XXXX年,是一家专注于先进隧道磁阻(TMR)传感器技术的研发与生产的企业。创立初期,公司面临着资金紧张、技术壁垒等重重困难。然而,凭借创始团队对TMR技术的深刻理解和坚定信念,Crocus逐渐在行业中崭露头角。他们不断投入研发,优化产品性能,为后续的快速发展奠定了坚实的基础。

Akahane Electronics Ind Corp公司的发展小趣事

随着全球市场的不断扩大,Akahane意识到单打独斗难以为继,于是积极寻求与国际同行的合作。通过与欧美知名电子企业建立战略合作关系,Akahane不仅获得了先进的技术支持,还成功打入国际市场,进一步提升了品牌影响力。同时,公司还积极参与国际电子行业的交流活动,学习借鉴先进的管理经验和市场策略,为公司的长远发展奠定了坚实基础。

启攀微电子(Chiphomer)公司的发展小趣事

在知识产权保护方面,启攀微电子高度重视自主创新能力的培养和提升。公司成立了专门的知识产权保护团队,负责申请和管理公司的专利和集成电路布图设计专有权。截至目前,公司累计申请专利已达26项,集成电路布图设计专有权54项。这些知识产权的取得不仅保护了公司的技术成果和市场地位,也为公司的持续创新提供了有力的支持。

问答坊 | AI 解惑

嵌入式CAN总线控制器与DSP的接口

现场总线是一种开放式、 数字化、多点通信的控制系统局域网络, 是当今自动化领域中最具有应用前景的技术之一。CAN总线是现场总线中的应用热点,CAN总线支持分布式控制和适时控制的串行通信网络。   由于CAN总线具有通信速率高、开放性好、报文短 ...…

查看全部问答>

非常好的模拟电路讲义【我老师写的】

这是我的老师写的模拟电路的讲义,也是我们学校每年的电子设计大赛的培训课程,很值得大家学习! …

查看全部问答>

终于研发成功

终于研发成功,cpu是s3c2410,64M   SDRAM,网口为cs8900 flash(k9f1208 64m)   实现了只用nand flash 就可以启动引导vxworks. 公司送bsp及全套开发文档 ,另可配公司的开发板 有意着QQ联系641328010 请注明 arm…

查看全部问答>

STC12LE5206AD 程序将引脚置为0 却检测到为高

有谁能够帮忙解决下啊? 本人qq:853887107…

查看全部问答>

pic io配置问题

pic16F506 io配置为普通的io口。不是只配置TRISB为1为输入 0输出。 我的IO怎么不听话啊。送高低电平不能控制。…

查看全部问答>

RT_THREAD中的异常与中断

  异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果系统不及时处理,系统轻则出错,重着导致系统毁灭性的瘫痪。所以正确地处理异常避免错误的发生是提高软件的鲁棒性重要的一方面,对于嵌入式系统更加如此。 异常可以分成两类 ...…

查看全部问答>

DIY导航避障车规整贴

DIY导航避障车小组今日下午展开第一次例会,在本次例会中大家集中讨论了无线的选择,避障的选择等等部分,并对小车进行了前景规划,以谷歌的自动驾驶车为终极目标,大家积极发言例会持续了一个半小时,并表示未来会采用各种新技术。下次再来把细节 ...…

查看全部问答>

关于称重传感器的电压和重量的换算公式

一个额定量程为10吨的称重传感器,激励电压为10V,灵敏度为1.0+-0.005mV/V,零点平衡+-1%F.S,综合误差为+-0.02%F.S 那么在货物重量为5吨时,误差应该是:5TX0.02%=0.001t=1千克吧。。 那么按网上一些知识的理解,当货物为10吨的时候,在10V的激 ...…

查看全部问答>

msp430中断嵌套问题

main(){  WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器  P5DIR |= 0xff; //设P1.0 为输出  CCTL0 = CCIE; //CCR0开中断允许  CCR0 = 1000-1; //向CCR0捕获/比较寄存器装入初值,用于比较  TACTL = TASSEL_1 + MC_1; // ...…

查看全部问答>

全球智能机Q2出货1.5亿部 中兴进前五

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 …

查看全部问答>