《一天攻破K60》笔记(使用山外库5.3版本)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lczdk/article/details/53891920

K60引脚功能表

注意:本功能表只是阐述各个引脚支持的功能,具体引脚名称标注和排列方式以相应最小系统板为准
这里写图片描述

IAR工程的建立

建立工作空间

File->New->WorkSpace

建立工程

Project->Create New Project

工程文件配置

工程名上右键选择options
(具体)配置方法参照《一天攻破K60》中的IAR配置章节

山外库工程目录结构

  • App(用户程序)
    • Inc(头文件)
  • Board(开发板驱动程序,用于驱动山外开发板上的外设)
    • Inc(头文件)
    • Src(源文件)
  • Chip(K60芯片驱动程序)
    • Inc(头文件)
      • IAR(与IAR相关的头文件)
      • kinetis(与kinetis muc相关的头文件)
    • Src(源文件)
      • IAR (与IAR相关源文件)
  • Lib(库代码)
  • Prj(工程文件)
    • IAR(IAR相关工程文件)
      • config files (配置文件)

复用管脚的配置

(复用管脚:多功能管脚)

复用管脚配置文件位置

App\Inc\PORT_cfg.h
使用时,根据文件内的注释对各功能模块的对应复用管脚号进行修改即可(也可以之后用PORT库函数port_init实现管脚复用,这样就不用麻烦的修改文件了)

PS:ADC模块因为固定了对应端口,因此无法自行配置对应的端口管脚,可在Chip\Inc\MK60_ADC.h中查询对应的端口管脚

中断函数的配置

使用中断的方法

  1. 在App\MK60_it.c中编写好中断函数(函数应该无参数,并且返回类型为void)
  2. 通过在使能中断之前运行set_vector_handler函数来修改中断向量表中的中断函数入口

set_vector_handler函数说明

原型:void set_vector_handler(VECTORn_t vector,void pfun_handler(void))
参数:vector   中断号枚举类型(VECTORn_t)的参数,在Chip\Inc\common.h中定义了这个枚举类型(中断向量表编号声明部分),使用时可查询
     pfun_handler(void)    返回值为void类型的函数,填入自己的中断函数函数名

NVIC_EnableIRQ函数说明

原型:static inline void NVIC_EnableIRQ(VECTORn_t vector)
参数:vector   中断号枚举类型(VECTORn_t)的参数,在Chip\Inc\common.h中定义了这个枚举类型(中断向量表编号声明部分),使用时可查询

NVIC_DisnableIRQ函数说明

原型:static inline void NVIC_DisableIRQ(VECTORn_t vector)
参数:vector   中断号枚举类型(VECTORn_t)的参数,在Chip\Inc\common.h中定义了这个枚举类型(中断向量表编号声明部分),使用时可查询

PS:关于关键字inline:

内联inline是给编译器的优化提示,如果一个函数被编译成inline的话,那么就会把函数里面的代码直接插入到调用这个函数的地方,而不是用调用函数的形式。如果函数体代码很短的话,这样会比较有效率,因为调用函数的过程也是需要消耗资源的。但是你inline只是给编译器的提示,编译器会根据实际情况自己决定到底要不要进行内联,如果函数过大、有函数指针指向这个函数或者有递归的情况下编译器都不会进行内联。

PORT模块驱动库

port模块简介

port模块是管脚管理模块,用于控制每个管脚复用到不同的内部模块,以及配置管脚属性

常用枚举说明

  • PTXn_e,管脚编号(PTA0,PTA1,…,PTE31)每个编号是独一无二的
  • PTn_e,管脚位号(PT0,PT1,…,PT31)每个端口包含31位
  • PTx_e,管脚端口(PTA,PTB,…,PTE)共5个端口
  • cfg,属性配置(具体可以使用的值见下方截图)
    1

库函数说明

  • port_init
    • 函数原型:void port_init(PTXn_e,uint32 cfg)
    • 作用:用于初始化引脚,并配置MUX复用功能
    • 例子:port_init (PTA8, IRQ_RISING | PF | ALT1 | PULLUP ); //初始化 PTA8 管脚,上升沿触发中断,带无源滤波器,复用功能为 GPIO ,上拉电阻
  • port_init_NoALT
    • 函数原型:void port_init_NoALT (PTXn_e , uint32 cfg)
    • 作用:用于初始化引脚,不改变原有的MUX复用功能
    • 例子:port_init_NoALT(PTA8, IRQ_RISING | PF | PULLUP ); //初始化 PTA8 管脚,上升沿触发中断,带无源滤波器,上拉电阻
  • PORT_FUNC //这本质上是一个宏定义,不过用法和库函数相同
    • 函数原型:PORT_FUNC(管脚模块号(ABCDE),管脚位号(1~31),用户函数名);
    • 作用:用于PORT中断函数(PORT中断函数:类似于51单片机中的外部中断,通过管脚电平的改变来触发的中断)中,简化函数编写
    • 例子:常规的 PORT 中断服务函数(前者)与使用PORT_FUNC宏定义(后者)的比较:
void porta_handler(void)
 {
 uint8 n = 0; //引脚号

 //PTA6
 n = 6;
 if (PORTA_ISFR & (1 << n)) { //PTA6 触发中断
 PORTA_ISFR = (1 << n); //写 1 清中断标志位

 /* 以下为用户任务 */
 key();

 /* 以上为用户任务 */
 }
 }
void porta_handler(void)
{
     PORT_FUNC(A,6,key);//PTA6触发中断,执行用户函数key
}

GPIO模块

模块简介

GPIOGeneralPurposeInputandOutput通用输入输出接口。K60单片机中就是指那些PTA,PTB…口。所谓的GPIO就是最简单的数字输入输出引脚,作为输出可以有两种状态:0和1;作为输入,它接收外面输入的数字信号。 在一般单片机上GPIO是组织成几个组的,比如K60单片机把GPIO组织成5个组:

(1)A口有26个引脚,分别为PTA0~PTA19、PTA24~PTA29;
(2)B口有20个引脚,分别为PTB0~PTB11、PTB16~PTB23;
(3)C口有20个引脚,分别为PTC0~PTC19;
(4)D口有16个引脚,分别为PTD0~PTD15;
(5)E口有18个引脚,分别为PTE0~PTE12、PTE24~PTE28

GPIO的应用场合非常多,可以是驱动LED,也可以驱动继电器,也可以是接收外部传来的任何数据信号,所以它才被称为通用输入输出接口。

许多引脚都是复用的,利用Port控制模块选择控制每个引脚上的可用的复用功能(详见前文引脚功能表)。

常用形参

形参变量 作用 值域
PTXn_e 指明操作的管脚编号 PTA0 ~ PTE31
GPIO_CFG 输入输出配置 GPI(输入)、GPO(输出)
data 数据 1(一般指高电平)、0(一般指低电平)

库函数原型

原型:void gpio_init (PTXn_e, GPIO_CFG, uint8 data)
用途:初始化 gpio,设置端口的输入输出方向,输出数据。初始化后,才能对 IO 口进行读取或电平设置。
例子:gpio_init (PTA8, GPI,0); //初始化 PTA8 管脚为输入

原型: void gpio_ddr (PTXn_e, GPIO_CFG)
用途:设置引脚数据方向。
例子:gpio_ddr (PTA8, GPI); //设置 PTA8 管脚为输入

原型:void gpio_set (PTXn_e, uint8 data)
用途:设置引脚状态。(只用于输出引脚,即GPO)
例子:gpio_set (PTA8, 1); // PTA8 管脚 输出 1

原型:void gpio_turn (PTXn_e)
用途:翻转 IO 口电平(只用于输出引脚,即GPO)
例子:gpio_turn (PTA8); // PTA8 管脚 输出 反转

原型:uint8 gpio_get (PTXn_e)
用途:读取引脚状态并返回 1bit 的端口电平状态。(只用于输入引脚,即GPI)
例子:uint8 pta8_data = gpio_get (PTA8); // 获取 PTA8 管脚 输入电平

宏定义用法

1位引脚配置宏

参数说明
x = 端口号(A~E)
n = 位号(具体可用位号总每个端口不同,可查阅文章第一节的表格的ALT1列)

宏名称 功能 用法举例 备注
PTxn_OUT 设置电平输出(只用于输出引脚,即GPO) PTA0_OUT = 1; //PTA0 输出高电平
PTE28_OUT = 0; //PTE28 输出低电平
1为高电平
0为低电平
PTxn_IN 读取电平输入(只用于输入引脚,即GPI) data=PTA0_IN; //读取 PTA0 输入电平
PTxn_DDR 设置引脚数据方向 PTA0_DDR=0; //设置 PTA0 为输入
PTB16_DDR=1; //设置 PTB16 为输出
1为输出
0为输入
PTxn_T 翻转 IO 口电平(只用于输出引脚,即GPO) PTB16_T=1; //反转 PTB16 引脚输出电平状态
PTE28_T=0; //保持 PTE28 引脚输出电平状态
1为翻转
0为保持

8位引脚配置宏

参数说明
x = 端口号(A~E)
n = 可选:0 ~ 3(0 = 7~0位;1 = 15~8位;2 = 23~16位;3 = 31~24位)

宏名称 功能 用法举例 备注
PTx_Bn_OUT 设置 8 位引脚输出电平(只用于输出引脚,即GPO) PTA_B0_OUT=0x12 //表示 PTA7~ PTA0 8 位输出 0x12
PTA_B2_OUT=0x12 //表示 PTA23~ PTA16 8 位输出 0x12
共8bit数据,由高位到低位分别对应到序号由大到小的管脚
PTx_Bn_IN 读取 8 位引脚输入电平(只用于输入引脚,即GPI) char data = PTA_B0_IN; //表示 PTA7~ PTA0 8 位数据输入到 data 变量 共8bit数据,由高位到低位分别对应到序号由大到小的管脚
PTx_Bn_DDR 设置 8 位引脚输入输出方向 PTA_B0_DDR=0xFF; // 表示 PTA7~ PTA0 8 位设置输入输出方向为输出
PTB_B0_DDR=0xF0; //表示PTB7~PTB4输出高电平,PTB3~PTB0输出低电平
1为高电平
0为低电平
共8bit,由高位到低位分别对应到序号由大到小的管脚
PTx_Bn_T 翻转 8 位引脚状态 PTA_B2_T=0xFF; // 表示 PTA23~ PTA16 8 位管脚的输出电平反转
PTA_B2_T=0x0F; // 表示 PTA23~ PTA20 4 位管脚的输出电平反转,PTA19~ PTA16 4 位管脚的输出电平保持不变
1为翻转
0为保持原状
共8bit,由高位到低位分别对应到序号由大到小的管脚

16位引脚配置宏

参数说明
x = 端口号(A~E)
n = 可选:0 ~ 1(0 = 15~0位;1 = 31~16位)

宏名称

PTx_Wn_OUT
PTx_Wn_IN
PTx_Wn_DDR
PTx_Wn_T

PS:功能与使用方法参考上文8位引脚配置宏中的方法和例程(赋值数据改为16位,eg.0xFFFF)

32位引脚配置宏

参数说明
x = 端口号(A~E)

宏名称

PTx_OUT
PTx_IN
PTx_DDR
PTx_T

PS:功能与使用方法参考上文8位引脚配置宏中的方法和例程(赋值数据改为32位,eg.0xFFFFFFFF)

自定义位数引脚配置宏

参数说明
NBIT = 要配置的位数(包括最低位)
PTxn = 最低位(X = 端口号,n = 位号)
data = 数据(数据位数根据选择的位数决定)
ddr = 翻转配置参数(1 = 翻转IO口,0 = 保持不变)

宏原型 功能 用法举例
GPIO_SET_NBIT(NBIT,PTxn,data) 设置 NBIT 位 (最低位为 PTxn)的输出电平为 data GPIO_SET_NBIT(4,PTA8,9); //PTA11~PTA8 输出数据为 9
GPIO_SET_NBIT(2,PTA8,9); //PTA9 ~PTA8 输出数据为 1( 9 超过 2bit,仅低位数据有效)
GPIO_GET_NBIT(NBIT,PTxn) 读取 NBIT 位 (最低位为 PTxn)引脚输入状态 data = GPIO_GET_NBIT(4,PTA8); //读取 PTA11~PTA8,共 4bit 输入电平到变量 data 里
GPIO_DDR_NBIT(NBIT,PTxn,ddr) 设置 NBIT 位 (最低位为 PTxn)引脚输入输出方向 GPIO_DDR_NBIT(4,PTA8,9); //PTA11,PTA8 为输出;PTA10,PTA9 为输入
GPIO_T_NBIT(NBIT,PTxn,data) 反转 NBIT 位 (最低位为 PTxn)管脚的输出电平 GPIO_T_NBIT(4,PTA8,9); //反转 PTA11,PTA8 的输出电平;保持 PTA10,PTA9 为输出电平不变

UART模块

UART模块简介

Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置
UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。

常用形参说明

这里写图片描述

PS:可以在App/Inc/port_cfg.h文件中查询与配置各个UART模块通道对应的管脚(一个通道对应RXD,TXD两个引脚)

库函数说明

接收类函数

函数原型 功能 用法举例 备注
void uart_init (UARTn_e, uint32 baud); 初始化 uartx 模块 uart_init (UART1,19200); //初始化 串口 1 波特率为 19200
void uart_getchar (UARTn_e, char *ch); 等待接收 1 个字节,如果一直没接收到数据,会一直卡住循环里等到接收到为止。 uart_getchar (UART3,&ch); //等待接收 1 个字节,保存到 ch 里 第二个参数是存储字符的地址
char uart_querychar (UARTn_e, char *ch);
char uart_querychar (UARTn_e, char *ch); 查询接收 1 个字符,若接收到数据则返回1并存储到ch形参指向的地址,否则返回0 char ch ;
if( uart_querychar (UART3,&ch) == 1) //查询接收通信缓冲区内 1 个字符,保存到 ch 里
{
printf(“成功接收到一个字节”);
}
uint32 uart_querystr (UARTn_e, char *str, uint32 max_len); 查询接收通信缓冲区内字符串,最后接收到的字符后会自动加入 0x00 表示字符串结尾。返回接收到的字节数 char str[100];
uint32 num;
num = uart_querystr(UART3,&str,100-1);//在最大可存储字节上减一字节空出给’\0’
is(num != 0)
{
printf(“成功接收到%d 个字节:%s”,num,str);
}
uint32 uart_querybuff (UARTn_e, char *buff, uint32 max_len); 查询接收通信缓冲区内数据 参照uart_querystr,唯一不同是不会因为遇到字符串结尾标志’\0’而退出,会持续读取通讯缓冲区直到规定的最大值max_len
char uart_query (UARTn_e); 查询是否接收到一个字节返回1 表示接收到一个字节了;返回 0 表示没有接收到 char ch;
if(uart_query(UART3) == 1)//查询是否接收到数据{
ch = uart_getchar (UART3); //等待接收一个数据,保存到 ch 里
}

发送类函数

函数原型 功能 用法举例 备注
void uart_putchar (UARTn_e, char ch); 发送 1 个字节。 uart_putchar (UART3, ‘A’); //发送字节’A’
void uart_putbuff (UARTn_e , uint8 *buff, uint32 len); 发送 len 个字节,包括 NULL 也会发送。 uart_putbuff (UART3,”1234567”, 3); //实际发送了 3 个字节’1’,’2’,’3’
void uart_putstr (UARTn_e , const uint8 *str); 发送字符串。 uart_putstr (UART3,”1234567”); //实际发送了 7 个字节 发送时会自动省略字符串的结尾标志’\0’

UART模块中断控制函数

void uart_rx_irq_en (UARTn_e); //开串口接收中断
void uart_rx_irq_dis(UARTn_e); //关串口接收中断

void uart_tx_irq_en (UARTn_e); //开串口发送中断
void uart_tx_irq_dis(UARTn_e); //关串口发送中断

void uart_txc_irq_en (UARTn_e); //开串口发送完成中断
void uart_txc_irq_dis(UARTn_e); //关串口发送完成中断

发送中断和发送完成中断区别的一点理解

一般单片机的数据发送用到两个寄存器:发送数据寄存器和移位寄存器
发送中断:是相对于发送数据寄存器来说的,只要他空了,就会发生中断,而此时移位寄存器有可能还在工作。
发送完成中断:是相对于移位寄存器来说的,移位寄存器中数据完全发送完成了才会发生中断。

I2C模块

简介

I2C(iic)是一种主要用于内部部件近距离通讯的同步半双工通讯协议,有主从机之分,主机通过分配给从机地址码与一个或多个从机通讯。
硬件部分,一组I2C通讯端口需要占用单片机的两个引脚,一个引脚负责提供时钟信号(CLK),一个引脚负责数据(DATA)的双向传输

库函数常用参数表

这里写图片描述

库函数说明

函数原型 用途 使用举例 备注
extern uint32 i2c_init(I2Cn_e i2cn, uint32 baud); 初始化 I2C,设置期待的波特率,返回值为实际配置的波特率。 i2c_init(I2C0,400*1000); // 初始化 I2C0,期待的波特率为 400k
void i2c_write_reg(I2Cn_e, uint8 SlaveID, uint8 reg, uint8 Data); 写入一个字节数据到 I2C 设备指定寄存器 i2c_write_reg(I2C0, 0x1D, 1,2); //向从机 0x1D 的寄存器 1 写入数据 2
uint8 i2c_read_reg (I2Cn_e, uint8 SlaveID, uint8 reg); 读取 I2C 设备指定寄存器的一个字节数据 uint8 value = i2c_read_reg(I2C0, 0x1D, 1);

SPI模块

SPI协议简介

SPI通讯协议是一种高速的,全双工同步的通信总线协议,一般最少需要占用四个管脚(只读不写或只写不读可以减少为最少3个引脚),此协议以主从机方式工作(一个主机与一个或多个从机)。

占用的四个管脚用途如下:
(1)SDI – 主设备数据输入,从设备数据输出;
(2)SDO – 主设备数据输出,从设备数据输入;
(3)SCLK – 时钟信号,由主设备产生;
(4)CS – 从设备使能信号,由主设备控制。(每增加一个从设备,此信号管脚增加一个,即每个CS信号对应一个从设备

库函数常用形参

变量 作用 取值范围 备注
SPIn_e 模块号 SPI0,SPI1,SPI2
SPIn_PCSn_e SPI片选号 (可多选,用|分隔)SPIn_PCS0,SPIn_PCS1……SPIn_PCS5 具体每个SPI通道支持的片选号数不同,在App\Inc\PORT_cfg.h 中查询
SPI_CFG 主从机模式配置 MASTER、SLAVE
baud 期待的波特率
modata 要发送数据的存储地址
midata 要接收数据的存储地址
len 发送或接收的数据长度 uint32
mocmd 要发送命令的存储地址
micmd 要接收命令的存储地址
cmdlen 发送或接收的命令长度 uint32

库函数原型

函数原型 用途 使用举例 备注
uint32 spi_init (SPIn_e, SPIn_PCSn_e , SPI_CFG,uint32 baud); SPI 初始化,选择片选信号,设置模式,波特率。 返回值为实际配置的波特率。 uint32 baud = spi_init(SPI0,SPIn_PCS0, MASTER,10*1000*1000);
//初始化 SPI,选择 CS0,主机模式, 波特率为 1M ,返回真实波特率到 baud 变量
void spi_mosi (SPIn_e,SPIn_PCSn_e,uint8 *modata,uint8 *midata,uint32 len); SPI 发送接收函数,发送 databuff 数据,并把接收到的数据存放在 databuff 里 void spi_mosi(SPI0,SPIn_PCS0,buff,buff,2); //发送 buff 的内容,并接收到 buff 里,长度为 2 字节
void spi_mosi_cmd(SPIn_e,SPIn_PCSn_e,uint8 *mocmd, uint8 *micmd , uint8 *modata, uint8 *midata,uint32 cmdlen , uint32 len); SPI 发送接收函数,与 spi_mosi 相比,多了先发送 cmd 缓冲区的步骤,即分开两部分发送 spi_mosi_cmd (SPI0,SPIn_PCS0,cmd,NULL,buff,buff,1,2);//发送 cmd/buff 的内容,不接收 cmd 发送时的数据,接收 buff 发送时的数据到 buff 里,长度分别为 1、 2 字节

PS:发送和接受的存储地址可用同一个,先发送存储地址中的8位数据到从机SPI缓冲区,然后从接收缓冲区中将接收的数据写入存储地址(覆盖发送的数据)。

FTM模块

FTM模块用途简介

FTM是一个神奇的模块,他能输出PWM,能输入捕获,能输出比较还能正交解码。英文全称是FlexTimer Module,你可以理解为高级定时器模块、易用定时器模块等等。我们可以用FTM模块来实现PWM、输入捕获和正交解码等常用功能

常用形参

变量 作用 取值范围 备注
FTMn_e 模块名 FTM0~FTM3(只有FX型号可以选FTM3)
FTM_CHn_e 通道号 FTM_CH0~FTM_CH7 在App/Inc/port_cfg.h中配置通道对应管脚
Freq 频率 单位:HZ
Duty 通道占空比 Duty<=FTM_PRECISON FTM_PRECISON为精度定义,默认值为100,值越大,精度越高。在Chip/Inc/MK60_ftm.h中修改值
FTM_Input_cfg FTM输入捕捉配置 FTM_Rising //上升沿捕获
FTM_Falling//下降沿捕获
FTM_Rising_or_Falling//上升或下降沿(跳变沿)捕获
FTM_PS_e 分频因子(分频值 = 1< FTM_PS_e具体可用值可在Chip/Inc/MK60_ftm.h中查询 例子:FTM_PS_8对应分频值 = (1 << FTM_PS_8) = (1 << 7) = (10000000(二进制)) = (128(十进制))这里写图片描述

库函数原型

PWM输出类函数

函数原型 用途 使用举例 备注
void ftm_pwm_init(FTMn_e, FTM_CHn_e, uint32 freq, uint32 duty); 初始化 FTM 的 PWM,设置频率和空比。 ftm_pwm_init(FTM0, FTM_CH6,200, 10); //初始化 FTM0_CH6 为 频率 200Hz 的 PWM,占空比为10/FTM0_PRECISO
void ftm_pwm_duty(FTMn_e, FTM_CHn_e, uint32 duty); 设置通道占空比,占空比为 ( duty /FTM_PRECISON) *100% 。 ftm_pwm_duty(FTM0, FTM_CH6, 10);//设置 FTM0_CH6 占空比为 10/FTM0_PRECISON
void ftm_pwm_freq(FTMn_e, uint32 freq); 设置 FTM 的频率。设置后,需要重新调用 ftm_pwm_duty 设置占空比。 ftm_pwm_freq(FTM0,200);//设置 FTM0 的 频率 为 200Hz

输入捕捉类函数

函数原型 用途 使用举例 备注
void ftm_input_init (FTMn_e, FTM_CHn_e,FTM_Input_cfg,FTM_PS_e ps); 输入捕捉初始化函数。 ftm_input_init(FTM0,FTM_CH0,FTM_Rising,FTM_PS_2);//设置 FTM0_CH0 上升沿触发输入捕捉,二分频
uint16 ftm_input_get (FTMn_e, FTM_CHn_e); 输入捕捉模式下,读取并返回捕捉事件发生时的计数器值(根据两次捕捉之间的差值可判断周期频率)。 uint16 data = ftm_input_get (FTM0, FTM_CH0);// 获取 FTM0_CH0 输入捕捉事件触发时的计数值
void ftm_input_clean(FTMn_e ); 清空计数器的值。即计数器重新开始计数。

正交解码类函数

函数原型 用途 使用举例 备注
void ftm_quad_init (FTMn_e); 初始化 FTM 的正交解码 功能。 ftm_quad_init(FTM1);//初始化 FTM1 为正交解码模式
int16 ftm_quad_get (FTMn_e); 获取并返回 FTM 正交解码 的脉冲数(负数表示反方向)。 int16 count = ftm_quad_get(FTM1);//获取 FTM1 交解码 的脉冲数
void ftm_quad_clean(FTMn_e ftmn) 清 FTM 正交解码 的脉冲数。 ftm_quad_clean(FTM1);//复位 FTM1 正交解码 的脉冲数

PIT定时器模块

简介

PIT定时模块类似于51单片机中的定时器,主要用于周期性的触发中断,各种计时或者延时。K60有4个PIT模块,每个模块拥有独立的中断。

常用形参说明

变量 作用 取值范围 备注
PITn_e 模块号 PIT0~PIT3
cnt 定时器计时时长(时长 = bus时钟周期*cnt) uint32
ms 毫秒 ms*bus_clk_Khz < uint32 bus_clk_Khz这个变量存储的是K60的总线频率(extern int bus_clk_Khz)
us 微秒 us*bus_clk_Khz/1000 < uint32
ns 纳秒 ns*bus_clk_Khz/1000000 < uint32

库函数原型说明

函数原型 用途 使用举例 备注
void pit_init(PITn_e, uint32 cnt); 初始化 PITn,并设置定时时间(单位为 bus 时钟周期)。
计时器每到设定的时间就触发中断(如果使能了相应中断的话),然后重新开始计时
pit_init(PIT0, 1000); //定时 1000 个 bus 时钟 后中断
set_vector_handler(PIT0_VECTORn,pit_hander); // 设置中断服务函数到中断向量表里
enable_irq(PIT0_IRQn); // 使能 PIT 中断
void pit_delay(PITn_e, uint32 cnt); PIT 延时(不需要初始化的) ,延时时间单位为 bus 时钟周期。 pit_delay(PIT0, 1000); //延时 1000 个 bus 时钟
void pit_time_start (PITn_e); PIT 开始计时(不需要初始化 ,直接调用) pit_time_start(PIT0); //PIT0 计时开始
uint32 pit_time_get (PITn_e); 获取 PITn 计时时间并返回(超时时会关闭 定时器)(单位为 bus 时钟) (若值为0xFFFFFFFF,则表示超时溢出) uint32 time = pit_time_get(PIT0); //获取 PITn 计时时间
if(time != ~0) //没超时
{
printf(“\n 计时时间为: %d us”,time*1000/bus_clk_khz);
}
void pit_close (PITn_e pitn); 关闭 PIT pit_close(PIT0); //关闭 PIT0
PIT_Flag_Clear(PITn_e) 清 PITn 中断标志。一般在中断服务函数和 pit 初始化函数里用到 PIT_Flag_Clear(PIT0); 这实际是一个宏定义,不过用法和函数一样

宏定义

初始化并设定定时时间

pit_init_ms(PITn_e,ms) //初始化 PITn,并设置定时时间(单位为 ms)
pit_init_us(PITn_e,us) //初始化 PITn,并设置定时时间(单位为 us)
pit_init_ns(PITn_e,ns) //初始化 PITn,并设置定时时间(单位为 ns)

设定延时时间

(不需要初始化,可直接调用)
pit_delay_ms(PITn_e,ms) //PIT 延时 ms
pit_delay_us(PITn_e,us) //PIT 延时 us
pit_delay_ns(PITn_e,ns) //PIT 延时 ns

LPTMR低功耗定时器模块

主要功能

和PIT一样也是定时器,要注意的是LPTMR模块的计数寄存器虽然是32位的但是31-16位是只读预留位,始终为0,所以计数时最大数字只能有16位
延时,定时,计时,脉冲技术(前三个功能与PIT定时器基本一致),K60只有一个LPTMR模块

常用形参

这里写图片描述

库函数

毫秒定时与延时类

函数原型 用途 使用举例 备注
void lptmr_delay_ms(uint16 ms); LPTMR 延时函数(ms),不需要初始化就可以直接调用。 lptmr_delay_ms(32); // LPTMR 延时 32ms
void lptmr_timing_ms(uint16 ms); LPTMR 定时函数,定时时间到了会触发中断。 lptmr_timing_ms(32); // LPTMR 定时 32ms
set_vector_handler(LPTimer_VECTORn,lptmr_hander); // 设置中断服务函数到中断向量表里
enable_irq(LPTimer_IRQn); // 使能 LPTMR 中断
void lptmr_time_start_ms(void); 开始计时 这里写图片描述
uint32 lptmr_time_get_ms(void); 获取计数时间( 不同的开始计时单位,需要配套相应不同的获取计时时间单位函 参考 lptmr_time_start_ms 例子

数)。

微秒定时与延时类

函数原型 用途 使用举例 备注
void lptmr_delay_us(uint16 us); LPTMR 延时函数(us),不需要初始化就可以直接调用。 lptmr_delay_us(32); // LPTMR 延时 32us
void lptmr_timing_us(uint16 us); LPTMR 定时函数,定时时间到了会触发中断。 例子参照毫秒类
void lptmr_time_start_us(void); 开始计时 例子参照毫秒类
uint32 lptmr_time_get_us(void); 获取计数时间( 不同的开始计时单位,需要配套相应不同的获取计时时间单位函数)。 参考 lptmr_time_start_ms 例子

通用类

函数原型 用途 使用举例 备注
void lptmr_time_close(); 关闭 LPTMR 计时

脉冲计数类

函数原型 用途 使用举例 备注
void lptmr_pulse_init (LPT0_ALTn, uint16 count, LPT_CFG); LPTMR 脉冲计数初始化 lptmr_pulse_init(LPT0_ALT1,0xFFFF,LPT_Rising);// LPTMR 脉冲计数, 计数 0xFFFF 后触发中断请求(需要开中断才执行中断服务函数),上升沿捕捉
uint16 lptmr_pulse_get (void); LPTMR 获取计数值 uint16 data = lptmr_pulse_get(); //获取脉冲计数值
void lptmr_pulse_clean (void); 清空 LPTMR 脉冲计数 lptmr_counter_clean(); //清空 LPTMR 脉冲计数

ADC模块

ADC模块简介

ADC,Analog-to-Digital Converter的缩写,指模/数转换器,用于将模拟信号转换为CPU可以处理的数字信号。

常用形参

变量 作用 取值范围 备注
ADCn_e ADC模块号 ADC0,ADC1 K60有两个ADC模块,每个模块有多个通道
ADCn_CH_e ADC通道号 查阅Chip/Inc/MK60_ADC.h
n代表模块号,e代表通道号
因为山外库的相关函数采用的是软件触发ADC模块的方式,故不支持需要硬件触发的B通道,具体查看文件注释
ADC_nbit 转换位数(位数越多精度越高) ADC_8bit,ADC_12bit,ADC_10bit,ADC_16bit

库函数

函数原型 用途 使用举例 备注
void adc_init (ADCn_Ch_e); ADC 初始化 adc_init (ADC0_SE10 ); //初始化 ADC0_SE10 , K60 使用 PTA7 管脚
uint16 adc_once (ADCn_Ch_e, ADC_nbit); 采样一次一路模拟量的 AD 值,返回采样数值。按采集精度来返回不同大小, 16 位精度最大返回: 65535 uint16 var = adc_once(ADC0_SE10, ADC_8bit);
void adc_stop (ADCn_e); 停止 ADC 模块的 AD 转换,同一个模块的所有通道都会停止。 adc_stop(ADC0);

DAC模块

简介

模/数转换模块,用于使用数字型号转换输出模拟信号,K60有两个DAC模块,每个模块只有一个通道

常用参数

变量 作用 取值范围 备注
DACn DAC模块号 DAC0,DAC1
val 数字量(对应某一点的电平,最大为0xFFF)
例如,参考电源为U(单位:V),则 输出电平=U*(val/0xFFF)
12bit

库函数

函数原型 用途 使用举例 备注
void dac_init(DACn_e); 初始化 DAC 模块 dac_init (DAC0 ); //初始化 DAC0
void dac_out(DACn_e, uint16 val); DAC 一次转换操作 dac_out (DAC0 ,0x100); //初始化 DAC0 输出 0x100 数字量对应的模拟量: 3300*(1 + 0x100)/4096 mV

DMA模块

简介

DMA 的作用是一个专业的数据搬运工,只需要告诉它数据源地址在哪里,数据目的地址在哪里,每次传输多少 个 数据,一共传输多少次,什么时候触发传输,它就会根据条件来自动搬运数据,从而释放了 CPU,可以让 CPU 干其他的活。另外,它是专业的,初始化后就可以自动地工作,所以不需要像 CPU 那样执行代码来搬运数据,所以 DMA 传输数据的速度更快。

K60 的 DMA 共有 63 个 DMA 源(称为槽: slots) , 16 个独立的 DMA 通道。

DMA 源,即请求 DMA 传输一次的请求源,换句话说就是触发什么时候传输的触
发源。
DMA 通道,就是传输数据的线路。

山外库目前的DMA例程仅提供了GPIO端口数据到内存的参考例程,其他的模块需要自行配置

常用形参

这里写图片描述

DMA_cfg形参枚举

这里写图片描述
DMA每传输一次,目的地址会自动加一,此形参用于选择传输完成后是否恢复目的地址。

库函数

函数原型 用途 使用举例 备注
void dma_portx2buff_init(DMA_CHn, void *SADDR, void *DADDR, PTXn_e, DMA_BYTEn, uint32count, uint32 cfg); 初始化 DMA,使得 PORT 端口数据通过 DMA 传输到 BUFF 缓冲区 这里写图片描述 注意:用到的输入端口和触发端口已经内部初始化,不需要再额外初始化。默认触发端口为上升沿触发,如果需要配置为下降沿触发,可调用 port_init 函数来重新配置。
void dma_repeat(DMA_CHn CHn,void *SADDR, void *DADDR,uint32 count) DMA 重新配置,传输完毕后,一些参数会改变,需要重新赋值。 dma_repeat(DMA_CH0, (void )&PTE_B2_IN, (void )img_buff,CAMERA_DMA_NUM); DMA 的目的地址每次传输都会加一,有时不需要加一可以使用此函数复位

宏定义

宏定义 用途 使用举例 备注
DMA_IRQ_EN 允许 DMA 通道传输完成中断 DMA_IRQ_EN(DMA_CH3); //允许 DMA 通道 3 传输完成中断
DMA_IRQ_DIS 禁止 DMA 通道传输完成中断 DMA_IRQ_DIS(DMA_CH3); //禁止 DMA 通道 3 传输完成中断
DMA_IRQ_CLEAN 清除通道传输中断标志位 DMA_IRQ_CLEAN(DMA_CH3); //清除 DMA 通道 3 传输中断标志位 一般用于中断程序中
DMA_EN 使能通道硬件 DMA 请求 DMA_EN(DMA_CH3); //使能 DMA 通道 3 硬件 DMA 请求
DMA_DIS 禁止通道硬件 DMA 请求 DMA_DIS(DMA_CH3); //禁止 DMA 通道 3 硬件 DMA 请求
展开阅读全文

没有更多推荐了,返回首页