微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > KL26Z学习笔记

KL26Z学习笔记

时间:10-02 整理:3721RD 点击:

第三章 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配置

  1. #define MKL_PORTA               A
  2. #define MKL_PORTB               B
  3. #define MKL_PORTC               C
  4. #define MKL_PORTD               D
  5. #define MKL_PORTE               E
  6.    
  7. #defineIO_DIS_IRQ            0x0
  8. #defineIO_DMA_RISE_IRQ       0x1
  9. #defineIO_DMA_FALL_IRQ       0x2
  10. #defineIO_DMA_EITHER_IRQ     0x3
  11. #defineIO_LOW_LEVEL_IRQ      0x8
  12. #defineIO_HIGH_LEVEL_IRQ     0xc
  13. #defineIO_RISE_EDGE_IRQ      0x9
  14. #defineIO_FALL_EDGE_IRQ      0xa
  15. #defineIO_EITHER_EDGE_IRQ    0xb   

复制代码


2)PORT时钟配置函数(PTO端口号)

  1. PORT_ENABLE_CLK(PTO)        
  2. PORT_DISABLE_CLK(PTO)  

复制代码


   

3)IO口功能配置函数

  1. IO_FUN_SEL(PTO,BIT,FUN)  //PT0端口号、BIT引脚、FUN功能选择

复制代码


        

4)GPIO配置

  1. #definePDDR(PTO)     GPIO##PTO##_PDDR
  2. #definePSOR(PORT)    GPIO##PORT##_PSOR
  3. #definePCOR(PORT)    GPIO##PORT##_PCOR
  4. #definePTOR(PORT)    GPIO##PORT##_PTOR
  5. #definePDOR(PORT)    GPIO##PORT##_PDOR
  6. #definePDIR(PORT)    GPIO##PORT##_PDIR

复制代码


5)GPIO按位输入输出控制

  1. #defineGPIO_DDR_OUTPUT(POT,BIT)        PDDR(POT)|= (1 << BIT)
  2. #defineGPIO_DDR_INPUT(POT,BIT)         PDDR(POT)&= ~(1 << BIT)

复制代码

6)GPIO按PORT输入输出控制

  1. #definePORT_DDR_OUTPUT(POT,BITS)       PDDR(POT)|= BITS
  2. #definePORT_DDR_INPUT(POT,BITS)        PDDR(POT)&= ~BITS

复制代码

7)GPIO按位置1、置0、翻转控制

  1. #defineGPIO_SET(POT,BIT)               PSOR(POT)= (1 << BIT)     
  2. #defineGPIO_CLR(POT,BIT)               PCOR(POT)= (1 << BIT)     
  3. #defineGPIO_TOGGLE(POT,BIT)            PTOR(POT)= (1 << BIT)   

复制代码

8)GPIO按PORT置1、置0、翻转控制

  1. #definePORT_SET(POT,BITS)              PSOR(POT)= BITS   
  2. #definePORT_CLR(POT,BITS)              PCOR(POT)= BITS   
  3. #definePORT_TOGGLE(POT,BITS)           PTOR(POT)= BITS

复制代码


9)GPIO输入值读取

  1. #defineGPIO_GET_VALUE(POT,BIT)        ~(~(PDIR(POT) & (1 << BIT)))
  2. #definePORT_GET_VALUE(POT)             PDIR(POT)

复制代码


5.includes.h

1)自定义数据结构

  1. typedef unsigned char    BOOLEAN;    /* 布尔变量   */
  2. typedef unsigned char     INT8U;  /* 无符号8位整型变量  */
  3. typedef signed  char    INT8S;    /* 有符号8位整型变量 */
  4. typedef unsigned short   INT16U;  /* 无符号16位整型变量           */
  5. typedef signed  short  INT16S;    /* 有符号16位整型变量           */
  6. typedef unsigned long   INT32U;   /* 无符号32位整型变量           */
  7. typedef signed  long  INT32S;    /* 有符号32位整型变量           */
  8. typedef unsigned long long INT64U;  /* 无符号64位整型变量           */
  9. typedef signed long longINT64S;  /* 有符号64位整型变量           */
  10. typedef float FP32;    /* 单精度浮点数(32位长度)     */
  11. typedef double FP64;    /* 双精度浮点数(64位长度)     */
  12. typedef unsigned char uint8;  /* 无符号8位整型变量            */
  13. typedef unsigned short int uint16;/* 无符号16位整型变量           */
  14. typedef unsigned long int uint32;/* 无符号32位整型变量    */
  15. typedef char  int8;/* 有符号8位整型变量            */
  16. typedef short int int16;      /* 有符号16位整型变量           */
  17. typedef int  int32;      /* 有符号32位整型变量           */
  18. typedefvolatile int8  vint8;   /*  8bits */
  19. typedefvolatile int16 vint16;  /* 16 bits */
  20. typedefvolatile int32   vint32;    /* 32 bits */
  21. typedefvolatile uint8  vuint8;      /* 8 bits */
  22. typedefvolatile uint16  vuint16;       /* 16 bits */
  23. typedefvolatile uint32 vuint32;     /* 32 bits*/

复制代码


2)Standard header files标准头文件

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<ctype.h>
  4. #include<stdlib.h>
  5. //externvoid UART0_IRQHandler(void);
  6. //externvoid UART1_IRQHandler(void);
  7. //externvoid UART2_IRQHandler(void);

复制代码


3)CMSIS 头文件(不用管)

4)Common's headerfiles  公共头文件

  1. #include"MKL25Z4.h"
  2. #include"system_MKL25Z4.h"
  3. /** * * * * * * 暂时使用* * * * * * * * */
  4. #include<core_cm0.h>                                                  /* CMSIS File of Cortex-M0      */

复制代码


5)Driver's headerfiles  驱动头文件

  1. #include"MKL_uart.h"
  2. #include"MKL_gpio.h"

复制代码


6)User's header files 用户头文件

  1. #include"main.h"

复制代码


3.2.3 主函数编程

1.延时函数,暂时使用光盘给的,应该可以利用systick编写精确的延时函数

  1. voidmyDelay (INT32U ulTime)
  2. {
  3.     INT32U i;
  4.     i = 0;
  5.     while (ulTime--) {
  6.         for (i = 0; i < 5000; i++);
  7.     }
  8. }

复制代码


估计是一次是5ms。

2.intmain()编程

1)系统时钟初始化SystemCoreClockUpdate();

2)开启PORTB、PORTD时钟

  1. SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
  2.                  | SIM_SCGC5_PORTB_MASK
  3.                  | SIM_SCGC5_PORTC_MASK
  4.                  |SIM_SCGC5_PORTD_MASK
  5.                   | SIM_SCGC5_PORTE_MASK );
  6. PORT_ENABLE_CLK(MKL_PORTB);                                                         
  7. 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为普通引脚

  1. IO_FUN_SEL(MKL_PORTB,18,1);                                             IO_FUN_SEL(MKL_PORTB,19,1);
  2. IO_FUN_SEL(MKL_PORTD,1,1);

复制代码


4)设置PORTB18,PORTB19,PORTD1为输出

  1. GPIO_DDR_OUTPUT(MKL_PORTB,18);                                          GPIO_DDR_OUTPUT(MKL_PORTB,19);
  2. GPIO_DDR_OUTPUT(MKL_PORTD,1);

复制代码


5)设置PORTB18,PORTB19,PORTD1为默认高电平

  1. GPIO_SET(MKL_PORTB,18);                                             
  2. GPIO_SET(MKL_PORTB,19);
  3. 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

有文字和图片的话,应该先添加图片,然后在描述中写呗

真的很不错

不知小编是否还有其他资料!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top