微控制器原理4综述

上传人:最**** 文档编号:118470990 上传时间:2019-12-15 格式:PPT 页数:35 大小:261KB
返回 下载 相关 举报
微控制器原理4综述_第1页
第1页 / 共35页
微控制器原理4综述_第2页
第2页 / 共35页
微控制器原理4综述_第3页
第3页 / 共35页
微控制器原理4综述_第4页
第4页 / 共35页
微控制器原理4综述_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《微控制器原理4综述》由会员分享,可在线阅读,更多相关《微控制器原理4综述(35页珍藏版)》请在金锄头文库上搜索。

1、 C语言程序中嵌入单片机汇编语言程序例: KL25-Light例之 common.h 中(P.114) /2定义开关总中断 #define ENABLE_INTERRUPTS asm(CPSIE i) /开总中断 #define DISABLE_INTERRUPTS asm(CPSID i) /关总中断 1基本数据类型 C语言的数据类型有基本类型和构造类型两大类 。 3 例如: KL25-Light例之 common.h 中(P.118) 在编写嵌入式程序时使用的基本数据类型多以8位、 16位、32位数据长度为单位,且要明确使用变量的字 长。但不同的编译器为基本整型数据类型分配的位数 存在不同

2、,因此,需根据具体编译器重新定义嵌入式 基本数据类型。 关于typedef: 1)定义新的类型名代替已有的类型名。 2)不能定义变量名。 3)不能创造新的类型。 4)与define类似,也有不同。 5)往往单独存放在一个文件中,用include包含 近来。 #include void main() register int i,s=0; for(i=1;i RUN_COUNTER_MAX) run_counter = 0; switch (flag) case 1: /红灯取反、绿灯暗、兰灯暗 light_change(LIGHT_PORT, LIGHT_PIN_RED); light_con

3、trol(LIGHT_PORT, LIGHT_PIN_GREEN, LIGHT_OFF); light_control(LIGHT_PORT, LIGHT_PIN_BLUE, LIGHT_OFF); flag = 2; break; /使用break case 2: /绿灯取反、红灯暗、兰灯暗 light_change(LIGHT_PORT, LIGHT_PIN_GREEN); light_control(LIGHT_PORT, LIGHT_PIN_RED, LIGHT_OFF); light_control(LIGHT_PORT, LIGHT_PIN_BLUE, LIGHT_OFF); fl

4、ag = 3; break; /使用break case 3: /兰灯取反、红灯暗、绿灯暗 light_change(LIGHT_PORT, LIGHT_PIN_BLUE); light_control(LIGHT_PORT, LIGHT_PIN_RED, LIGHT_OFF); light_control(LIGHT_PORT, LIGHT_PIN_GREEN, LIGHT_OFF); flag = 1; default: /使用default flag = 1; break; 4函数 所谓函数,即子程序,也就是“语句的集合”,就是说 把经常使用的语句群定义成函数,供其他程序调用 ,函数的编

5、写与使用要遵循软件工程的基本规范。 特别关注: 嵌入式应用中有大量无返回值功能的函数,用于确 定系统配置或状态,用void在函数名字前面。 例如: KL25-Light例之 gpio.h 中(P.73) /函数名称:gpio_init /函数返回:无 /参数说明:port:端口号(gpio.h中宏定义,分别 为PORTAPORTE=04) / pin:引脚号(031,实际取值由芯片的物理引脚 决定) / dir:引脚方向(0=输入,1=输出) / state:引脚初始状态(0=低电平,1=高电平) /功能概要:初始化端口指定引脚作为GPIO引脚的 功能,并定义为输入或输出,若是输出, /还指定

6、初始状态是低电平或高电平 /= void gpio_init(uint_8 port, uint_8 pin, uint_8 dir, uint_8 state); /用在函数名前,表示没有返回值 在light.c中调用该函数(P.79)生成light_init函数 /函数名称:light_init /函数参数:port:端口名。由light.h中宏定义。 / pin::引脚号。由light.h中宏定义。 / state:设定小灯状态。由light.h中宏定义。 /函数返回:无 /功能概要:指示灯驱动初始化。 void light_init(uint_8 port, uint_8 pin, u

7、int_8 state) gpio_init(port, pin, 1, state); 在main.c中调用(P.79) light_init函数 /三色灯初始化 light_init(LIGHT_PORT, LIGHT_PIN_RED, LIGHT_OFF); light_init(LIGHT_PORT, LIGHT_PIN_GREEN, LIGHT_OFF); light_init(LIGHT_PORT, LIGHT_PIN_BLUE, LIGHT_OFF); 参数在light.h中定义(P.78) /指示灯端口及引脚定义 #define LIGHT_PORT PORTB /指示灯使用的

8、端口 #define LIGHT_PIN_RED 19 /指示灯使用的引脚 #define LIGHT_PIN_GREEN 18 #define LIGHT_PIN_BLUE 9 /灯状态宏定义(灯亮、灯暗对应的物理电平由硬件 接法决定) #define LIGHT_ON 0 /灯亮 #define LIGHT_OFF 1 /灯暗 带类型定义的函数例(P.73) /函数名称:gpio_get /函数返回:指定引脚的状态(1或0) /参数说明:port:端口号(gpio.h中由宏定义, 分别为PORTAPORTE=04) / pin:引脚号(031,实际取值由芯片的物理引 脚决定) /功能概要:

9、获取指定引脚的状态(1或0) uint_8 gpio_get(uint_8 port, uint_8 pin); / unit_8由typedef定义为8位无符号数,字节类型 5数组 在C语言中,数组是一个构造类型的数据,是由基本类 型数据按照一定的规则组成的。数组是有序数据的集合 ,数组中的每一个元素都属于同一个数据类型。用一个 统一的数组名和下标唯一地确定数组中的元素。 例如:KL25-Light例之 gpio.c 中(P.74) /各端口基地址放入常数数据组 PORT_ARR0PORT_ARR4中 const PORT_MemMapPtr PORT_ARR=PORTA_BASE_PTR,

10、PORTB_BASE_PTR, PORTC_BASE_PTR,PORTD_BASE _PTR,PORTE_BASE_PTR; 特别关注: 微控制器中数据的存储 以二进制形式表示的数据和代码存放在存储器或 者内存中。 内存由一系列基本存储单元线性地组成,每一个 基本存储单元有一个唯一的地址。通常,基本存 储单元由8个连续的位构成,可用于存储一个字节 的数据。所以,基本存储单元也被称为字节存储 单元。可以把内存看作为一个很大的一维字符数 组,把地址看作为标识数组元素的下标。 例如:int a5 则:a2=*(a+2) #include stdafx.h char buff = 3, 2, 1, 0

11、, 130 ; / 130=0 x82 int a, b; int main( int argc, char* argv ) char *p = buff; a = *( int* ) p; b = *( int* ) ( p+1 ); printf( a = %x, b=%xn, a, b ); printf( a = %d, b=%dn, a, b ); return 0; 6指针 指针是语言中广泛使用的一种数据类型。 特别关注: 运用指针是微控制器中语言应用的主要风格之 一。指针是指向变量的地址,实质上指针就是存 储单元的地址。 例如:KL25-Light(Simple)例之 main.

12、c 中(P.69) PORTB端口的引脚控制寄存器基地址为0 x4004A000u ,其中后缀u表示无符号数,给出不优化的32位指针 变量portB_ptr: volatile uint_32 *portB_ptr = (uint_32*)0 x4004A000u; PORTB19引脚控制寄存器地址=基地址+偏移量: volatile uint_32 *portB_PCR_19 = portB_ptr + 19; 这里是19,而不是19*4,由于定义了32位指针, portB_ptr加1相当于地址加4。portB_ptr加19代表了 portB_ptr地址加上19*4。 7结构体 结构体是由基

13、本数据类型构成的,并用一个标识符 来命名的各种变量的组合。结构体中可以使用不同 的数据类型。 特别关注: 在嵌入式程序中常使用typedef定义结构体类型,以 便程序通用和可移植。 例如:在工程文件夹的芯片头文件CPUMKL25Z4.h 中,定义端口寄存器结构体,把端口模块的编程寄 存器用一个结构体类型(PORT_MemMap)封装起来。 Typedef struct PORT_MemMap uint32_t PCR32; /引脚控制寄存器(031),偏移: 0 x0,间间隔: 0 x4 uint32_t GPCLR; /全局引脚控制寄存器(L),偏移:0 x80 uint32_t GPCHR

14、; /全局引脚控制寄存器(H),偏移:0 x84 uint8_t RESERVED_024; /保留(占位)(023) uint32_t ISFR; /中断状态标态标 志寄存器,偏移:0 xA0 volatile *PORT_MemMapPtr; 同时定义了不优化的PORT模块寄存器结构体指针( PORT_MemMapPtr),这样,只要给出端口基地址,就可 以使用该结构体的成员变量,实现对各寄存器的访问。 关于uint32_t类型: MKL25Z4.h中包含了stdint.h,stdint.h中定义了 int16_t 、 uint32_t 、 int64_t 等整型。 例如: /* Unsi

15、gned. */ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; 关于stdint.h : stdint.h是c99中引进的一个标准C库的头文件.,其 中定义了几种扩展的整数类型。规则如下(其中N可 以为8,16,32,64): intN_t /表示长度为N位的整型数; uintN_t /表示长度为N位的无符号整型数 ; 结构体指针对结构体成员访问: 例如: KL25-Light例之 gpio.c 中(P.76) void gpio_pull(uint_8 port,uint_8 pin, uint_8 pullselect) /局部变量声明 PORT_MemMapPtr port_ptr; /声明port_ptr 为PORT结构体类型指针 /根据带入参数port,给局部变量port_ptr赋

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号