arm开发常用全局配置文件config.h

本文详细介绍了配置宏定义的使用方法以及无符号、有符号整型变量、浮点数类型的定义,同时阐述了系统频率、晶振频率等相关概念,并提供了一些关键宏的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/****************************************Copyright (c)**************************************************

********************************************************************************************************/
#ifndef __CONFIG_H_INCLUDE__ 
#define __CONFIG_H_INCLUDE__

#include <lpc21xx.h>  
#include <stdio.h>

#ifndef TRUE
#define TRUE  1
#endif

#ifndef FALSE
#define FALSE 0
#endif

typedef unsigned char  uint8;                   /* defined for unsigned 8-bits integer variable 	  */
												/* 无符号8位整型变量 */

typedef signed   char  int8;                    /* defined for signed 8-bits integer variable		  */
												/* 有符号8位整型变量 */

typedef unsigned short uint16;                  /* defined for unsigned 16-bits integer variable 	 */
												/* 无符号16位整型变量 */

typedef signed   short int16;                   /* defined for signed 16-bits integer variable 		 */
												/* 有符号16位整型变量 */

typedef unsigned int   uint32;                  /* defined for unsigned 32-bits integer variable 	*/
												/* 无符号32位整型变量  */

typedef signed   int   int32;                   /* defined for signed 32-bits integer variable 		*/
												/* 有符号32位整型变量 */

typedef float           fp32;                   /* single precision floating point variable (32bits)  */
												/* 单精度浮点数(32位长度) */

typedef double          fp64;                   /* double precision floating point variable (64bits)  */
												/* 双精度浮点数(64位长度) */

 
#define Fosc            11059200                    // Crystal frequence,10MHz~25MHz,
													// should be the same as actual status. 
						                            // 应当与实际一至晶振频率,10MHz~25MHz,应当与实际一至

#define Fcclk           (Fosc * 4)                  // System frequence,should be (1~32)multiples of Fosc
													// and should be equal or less  than 60MHz. 
					                        	    // 系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ

#define Fcco            (Fcclk * 4)                 // CCO frequence,should be 2、4、8、16 multiples of Fcclk, 
													// ranged from 156MHz to 320MHz. 
					                        	    // CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz

#define Fpclk           (Fcclk / 4) * 1             // VPB clock frequence , must be 1、2、4 multiples of (Fcclk / 4).
				                        		    // VPB时钟频率,只能为(Fcclk / 4)的1、2、4倍                   


#define BitGet(number, pos) ((number) >> (pos) & 1)	// 用宏得到某数的某位

#define BitSet(number, pos) ((number) |= 1 << (pos))	// 把某位置1

#define BitClr(number, pos) ((number) &= ~(1 << (pos)))	// 把某位清0

#define BitCpl(number, pos) ((number) ^= 1 << (pos))	// 把number的POS位取反

#endif

<think>好的,用户问的是Keil中的.h文件是什么意思。我需要先回忆一下Keil的基本知识,以及头文件的作用。Keil是用于嵌入式开发的IDE,主要用于ARM微控制器。头文件.h在C/C++中很常见,但在嵌入式环境下可能有特定的用途。 首先,要解释.h文件的基本概念,即头文件。然后说明在Keil项目中的作用,比如声明函数、变量、宏、结构体等,方便多个.c文件共享。可能需要提到模块化设计,比如外设驱动通常会有一个对应的.h文件供其他模块调用。 还要注意用户可能的背景,可能是刚开始学习嵌入式开发,所以需要避免使用过于专业的术语,用易懂的例子说明。比如,当使用GPIO时,会有gpio.h来声明初始化函数,这样主程序包含这个头文件后就可以调用函数,而无需知道具体实现。 另外,需要区分.h和.c文件的不同,头文件负责声明,源文件负责实现。可能用户会混淆两者的作用,所以需要明确说明。 可能还需要提到头文件中的条件编译,防止重复包含,比如#ifndef... #define... #endif的结构,这在Keil项目中常见,确保头文件只被包含一次。 还要考虑用户可能遇到的问题,比如头文件路径未正确设置导致编译错误,或者声明和实现不一致引发的链接错误。虽然用户没有直接问这些,但作为补充信息可能会有帮助。 最后,总结一下.h文件在Keil中的重要性,强调模块化和代码管理的优势。确保回答结构清晰,分点说明,符合用户要求的逐步解决问题的格式。</think>在Keil开发环境中,`.h`文件(即**头文件**)是C/C++编程中重要的组成部分,它的核心作用可归纳为以下几步: --- ### 一、基本定义 1. **文件扩展名**:`.h`是头文件的标准扩展名。 2. **内容性质**:包含**声明性代码**(如函数原型、宏定义、数据类型、全局变量声明等),而非具体实现。 --- ### 二、在Keil项目中的作用 1. **模块化编程** - 例如:若你编写了一个`LED`控制模块: ```c // led.h(声明函数) #ifndef LED_H #define LED_H void LED_Init(void); // 函数声明 #endif ``` ```c // led.c(实现函数) #include "led.h" void LED_Init() { /* 具体代码 */ } // 函数实现 ``` - 其他文件只需`#include "led.h"`即可调用`LED_Init()`,无需关心底层实现。 2. **代码复用** - 将常用功能(如硬件寄存器地址定义)放在头文件中: ```c // stm32f10x_gpio.h(STM32标准库示例) #define GPIOA_BASE 0x40010800U typedef struct { volatile uint32_t CRL, CRH, IDR, ODR; } GPIO_TypeDef; #define GPIOA ((GPIO_TypeDef*)GPIOA_BASE) ``` 3. **跨文件共享配置** - 定义全局常量或宏,确保多个源文件使用统一配置: ```c // config.h #define SYSTEM_CLOCK 72000000 // 72MHz主频 #define BUFFER_SIZE 128 ``` 4. **条件编译与兼容性** - 通过预处理器指令适配不同硬件: ```c // device.h #ifdef STM32F103 #include "stm32f10x.h" #elif defined(STM32F407) #include "stm32f4xx.h" #endif ``` --- ### 三、头文件 vs 源文件 | 文件类型 | 内容 | 编译处理 | |----------|------------------------|------------------------| | `.h` | 声明(函数、变量、宏) | 预处理阶段展开到源文件 | | `.c` | 具体代码实现 | 独立编译成目标文件 | --- ### 四、Keil中注意事项 1. **路径配置** - 若头文件不在工程目录下,需在`Options for Target → C/C++ → Include Paths`中添加路径。 2. **避免重复包含** - 使用`#ifndef`和`#pragma once`防止多次展开: ```c // mylib.h #pragma once void MyFunction(); ``` 3. **语法一致性** - 声明与实现需严格匹配,否则会导致链接错误(如函数参数不匹配)。 --- ### 五、典型应用场景 - **外设驱动**:`uart.h`, `i2c.h` - **芯片支持包**:`stm32f10x.h` - **算法库接口**:`math_utils.h` 通过合理使用头文件,Keil项目可实现代码高内聚、低耦合,大幅提升可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值