打印
[Kinetis]

【连载】KL26Z学习笔记

[复制链接]
1995|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aaaxxxrrr|  楼主 | 2015-9-18 19:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 aaaxxxrrr 于 2015-9-18 19:14 编辑

第三章 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_image006.jpg
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.在开发板光盘中提供的光盘作为模版,一共三个文件夹,如图所示

相关帖子

沙发
aaaxxxrrr|  楼主 | 2015-9-18 19:16 | 只看该作者
继续

2.JPG (26.23 KB )

2.JPG

1.JPG (121 KB )

1.JPG

使用特权

评论回复
板凳
aaaxxxrrr|  楼主 | 2015-9-18 19:16 | 只看该作者
其中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
   
#define IO_DIS_IRQ            0x0
#define IO_DMA_RISE_IRQ       0x1
#define IO_DMA_FALL_IRQ       0x2
#define IO_DMA_EITHER_IRQ     0x3
#define IO_LOW_LEVEL_IRQ      0x8
#define IO_HIGH_LEVEL_IRQ     0xc
#define IO_RISE_EDGE_IRQ      0x9
#define IO_FALL_EDGE_IRQ      0xa
#define IO_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功能选择
        

使用特权

评论回复
地板
aaaxxxrrr|  楼主 | 2015-9-18 19:16 | 只看该作者
4)GPIO配置
#define PDDR(PTO)     GPIO##PTO##_PDDR
#define PSOR(PORT)    GPIO##PORT##_PSOR
#define PCOR(PORT)    GPIO##PORT##_PCOR
#define PTOR(PORT)    GPIO##PORT##_PTOR
#define PDOR(PORT)    GPIO##PORT##_PDOR
#define PDIR(PORT)    GPIO##PORT##_PDIR

5)GPIO按位输入输出控制

#define GPIO_DDR_OUTPUT(POT,BIT)        PDDR(POT) |= (1 << BIT)
#define GPIO_DDR_INPUT(POT,BIT)         PDDR(POT) &= ~(1 << BIT)

6)GPIO按PORT输入输出控制
#define PORT_DDR_OUTPUT(POT,BITS)       PDDR(POT) |= BITS
#define PORT_DDR_INPUT(POT,BITS)        PDDR(POT) &= ~BITS

7)GPIO按位置1、置0、翻转控制
#define GPIO_SET(POT,BIT)               PSOR(POT) = (1 << BIT)     
#define GPIO_CLR(POT,BIT)               PCOR(POT) = (1 << BIT)     
#define GPIO_TOGGLE(POT,BIT)            PTOR(POT) = (1 << BIT)     

8)GPIO按PORT置1、置0、翻转控制
#define PORT_SET(POT,BITS)              PSOR(POT) = BITS   
#define PORT_CLR(POT,BITS)              PCOR(POT) = BITS   
#define PORT_TOGGLE(POT,BITS)           PTOR(POT) = BITS

9)GPIO输入值读取
#define GPIO_GET_VALUE(POT,BIT)         ~(~(PDIR(POT) & (1 << BIT)))
#define PORT_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位整型变量           */

typedef volatile int8  vint8;   /*  8 bits */
typedef volatile int16 vint16;  /* 16 bits */
typedef volatile int32        vint32;    /* 32 bits */

typedef volatile uint8  vuint8;      /*  8 bits */
typedef volatile uint16        vuint16;       /* 16 bits */
typedef volatile uint32 vuint32;     /* 32 bits */

使用特权

评论回复
5
aaaxxxrrr|  楼主 | 2015-9-18 19:17 | 只看该作者
2)Standard header files 标准头文件

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
//extern void UART0_IRQHandler(void);
//extern void UART1_IRQHandler(void);
//extern void UART2_IRQHandler(void);

3)CMSIS 头文件(不用管)

4)Common's header files  公共头文件

#include "MKL25Z4.h"
#include "system_MKL25Z4.h"

/* * * * * * * * 暂时使用* * * * * * * * */

#include <core_cm0.h>                                                   /* CMSIS File of Cortex-M0      */

5)Driver's header files  驱动头文件

#include "MKL_uart.h"
#include "MKL_gpio.h"

6)User's header files 用户头文件
#include "main.h"
3.2.3 主函数编程
1.延时函数,暂时使用光盘给的,应该可以利用systick编写精确的延时函数
void myDelay (INT32U ulTime)
{
    INT32U i;

    i = 0;
    while (ulTime--) {
        for (i = 0; i < 5000; i++);
    }
}
估计是一次是5ms。
2.int main()编程
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);

使用特权

评论回复
6
aaaxxxrrr|  楼主 | 2015-9-18 19:18 | 只看该作者
来个图

3.JPG (125.28 KB )

3.JPG

使用特权

评论回复
7
aaaxxxrrr|  楼主 | 2015-9-18 19:18 | 只看该作者
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 实验结果

4.JPG (125.89 KB )

4.JPG

使用特权

评论回复
8
Roderman_z| | 2015-9-18 22:12 | 只看该作者
这个连载不错,可以跟着一步步的学习

使用特权

评论回复
9
皈依| | 2015-9-19 16:42 | 只看该作者
看到寄存器就头晕。

使用特权

评论回复
10
aaaxxxrrr|  楼主 | 2015-9-20 13:34 | 只看该作者
Roderman_z 发表于 2015-9-18 22:12
这个连载不错,可以跟着一步步的学习

谢谢,我会继续努力的

使用特权

评论回复
11
aaaxxxrrr|  楼主 | 2015-9-20 13:35 | 只看该作者
皈依 发表于 2015-9-19 16:42
看到寄存器就头晕。

还是会点寄存器比较好,加油

使用特权

评论回复
12
皈依| | 2015-9-20 20:30 | 只看该作者
aaaxxxrrr 发表于 2015-9-20 13:35
还是会点寄存器比较好,加油

是的~寄存器是基础~

使用特权

评论回复
13
cowboy2014| | 2015-9-20 20:31 | 只看该作者
楼主,你的资料在哪里下载呢?

使用特权

评论回复
14
大苏牙| | 2015-9-20 21:44 | 只看该作者
aaaxxxrrr 发表于 2015-9-18 19:16
其中common文件夹存放的文件是每个工程所必要的程序,APP文件夹放的是main.c和全部头文件includes.h,Dry文 ...
#define MKL_PORTA               A
#define MKL_PORTB               B
#define MKL_PORTC               C
#define MKL_PORTD               D
#define MKL_PORTE               E
   
#define IO_DIS_IRQ            0x0
#define IO_DMA_RISE_IRQ       0x1
#define IO_DMA_FALL_IRQ       0x2
#define IO_DMA_EITHER_IRQ     0x3
#define IO_LOW_LEVEL_IRQ      0x8
#define IO_HIGH_LEVEL_IRQ     0xc
#define IO_RISE_EDGE_IRQ      0x9
#define IO_FALL_EDGE_IRQ      0xa
#define IO_EITHER_EDGE_IRQ    0xb   
2)PORT时钟配置函数(PTO端口号)
PORT_ENABLE_CLK(PTO)        
PORT_DISABLE_CLK(PTO)      

这样看舒服些

使用特权

评论回复
15
芙蓉洞| | 2015-9-21 09:02 | 只看该作者
您那有没有最基础的知识呢,讲解KL26单片机的

使用特权

评论回复
16
FSL_TICS_ZJJ| | 2015-9-21 09:37 | 只看该作者
感谢楼主的经验分享。

使用特权

评论回复
17
FSL_TICS_ZJJ| | 2015-9-21 09:39 | 只看该作者
芙蓉洞 发表于 2015-9-21 09:02
您那有没有最基础的知识呢,讲解KL26单片机的

如果要KL26的,建议你去官网下载一个KL25的快速指南,很基础也很易懂。
现在已经有中文版的了:
http://cache.freescale.com/zh-Ha ... on&fileExt=.pdf

使用特权

评论回复
18
aaaxxxrrr|  楼主 | 2015-9-21 10:23 | 只看该作者

谢谢,下回这样发

使用特权

评论回复
19
aaaxxxrrr|  楼主 | 2015-9-21 10:26 | 只看该作者
这是官方给的

开发板烧写测试使用手册.pdf

2 MB

软硬件使用手册.pdf

97.14 KB

使用特权

评论回复
20
aaaxxxrrr|  楼主 | 2015-9-21 10:27 | 只看该作者
应用手册自己去下载吧,太大传不上来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

99

帖子

1

粉丝