KL26Z学习笔记
第三章 GPIO之LED
3.1硬件连接
通过开发板的原理图知道,LED0、LED1、LED2为共阳极接法,LED0、LED1、LED2分别与PTB18、PTB19、PTD1相连,当这几个脚为低电平时,LED亮。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg
3.2软件编程
3.2.1 编程思路及方法
1.使能系统时钟
2.设置IO口功能
1)是否为复用引脚
2)上拉OR下拉、输入OR输出、默认为高电平还是低电平(普通引脚)
3.在while(1)大循环中编写程序
3.2.2 具体驱动文件和子函数
1.在开发板光盘中提供的光盘作为模版,一共三个文件夹,如图所示
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.jpg
其中common文件夹存放的文件是每个工程所必要的程序,APP文件夹放的是main.c和全部头文件includes.h,Dry文件夹是自己添加外设的.c和.h文件夹,注意将新建文件夹的路径添加到KEIL。
2.system_MKL25Z4.c
这个文件中主要包含两个函数SystemInit()和SystemCoreClockUpdate(),其中SystemInit()在程序开始已经执行,对于系统时钟初始化只需要调用SystemCoreClockUpdate()函数即可。
3. MKL25Z4.h
这个头文件定义了个个模块的寄存器。
4.MKL_gpio.h
1)PORT配置
- #define MKL_PORTA A
- #define MKL_PORTB B
- #define MKL_PORTC C
- #define MKL_PORTD D
- #define MKL_PORTE E
-
- #defineIO_DIS_IRQ 0x0
- #defineIO_DMA_RISE_IRQ 0x1
- #defineIO_DMA_FALL_IRQ 0x2
- #defineIO_DMA_EITHER_IRQ 0x3
- #defineIO_LOW_LEVEL_IRQ 0x8
- #defineIO_HIGH_LEVEL_IRQ 0xc
- #defineIO_RISE_EDGE_IRQ 0x9
- #defineIO_FALL_EDGE_IRQ 0xa
- #defineIO_EITHER_EDGE_IRQ 0xb
2)PORT时钟配置函数(PTO端口号)
- PORT_ENABLE_CLK(PTO)
- PORT_DISABLE_CLK(PTO)
3)IO口功能配置函数
- IO_FUN_SEL(PTO,BIT,FUN) //PT0端口号、BIT引脚、FUN功能选择
4)GPIO配置
- #definePDDR(PTO) GPIO##PTO##_PDDR
- #definePSOR(PORT) GPIO##PORT##_PSOR
- #definePCOR(PORT) GPIO##PORT##_PCOR
- #definePTOR(PORT) GPIO##PORT##_PTOR
- #definePDOR(PORT) GPIO##PORT##_PDOR
- #definePDIR(PORT) GPIO##PORT##_PDIR
5)GPIO按位输入输出控制
- #defineGPIO_DDR_OUTPUT(POT,BIT) PDDR(POT)|= (1 << BIT)
- #defineGPIO_DDR_INPUT(POT,BIT) PDDR(POT)&= ~(1 << BIT)
6)GPIO按PORT输入输出控制
- #definePORT_DDR_OUTPUT(POT,BITS) PDDR(POT)|= BITS
- #definePORT_DDR_INPUT(POT,BITS) PDDR(POT)&= ~BITS
7)GPIO按位置1、置0、翻转控制
- #defineGPIO_SET(POT,BIT) PSOR(POT)= (1 << BIT)
- #defineGPIO_CLR(POT,BIT) PCOR(POT)= (1 << BIT)
- #defineGPIO_TOGGLE(POT,BIT) PTOR(POT)= (1 << BIT)
8)GPIO按PORT置1、置0、翻转控制
- #definePORT_SET(POT,BITS) PSOR(POT)= BITS
- #definePORT_CLR(POT,BITS) PCOR(POT)= BITS
- #definePORT_TOGGLE(POT,BITS) PTOR(POT)= BITS
9)GPIO输入值读取
- #defineGPIO_GET_VALUE(POT,BIT) ~(~(PDIR(POT) & (1 << BIT)))
- #definePORT_GET_VALUE(POT) PDIR(POT)
5.includes.h
1)自定义数据结构
- typedef unsigned char BOOLEAN; /* 布尔变量 */
- typedef unsigned char INT8U; /* 无符号8位整型变量 */
- typedef signed char INT8S; /* 有符号8位整型变量 */
- typedef unsigned short INT16U; /* 无符号16位整型变量 */
- typedef signed short INT16S; /* 有符号16位整型变量 */
- typedef unsigned long INT32U; /* 无符号32位整型变量 */
- typedef signed long INT32S; /* 有符号32位整型变量 */
- typedef unsigned long long INT64U; /* 无符号64位整型变量 */
- typedef signed long longINT64S; /* 有符号64位整型变量 */
- typedef float FP32; /* 单精度浮点数(32位长度) */
- typedef double FP64; /* 双精度浮点数(64位长度) */
- typedef unsigned char uint8; /* 无符号8位整型变量 */
- typedef unsigned short int uint16;/* 无符号16位整型变量 */
- typedef unsigned long int uint32;/* 无符号32位整型变量 */
- typedef char int8;/* 有符号8位整型变量 */
- typedef short int int16; /* 有符号16位整型变量 */
- typedef int int32; /* 有符号32位整型变量 */
- typedefvolatile int8 vint8; /* 8bits */
- typedefvolatile int16 vint16; /* 16 bits */
- typedefvolatile int32 vint32; /* 32 bits */
- typedefvolatile uint8 vuint8; /* 8 bits */
- typedefvolatile uint16 vuint16; /* 16 bits */
- typedefvolatile uint32 vuint32; /* 32 bits*/
2)Standard header files标准头文件
- #include<stdio.h>
- #include<string.h>
- #include<ctype.h>
- #include<stdlib.h>
- //externvoid UART0_IRQHandler(void);
- //externvoid UART1_IRQHandler(void);
- //externvoid UART2_IRQHandler(void);
3)CMSIS 头文件(不用管)
4)Common's headerfiles 公共头文件
- #include"MKL25Z4.h"
- #include"system_MKL25Z4.h"
- /** * * * * * * 暂时使用* * * * * * * * */
- #include<core_cm0.h> /* CMSIS File of Cortex-M0 */
5)Driver's headerfiles 驱动头文件
- #include"MKL_uart.h"
- #include"MKL_gpio.h"
6)User's header files 用户头文件
- #include"main.h"
3.2.3 主函数编程
1.延时函数,暂时使用光盘给的,应该可以利用systick编写精确的延时函数
- voidmyDelay (INT32U ulTime)
- {
- INT32U i;
- i = 0;
- while (ulTime--) {
- for (i = 0; i < 5000; i++);
- }
- }
估计是一次是5ms。
2.intmain()编程
1)系统时钟初始化SystemCoreClockUpdate();
2)开启PORTB、PORTD时钟
- SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
- | SIM_SCGC5_PORTB_MASK
- | SIM_SCGC5_PORTC_MASK
- |SIM_SCGC5_PORTD_MASK
- | SIM_SCGC5_PORTE_MASK );
- PORT_ENABLE_CLK(MKL_PORTB);
- PORT_ENABLE_CLK(MKL_PORTD);
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.jpg
PORTA、B、C、D、E的时钟使能在这个寄存器上
3)设置PORTB18,PORTB19,PORTD1为普通引脚
- IO_FUN_SEL(MKL_PORTB,18,1); IO_FUN_SEL(MKL_PORTB,19,1);
- IO_FUN_SEL(MKL_PORTD,1,1);
4)设置PORTB18,PORTB19,PORTD1为输出
- GPIO_DDR_OUTPUT(MKL_PORTB,18); GPIO_DDR_OUTPUT(MKL_PORTB,19);
- GPIO_DDR_OUTPUT(MKL_PORTD,1);
5)设置PORTB18,PORTB19,PORTD1为默认高电平
- GPIO_SET(MKL_PORTB,18);
- GPIO_SET(MKL_PORTB,19);
- GPIO_SET(MKL_PORTD,1);
6)在while(1)里设置引脚电平,利用GPIO_SET(POT,BIT)、GPIO_CLR(POT,BIT)或者GPIO_TOGGLE(POT,BIT)进行流水灯编程。
3.2.4 实验结果
帮小编,小小的编辑了一下帖子,期待小编更多的分享。
谢啦,应该第一个图片对应1.JPG
有文字和图片的话,应该先添加图片,然后在描述中写呗
真的很不错
不知小编是否还有其他资料!