注意:本功能表只是阐述各个引脚支持的功能,具体引脚名称标注和排列方式以相应最小系统板为准
File->New->WorkSpace
Project->Create New Project
工程名上右键选择options
(具体)配置方法参照《一天攻破K60》中的IAR配置章节
(复用管脚:多功能管脚)
App\Inc\PORT_cfg.h
使用时,根据文件内的注释对各功能模块的对应复用管脚号进行修改即可(也可以之后用PORT库函数port_init实现管脚复用,这样就不用麻烦的修改文件了)
PS:ADC模块因为固定了对应端口,因此无法自行配置对应的端口管脚,可在Chip\Inc\MK60_ADC.h中查询对应的端口管脚
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模块是管脚管理模块,用于控制每个管脚复用到不同的内部模块,以及配置管脚属性
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即GeneralPurposeInputandOutput,通用输入输出接口。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 管脚 输入电平
参数说明:
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为保持 |
参数说明:
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,由高位到低位分别对应到序号由大到小的管脚 |
参数说明:
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)
参数说明:
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 为输出电平不变 |
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’ |
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(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通讯协议是一种高速的,全双工,同步的通信总线协议,一般最少需要占用四个管脚(只读不写或只写不读可以减少为最少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是一个神奇的模块,他能输出PWM,能输入捕获,能输出比较还能正交解码。英文全称是FlexTimer Module,你可以理解为高级定时器模块、易用定时器模块等等。我们可以用FTM模块来实现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定时模块类似于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
和PIT一样也是定时器,要注意的是LPTMR模块的计数寄存器虽然是32位的但是31-16位是只读预留位,始终为0,所以计数时最大数字只能有16位
延时,定时,计时,脉冲技术(前三个功能与PIT定时器基本一致),K60只有一个LPTMR模块
数)。
函数原型 | 用途 | 使用举例 | 备注 |
---|---|---|---|
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,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); |
模/数转换模块,用于使用数字型号转换输出模拟信号,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 的作用是一个专业的数据搬运工,只需要告诉它数据源地址在哪里,数据目的地址在哪里,每次传输多少 个 数据,一共传输多少次,什么时候触发传输,它就会根据条件来自动搬运数据,从而释放了 CPU,可以让 CPU 干其他的活。另外,它是专业的,初始化后就可以自动地工作,所以不需要像 CPU 那样执行代码来搬运数据,所以 DMA 传输数据的速度更快。
K60 的 DMA 共有 63 个 DMA 源(称为槽: slots) , 16 个独立的 DMA 通道。
DMA 源,即请求 DMA 传输一次的请求源,换句话说就是触发什么时候传输的触
发源。
DMA 通道,就是传输数据的线路。
山外库目前的DMA例程仅提供了GPIO端口数据到内存的参考例程,其他的模块需要自行配置
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 请求 |