今天在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义的全局变量extern u16 ntime,(ntime--写在stm32f10x_it.c的systick中断函数中)但是编译时总是报错,百度之后才有了解决方法,
之前也注意到过extern变量,但是没有仔细思考过它的使用方法,今天碰到了,一定要把它弄明白,把这个关键字的一般作用弄清楚(仅仅是一般作用,C的博大精深不敢妄谈);
当你建立一个头文件库时,经常会遇到一个问题,就是在A文件中定义一个temple变量,想把它的值传递给B文件使用,但是A文件操作中函数又不可以带返回参数,比如说中断服务函数,那该怎么办?如果你把temple定义在A中,然后让A.h和B.h包含在includes.h中,然后把includes.h放在A.c和B.c中单个编译是没有问题的,但是链接的时候会出现问题,
“Symbol temple multiply defined(by A.o and B.o)”
意思是这个变量被多次定义了!!!
解决的方法是:
在A中定义temple变量后,在B中用extern 声明一下就可以了,例如:
1.在A中定义temple 并且赋值:u16 temp2=0;
2.在B中声明extern u16 temp2;
这里只是声明,不再赋值,否则会报错!
Symbol temp2 multiply defined (by catch_pwm.o and app.o)
这里要注意变量定义和变量声明的区别:
变量定义使用“数据类型+变量名称”的形式,编译器需要给它分配内存单元的;
而变量声明使用“extern 变量类型+变量名称”的形式,是告诉编译器我这个变量将在其他外部C文件中定义,我这里只是在外部用它。编译器就不会给它分配内存空间,而等到真正遇到变量定义时再给它分配内存空间。
//////////////////以下是“聚海”de帖子///////////////////////////////////
1、普通变量定义成全局变量
如果是普通类型,完全可以不用*.h文件,直接在*.c文件中定义,在调用文件处用extern 声明,因为对于普通类型,编译器是可以识别的。比如在一个 my.c文件中,我定义了char name[10];那么在别的文件中只要用extern char name[](由于是声明,一位数组可以省略大小,但不建议用指针,比较指针和数组是两回事)外部声明就可以了,告诉编译器这个变量我已经定义过了,具体怎样,你慢慢找吧。这符合常理,因为char是编译器能自主识别的类型。
2、自定义结构体类型定义成全局变量
不同于普通类型,如果不预先通知编译器,编译器是不会识别你自定义的类型的。这个时候,*.h文件便出现了。不是定义结构类型不占内存吗?那好,我大结构体的定义放在*.h文件中,这样一来,无论你incude无数次,内存都不会被占用的。而且这样还有个好处,在别的文件中可以include这个*.h文件,这样,在这个文件中,编译器就可以识别你的自定义类型了,目的不就达到了? 假如我在global.h中定义了
typedef struct _POSITION
{
int x;
int y;
}POSITION;
那么我可以在一个global.c文件中实现全局变量的定义,不过要include那个*.h文件,比如
include “global.h”
POSITION current,;
这样就定义了cunrrent这个变量,在别的文件中引用这个变量时,只要extern POSITION current;进行声明,然后就可以用了,不过这个文件也还得include "global.h" 因为如果不包含,在这个文件中是不识别POSITION类型的。
1.如何引用一个已经定义过的全局变量?
答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
2.全局变量可不可以定义在可被多个.C文件中?为什么?
答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
OVER!
关键字:STM32 全局变量
引用地址:
STM32学习009_全局变量的定义和声明
推荐阅读最新更新时间:2024-03-16 15:41
STM32 keil mdk启动代码发分析
学习STM32,看了一堆乱七八糟的文档,准备写程序了,先分析了下STM32的启动代码,看着这堆鬼鬼的汇编代码,挺吓人的,看看帮助,查查网路,还是不那么难懂。 ;// h Stack Configuration ;// o Stack Size (in Bytes) 0x0-0xFFFFFFFF:8 ;// /h Stack_Size EQU 0x00000200 ;//定义堆栈大小 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 Stack_Mem SPACE Stac
[单片机]
STM32使用JLINK或STLink下载程序需要用的的引脚
STM32最常见的两种下载程序的方法:STLink和JLINK。 而官方买的STLink和JLINK引脚都特别多,大约好几十根引脚,特别占地方,而其中大部分引脚都是用不到的。所以在设计板子的时候,为了节省空间,其实只需要留下需要的引脚即可。 下面则分别介绍这两种方式的实际使用到的引脚: 1、STLINK方式下载程序 STLINK用到的引脚如图所示: 2、JLINK方式下载程序 因为我现在没有用过Jlink,所以没法验证,暂时保留,先不写,等有JLINK了测试完再补上。
[单片机]
ST宣布STM32 F4系列为迄今性能最高ARM® Cortex™-M微控制器
横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)宣布,采用Green Hills软件公司最新软件工具独立进行的处理器性能评测证实,STM32 F4系列是迄今全球性能最高的ARM® Cortex™-M微控制器。
在行业基准CoreMark™评测 中,Green Hills软件公司的2012版编译器让STM32 F4系列多释放出29%的性能。CoreMark测试成绩用单一数字表示,以便设计人员比较不同品牌的处理器。这个创新高的CoreMark得分让工程师对STM32 F4系列微控制器更有信心,为他们选择业界性能最高的Cortex-M微控制器,
[工业控制]
基于STM32和CAN总线的印染机同步控制系统设计
0 引言 随着社会生活的发展,人们对现在的印染品的要求也越来越高,特别是布匹与包装外壳,那么对现代印染工艺的要求也越来越高。随着工艺的增加,对印染设备是个不小的挑战,这里面最主要的是大型印染联合机中多电机的同步控制问题。 在印染设备中,电机的同步控制主要有3方面决定:一是处理器对张力传感器数据的处理速度,以及电机对张力传感器的反应速度;二是不同的电机组之间机械性能的差异以及它们产生的实时同时控制问题;三是控制单元与各电机组之间的通信问题,包括速率,抗干扰等。传统印染联合机的做法是采用单片机加AD/DA芯片进行数据的处理与执行,也有为了提高数据的处理能力而采用DSP加单片机的做法。随着现在技术的发展,在研究了基于ARM的CORTE
[单片机]
关于STM32网络电路设计方案
如果有同学对SMI,MII和RMII接口不熟悉,建议看一下上面提到的两篇文章,不然可能看不太懂下文。 区域1:我们称为SMI接口,用于配置外部PHY芯片。 区域2:是数据交换接口,也就是上面我们说的MII接口和RMII接口。 利用这些接口可以有多种不同的网络电路设计方案,这里我来总结下。 01MII接口方案 MII接口在文章《STM32网络之MII和RMII》已经详细介绍过了,从中得知,需要一个25MHz的时钟。 对于MII接口,最常用的方案是,STM32外接25MHz的晶振。 内部的PLL配置HCLK,提供给内核和外设等。 外部PHY连接提供了25MHz的MCO脚。 此方案适合STM32F107/2x7/4x7。 02R
[单片机]
stm32初始化流程图解析
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。 stm32参数: 12V-36V供电 兼容5V的I/O管脚 优异的安全时钟模式 带唤醒功能的低功耗模式 内部RC振荡器 内嵌复位电路 工作温度范围:-40°C至+85°C或105°C stm32特点: 内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz。单周期乘法和硬件除法。 存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。上电
[单片机]
关于STM32的 一个TIM1 的PWM程序和PWM简单使用
高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有 死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; /* PA8设置为功能脚(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*P
[单片机]
stm32中的i2c协议编程
在上篇博客中,我已经介绍完了i2c的各种特征,这次就结合师兄给我的编程实例来分析学习。首先i2c协议的编程可以分为硬件i2c和模拟i2c,一般在51之类的低端单片机都是使用模拟i2c(即用软件编程来控制io口上的时序变化以符合i2c协议的biao标准),而在stm32一类的中高端单片机本身就自带可以某些硬件gpio口自动实现i2c协议。下面就分别讨论下两种方式的编程初始化配置过程。 1.1.模拟i2c编程 1.1.1初始化i2c函数 首先i2c协议通信需要两根总线数据线SDA与时钟线SCL,所以我们先选择两个gpio口进行相应初始化。gpio口的初始化过程在之前博客也详细介绍过这里就不过多赘述
[单片机]