打印
[Kinetis]

【kinetis实验】+Freescale K/L系列开发套件

[复制链接]
楼主: 偏爱番茄酱
手机看帖
扫描二维码
随时随地手机跟帖
41
偏爱番茄酱|  楼主 | 2014-9-10 08:53 | 只看该作者 回帖奖励 |倒序浏览
Kinetis V2.5函数固件库,由最开始的仅仅提供对应模块的驱动代码,到采用过程式封装代码包再到系统级固件库乃至时至今日的对象级固件库(使用C面向对象编程)。Kinetis函数固件库不断升级,实现对任何一款kinetis-k的操作的最终目的。
目前已经完善的kinetis V2.5函数库已经实现了基于kinetis-k(定点、200Mbps/220MIPS)下的去全部片内系统驱动程序,在TCP/IP协议栈下,建立操作系统编程(uc-os III/MQX/RT-Thread)下均有对应例程,同时针对于操作系统工作原理的讲解,这里还提供了一个模拟操作系统内核供大家学习。
对象级固件库封装模块化思想,通过使用C语言来构造复杂的“类”、“对象”等抽象概念,使得在C语言架构下可以使用类似C++/JAVA一样的工作方式,是大家编程更加简单高效!这是其他平台所不具备的一大优势,同时在编码风格上。我们强调遵循POSIX规范,写出的代码则符合可移植性操作规范,同时借助于UNIX系统内核编程等经验,从细节入手,切实帮助大家从编程伊始就注意代码编写的规范。

使用特权

评论回复
42
偏爱番茄酱|  楼主 | 2014-9-10 09:00 | 只看该作者
同志们,福利来啦

original_HJhw_702800006488118c.jpg (141.37 KB )

original_HJhw_702800006488118c.jpg

使用特权

评论回复
43
偏爱番茄酱|  楼主 | 2014-9-10 09:03 | 只看该作者
Kinetis-K Lib,因为文件太大,无法上传,遗憾啊,桑心啊,悲哀啊

使用特权

评论回复
44
偏爱番茄酱|  楼主 | 2014-9-10 09:11 | 只看该作者
只好百度网盘分享私密地址了,链接:http://pan.baidu.com/s/1pJFhv4J 密码:3tk1

使用特权

评论回复
45
偏爱番茄酱|  楼主 | 2014-9-10 09:31 | 只看该作者
各个操作模块使用操作指南:

GPIO 通用输入输出模块
GPIO模块用来输出高低电平,或者读取外部的高低电平信号
源代码浏览
•        gpio.c
•        gpio.h
入门
一个最简单的输出高低电平的例子,初始化一个GPIO引脚 并且输出高电平
/* 初始化一个引脚 设置为推挽输出 比如点亮一个小灯 */
GPIO_QuickInit(HW_GPIOE, 6, kGPIO_Mode_OPP);
GPIO_WriteBit(HW_GPIOE, 6, 1);
你可以用 GPIO_QuickInit来快速初始化一个GPIO,也可以用普通初始化,普通初始化一般以结构体的形式来填写参数,然后在XXX_Init()函数中传入结构体的地址以完成初始化。
但是无论快速初始化还是普通初始化,一次都只能初始化一个GPIO。
一个使用普通初始化的例子:
GPIO_InitTypeDef GPIO_InitStruct1;
GPIO_InitStruct1.instance = HW_GPIOE;
GPIO_InitStruct1.mode = kGPIO_Mode_OPP; /* 推挽输出 */
GPIO_InitStruct1.pinx = 6;
GPIO_Init(&GPIO_InitStruct1);
数据读写
让GPIO引脚输出/读入高低电平 以下几个函数可以控制GPIO来输出电平
void GPIO_WriteBit(uint32_t instance, uint8_t pinIndex, uint8_t data);
uint8_t GPIO_ReadBit(uint32_t instance, uint8_t pinIndex);
uint32_t GPIO_ReadPort(uint32_t instance);
void GPIO_WritePort(uint32_t instance, uint32_t data);
通常情况下 GPIO_WriteBit GPIO_ReadBit 比 WritePort ReadPort 更加常用,WriteBit ReadBit 是指写入或者读出一位数据(一个引脚), 而 WritePort ReadPort是写入/读出 这个端口的数据(32位)
下面是一个读取一个引脚电平的例子:
uint8_t pin_status;
GPIO_QuickInit(HW_GPIOE, 6, kGPIO_Mode_IPD);
pin_status= GPIO_ReadBit(HW_GPIOE, 6);
printf("status:%d\r\n, pin_status");
GPIO支持的输入输出方式
GPIO 支持如下几种模式: 他们在gpio.h中被定义成枚举量
typedef enum
{
    kGPIO_Mode_IFT = 0x00,      
    kGPIO_Mode_IPD = 0x01,      
    kGPIO_Mode_IPU = 0x02,      
    kGPIO_Mode_OOD = 0x03,      
    kGPIO_Mode_OPP = 0x04,      
}GPIO_Mode_Type;
几种工作模式解释如下
•        IFT: 浮空输入 一般用于AD等模拟应用
•        IPD: 下拉输入 芯片内部连接一200K左右的电阻至GND
•        IPU: 上拉输入 芯片内部连接一200K左右的电阻至VCC
•        OOD: 开漏输出 一般用于驱动外部设备
•        OPP: 推挽输出 一般用于驱动外部设备
使用位带操作控制GPIO
GPIO内存域处于ARM-CM4的Bitband区域内,因此可以使用位带操作来控制GPIO.
一个使用位带操作来控制GPIO输出高电平的例子
GPIO_QuickInit(HW_GPIOE, 6, kGPIO_Mode_OPP);
PEout(6) = 1;
同时,也可以使用位带操作来读入某个引脚的电平:
GPIO_QuickInit(HW_GPIOE, 6, kGPIO_Mode_IPD);
status = PEin(6);
但是无论是使用函数还是位带操作,一定要在使用之前初始化

使用特权

评论回复
46
偏爱番茄酱|  楼主 | 2014-9-10 09:32 | 只看该作者
ADC 模数转换模块
源码浏览
•        adc.c
•        adc.h
入门
可以使用ADC_QuickInit来快速初始化ADC。 范例如下:
uint32_t value;
/* 初始化ADC0模块 单端8通道,对应引脚PB0, 精度:单端12,差分13位 */
ADC_QuickInit(ADC0_SE8_PB0, kADC_SingleDiff12or13);
读取一个ADC值
/* 读取ADC变量 */
value = ADC_QuickReadValue(ADC0_SE8_PB0); /* ADC0_SE8_PB0 可以在adc.h中找到 */
printf("value:%d\r\n", value);
ADC_QuickReadValue 实际上完成了3部操作: 开始ADC转换,等待转换完成,读取转换结果

使用特权

评论回复
47
偏爱番茄酱|  楼主 | 2014-9-10 09:36 | 只看该作者
UART 通用异步串行口
用于和其他设备及PC机通讯,最传统,最常用的通讯方式
源码
•        uart.c
•        uart.h
术语解释
•        Tx 发送端
•        Rx 接收端
•        IT Interrupt 中断
•        Callback 回调 回调函数
入门
可以使用快速初始化来初始化一个选定的UART。同时printf会被自动连接到第一个初始化的串口
/* 初始化 UART0模块 Tx:PD07 Rx:PD06 波特率115200 */
UART_QuickInit(UART0_RX_PD06_TX_PD07, 115200);
printf("HelloWorld\r\n");
所有的快速初始化宏都可以在uart.h中找到
发送数据
可以使用最简单轮询方式来发送一帧串口数据 函数原型void UART_WriteByte(uint32_t instance, uint16_t ch);
发送一帧数据的例子:
UART_WriteByte(HW_UART0, 'H'); /* 发送一个字符 */
接收数据
UART_ReadByte 用于接收一帧串口数据,如果接收成功,返回0,否则返回1
轮询接收数据: 一个轮询接收数据的例子:
uint16_t ch;
while(1)
{
    if(!UART_ReadByte(HW_UART0, &ch))
    {
        UART_WriteByte(HW_UART0, ch); /* 自发自收 */
    }
}
串口中断接收数据
在更多的情况下,使用中断方式来接收串口数据:
下面是一个中断接收串口数据的例子:
void UART_RX_ISR(uint16_t byteRec)
{
    /* 将接收到的数据发送回去 */
    UART_WriteByte(HW_UART0, byteRec);
}

/* 初始化 UART0模块 Tx:PD07 Rx:PD06 波特率115200 */
UART_QuickInit(UART0_RX_PD06_TX_PD07, 115200);
UART_CallbackRxInstall(UART_RX_ISR); /* 注册中断回调函数 */
UART_ITDMAConfig(HW_UART0, kUART_IT_Rx); /* 开启UART Rx中断 */

使用特权

评论回复
48
偏爱番茄酱|  楼主 | 2014-9-10 09:37 | 只看该作者
PIT 周期性定时器
•        PIT用于产生周期性的中断,同时它也可以作为芯片其他外设的触发源。
•        PIT模块根据芯片的不同有不同的通道可选(每个通道相当于一个单独的硬件定时器) 不同的芯片中通道(子定时器) 的数量可能不同,具体可以参看芯片参考手册的Chip Configuration章节。
源码
•        pit.c
•        pit.h
入门
使用QuickInit系列函数来初始化PIT模块
/* 初始化HW_PIT_CH0, 定时周期5Ms(参数以Us为单位) */
PIT_QuickInit(HW_PIT_CH0, 5*1000);
之后,可以使用 uint32_t PIT_GetCounterValue(uint8_t chl) 来获取任意时刻的PIT Counter值
产生周期性中断
下面这个例子使用PIT来产生一个周期性的中断:
/* 声明中断回调函数 */
static void PIT0_CallBack(void);

/* 定时周期单位us */
PIT_QuickInit(HW_PIT_CH0, 1000*1000);

/* 注册中断回调函数 */
PIT_CallbackInstall(HW_PIT0_CH0, PIT0_CallBack);

/* 开启PIT中断 */
PIT_ITDMAConfig(HW_PIT0_CH0, ENABLE);

/* 中断回调函数 */
static void PIT0_CallBack(void)
{
    printf("Enter PIT0 Int\r\n");   
}
注意事项
•        不要在中断里执行过于复杂(耗时)的操作,否则他可能会阻塞相同抢占优先级的其他中断的相应,甚至造成中断嵌套溢出。
•        不要开启频率过高的(比如10-500us)一次的中断。 这样将非常消耗CPU资源。

使用特权

评论回复
49
偏爱番茄酱|  楼主 | 2014-9-10 09:37 | 只看该作者
RTC 实时时钟模块
RTC模块用于给系统提供一个稳定的时间戳
入门
一个初始化RTC的例子 初始化RTC只需要调用 RTC_QuickInit
RTC_QuickInit();
改初始化并不会更新RTC时间戳,而是保持原来的时间
设置时间
首先定义一个时间戳结构体 然后设置各个参数,最后调用RTC_SetDateTime 将结构体地址传入以完成时间设置
RTC_DateTime_Type td = {0};
td.day = 20;
td.hour = 23;
td.minute = 59;
td.second = 50;
td.year = 2014;
td.month = 11;
RTC_SetDateTime(&td);
获取时间
类似设置时间,需要定义一个时间戳结构体,然后调用RTC_GetDateTime即可
RTC_DateTime_Type td = {0};
RTC_GetDateTime(&td);
printf("%d-%d-%d %d:%d:%d\r\n", td.year, td.month, td.day, td.hour, td.minute, td.second);

使用特权

评论回复
50
偏爱番茄酱|  楼主 | 2014-9-10 09:38 | 只看该作者
SYSTICK 系统滴答定时器
Systick 是Cortex-M4的内核外设,所有使用Cortex-M4内核的的芯片都拥有此外设,Systick是一个24位的倒计数计时器,当计数到0时可配置成产生中断信号,这实际使用中常用来实现延时的功能。
源代码浏览
•        systick.c
•        systick.h
入门
Systick 常被用来实现系统延时的功能,可以提供us级和ms级两种的延时功能,提供机器周期级的精准计时功能。
延时
例子:实现的延时
具体代码如下:
  /* 初始化配置systick,提供延时功能 */
  DelayInit();
  DelayUs(500); /*延时 500us */
  DelayMs(500); /* 延时500ms */
注意: DelayMs DelayUs 函数是通过查询systick的计时器来实现的延时功能,一旦程序中使用了Delay函数,不能再将SysTick定时器用于其它用途
使用 systick 产生中断
systick 也可以产生定时中断,下面是一个产生定时中断的例子
  SYSTICK_Init(1000*1000); /* 1s中断 */
  SYSTICK_Cmd(true); /* 时能ticker */
  SYSTICK_ITConfig(true); /* 开启中断 */

void SysTick_Handler(void)
{
    printf("SysTick_Handler enter\r\n");
}
注意 一旦Systick用于定时中断,他将不能再用作普通Delay功能

使用特权

评论回复
51
偏爱番茄酱|  楼主 | 2014-9-10 09:38 | 只看该作者
I2C 总线
源代码
•        i2c.c
•        i2c.h
读写I2C接口的从机设备数据
下面列出比较常用的一种应用:使用I2C读写一些I2C传感器(加速度等等 如MMA84xx系列等)
读寄存器的例子:
/* 初始化 i2c1模块 sda:PE00 scl:PE01 速度 100K bps */
I2C_QuickInit(I2C1_SCL_PE01_SDA_PE00, 100*1000);
int r;
uint8_t data;
/* 从机I2C地址0x33(7位地址) 从机内子地址(寄存器偏移)0x02
r = I2C_ReadSingleRegister(HW_I2C1, 0x33, 0x02, &data);
if(r)
{
    printf("read failed\r\n");
}
else
{
    printf("read succ. data:%d\r\n", data);
}
写数据同读数据类似,使用函数I2C_WriteSingleRegister 即可.
注意
•        快速初始化宏I2C1_SCL_PE01_SDA_PE00 可以在i2c.h中找到
SCCB 支持
I2C构件同样支持I2C协议的变种:SCCB协议 SCCB协议主要用于和OV公司的摄像头进行控制数据交互
•        初始化: 同I2C初始化 调用 I2C_QuickInit 即可
•        读寄存器
调用函数SCCB_ReadSingleRegister 即可,其他同 i2C_ReadSingleRegister
•        写寄存器
调用函数SCCB_WriteSingleRegister 即可,其他同 i2C_WriteSingleRegister

使用特权

评论回复
52
偏爱番茄酱|  楼主 | 2014-9-10 09:39 | 只看该作者
SPI(同步串行总线)
SPI总线一般用于电路板级的数据通讯(同一款电路板上)。比如读写外部Flash, 触摸芯片等等。它通常可以达到较高的传输速度。
注意 目前的spi组件只支持主机模式(Kinetis作为主机)
源代码浏览
•        spi.c
•        spi.h
术语解释
•        CPHA CPOL 时钟相位及时钟极性,他们属于SPI的协议的配置选项
•        MOSI(Sout) Master Out Slave In, 主机数据输出,从机数据输入引脚
•        MISO(Sin) Master In Slave Out, 主机数据输入,从机数据输出引脚
•        SCK 时钟线 同于同步时钟
•        CS 片选线 通常,低电平有效
使用SPI组件
像其他固件库一样,SPI模块也需要先初始化再使用,一个简单的例子:
uint8_t data;
/* 初始化SPI2 模块 速率 1M */
SPI_QuickInit(SPI2_SCK_PD12_SOUT_PD13_SIN_PD14, kSPI_CPOL0_CPHA1, 1*1000*1000);

/* 设置PCS的 PinMux为 SPI */
PORT_PinMuxConfig(HW_GPIOD, 11, kPinAlt2); /* SPI2_PCS0 */

/* 发送接受一帧数据 */
data = SPI_ReadWriteByte(HW_SPI2, HW_CTAR0, 0x55, HW_SPI_CS0, kSPI_PCS_ReturnInactive);

printf("Rev data is :%d\r\n", data);
协议发送后逻辑分析仪截图如下

注意
•        当使用 SPI_QuickInit 时,并不会配置CS的 PinMux,需要手动配置。
•        HW_CTAR0 为传输控制寄存器,用于配置传输的波特率,CPOL CPHA等,每个SPI模块有2个,如果不是很清楚选择**HW_CTAR0** 即可
SPI_ReadWriteByte 的最后一个参数 csState 选项:
•        kSPI_PCS_ReturnInactive 为发送这帧数据后CS引脚回归到Idle状态(通常为高电平)
•        kSPI_PCS_KeepAsserted 为发送这帧数据后CS引脚一直为选中状态(通道为低电平)

使用特权

评论回复
53
偏爱番茄酱|  楼主 | 2014-9-10 09:39 | 只看该作者
Flexbus总线
Flexbus一般可以用于连接一下设备(Kinetis作为主机,连接设备作为从机):
•        外部Flash
•        外部RAM
•        FPGA
•        带控制器的LCD等
引脚信号说明
•        Flexbus总线外部 主要信号引脚总结如下:(地址和数据引脚暂且不列)
•        FB_CS[0-5]: 片选 低有效
•        FB_BE_7(15 23 32)_0(8 16 24): 位使能 当Flexbus 读写对应的数据位宽时,对应的位使能变低 低有效
•        FB_OE: 输出使能,也叫做读信号,当Flexbus从设备读取数据时,该引脚低电平 低有效
•        FB_RW: 读写信号 1=Read 0=Write
•        FB_CLK: FB基准时钟输出
Flexbus挂SRAM例程 SRAM型号:IS61WV25616
SRAM的 WE为写信号 低有效 OE为读信号,低有效
摘自SRAM芯片手册SRAM真值表

硬件连接:
SRAM        Flexbus
[A0-A17]        [A1-A18]
[D0-D15]        [D16-D31]
[CE]        [CE]
[WE]        [RW]
[OE]        [OE]
[UB]        [BE_31_24]
[LB]        [BE_23_16]
代码(不包括PinMux配置)
/* enable flexbus */
FLEXBUS_InitTypeDef FLEXBUS_InitStruct;
FLEXBUS_InitStruct.ADSpaceMask = kFLEXBUS_ADSpace_512KByte;
FLEXBUS_InitStruct.autoAckMode = kFLEXBUS_AutoAckEnable;
FLEXBUS_InitStruct.CSn = kFLEXBUS_CS1;
FLEXBUS_InitStruct.dataAlignMode = kFLEXBUS_DataLeftAligned;
FLEXBUS_InitStruct.dataWidth = kFLEXBUS_PortSize_16Bit;
FLEXBUS_InitStruct.baseAddress = SDRAM_ADDRESS_BASE;
FLEXBUS_InitStruct.ByteEnableMode = kFLEXBUS_BE_AssertedReadWrite;
FLEXBUS_InitStruct.div = 0;
FLEXBUS_Init(&FLEXBUS_InitStruct);
/* config Flexbus SRAM pinmux */
FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group3, kFLEXBUS_CSPMCR_GROUP3_BE_23_16);
FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group2, kFLEXBUS_CSPMCR_GROUP2_BE_31_24);
FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group1, kFLEXBUS_CSPMCR_GROUP1_CS1);
控制信号时序图

使用特权

评论回复
54
偏爱番茄酱|  楼主 | 2014-9-10 09:40 | 只看该作者
FTM 灵活定时器
FTM 是一种功能强大的定时器,它不仅仅可以一个普通的定时器,更可以产生 PWM波 , 脉宽长度捕捉 , 正交解码 等等.
使用FTM产生PWM波
产生固定频率PWM的例子
使用FTM0模块通道3(PA06引脚) 上产生 3KHzPWM波, 使用边沿对齐模式
FTM_PWM_QuickInit(FTM0_CH3_PA06, kPWM_EdgeAligned, 3000);
产生的波形如下:

改变占空比
可以使用FTM_PWM_ChangeDuty动态的改动占空比
一个改变占空比的例子:
/* FTM1模块1通道的PWM改为 20%(0-10000对应0-100%) */
FTM_PWM_ChangeDuty(HW_FTM1, HW_FTM_CH1, 2000);
注意
•        一个FTM模块有多个通道,每个通道可以产生不同占空比的PWM波,但是它们的频率都必须是相同的
•        使用FTM_PWM_ChangeDuty 前应确保相应的通道和模块已经被初始化
正交解码
初始化一个FTM模块用于正交解码 并读取解码值
int value;
uint8_t dir;

/* 初始化 */
FTM_QD_QuickInit(FTM1_QD_PHA_PA08_PHB_PA09,
kFTM_QD_NormalPolarity,
kQD_PHABEncoding);

/* 读取值 */
FTM_QD_GetData(HW_FTM1, &value, &dir);
printf("value:%6d dir:%d  \r", value, dir);
注意
•        一个FTM模块只能用于 正交解码 PWM 输入捕捉, 三选一
•        使用FTM_QD_GetData 获得的数值是累计值,可以使用 FTM_QD_ClearCount 清空正交计数Counter
•        FTM1_QD_PHA_PA08_PHB_PA09 是快速初始化宏,可以在ftm.h中找到
输入捕捉

使用特权

评论回复
55
偏爱番茄酱|  楼主 | 2014-9-10 09:42 | 只看该作者

QQ图片20140910094319.jpg (48.31 KB )

QQ图片20140910094319.jpg

使用特权

评论回复
56
偏爱番茄酱|  楼主 | 2014-9-10 09:43 | 只看该作者
内部Flash编程模块
几乎所有Kinetis系列都拥有Flash控制器 他可以用来在运行时编程Flash从而实现IAP(在线编程)等功能。
超核Kinetis固件库使用 ARM标准的SSD(Stand Flash Driver) 来操作Flash。
SSD简介
编程Flash
注意 Flash需要先擦出在写入。擦除的基本单位是Sector, 编程的基本单位是Page, 一般Sector > Page

使用特权

评论回复
57
偏爱番茄酱|  楼主 | 2014-9-10 09:43 | 只看该作者
DMA 直接内存存取
DMA 用于减轻CPU的负荷 提供一种无需CPU干预的数据传输途径。他可以自动的的将数据从一片内存(甚至是特殊寄存器)传输(复制)到另外一片内存。通俗的讲,他是MCU内的数据搬运工。
源代码浏览
•        dma.c
•        dma.h
入门及概念
DMA 主要的传输方向有如下几种:
•        MemoryToPeripheral 内存到外设的传输(例如发送数据)
•        MemoryToMemory 内存到内存之间的传输
•        PeripheralToMemory 外设到内存的传输(例如接收数据)
•        PeripheralToPeripheral 外设到外设的传输
一个简单的内存到内存之间的数据传输
外设到普通内存的数据传输
这种方式通常用于异步接收大量数据。

使用特权

评论回复
58
偏爱番茄酱|  楼主 | 2014-9-10 09:44 | 只看该作者
SD 卡控制器
部分Kinetis型号上有SDHC模块(SD Host Controller) 用于实现SDIO协议,它通常用来控制SD卡。 CHKinetis固件库上写好SD卡的支持函数,可以轻松实现单块多块读写。

SD卡API使用
SD卡模块API接口函数
uint8_t SD_Init(SD_InitTypeDef* SD_InitStruct);
uint32_t SD_GetSizeInMB(void);
uint8_t SD_ReadSingleBlock(uint32_t sector, uint8_t *buf);
uint8_t SD_WriteSingleBlock(uint32_t sector, const uint8_t *buf);
uint8_t SD_ReadMultiBlock(uint32_t sector, uint8_t *buf, uint16_t block_cnt);
uint8_t SD_WriteMultiBlock(uint32_t sector,const uint8_t *buf, uint16_t block_cnt);
uint32_t SD_QuickInit(uint32_t baudrate);
uint8_t SD_InitCard(void);
初始化
/* 初始化SD卡 波特率 2M */
SD_QuickInit(20000000);
/* 读取并打印卡容量 */
printf("SD size:%dMB\r\n", SD_GetSizeInMB());
单块读写并打印扇区信息
int i;
uint8_t sd_buffer[512];  //
/* 读取SD卡0扇区 */
SD_ReadSingleBlock(0, sd_buffer);
/* 打印0扇区内容 */
printf("sectoer 0 data:\r\n");
for(i = 0; i < 512; i++)
{
    printf("0x%02X ", sd_buffer[i]);
}

使用特权

评论回复
59
偏爱番茄酱|  楼主 | 2014-9-10 09:45 | 只看该作者
PDB 可编程延时模块
PDB 模块可以用来当做普通定时器使用,但更重要的是,他可以用来触发ADC,这样就可以CPU无干预的进行固定频率的ADC转换

源代码浏览
pdb.c
pdb.h
当做普通定时器使用
/* 中断回调函数 */
void PDB_ISR(void)
{
    printf("PDB_ISR\r\n");
}

/* 触发10MS中断 */
PDB_QuickInit(kPDB_SoftwareTrigger, 10*1000);

/* 安装中断回调函数 */
PDB_CallbackInstall(PDB_ISR);

/* 打开PDB中断 */
PDB_ITDMAConfig(kPDB_IT_CF, true);

/* 开启软件触发 */
PDB_SoftwareTrigger();
触发ADC转换
PDB 可以触发ADC进行硬件转换

/* ADC 中断回调函数 */
void ADC_ISR(void)
{
    uint32_t value;
    value = ADC_ReadValue(HW_ADC0, kADC_MuxA);
    printf("ADC:%d\r\n", value);
}

PDB_QuickInit(kPDB_SoftwareTrigger, 10*1000);
PDB_SoftwareTrigger();


ADC_QuickInit(ADC0_SE17_E24, kADC_SingleDiff12or13);

/* 时能硬件触发模式 */
ADC_EnableHardwareTrigger(HW_ADC0, true);

ADC_StartConversion(HW_ADC0, 17, kADC_MuxA);
ADC_ITDMAConfig(HW_ADC0, kADC_MuxA, kADC_IT_EOF);
ADC_CallbackInstall(HW_ADC0, ADC_ISR);

/* 时能PDB触发ADC, 触发 ADC0模块muxA转换器, 延时100周期 */
PDB_SetADCPreTrigger(HW_ADC0, kADC_MuxA, 100, true);

使用特权

评论回复
60
偏爱番茄酱|  楼主 | 2014-9-10 09:48 | 只看该作者
Kinetis开发包项目,包含底层驱动、中间件及集成的众多第三方组件,用以为Freescale Kineits MCU开发提供软件平台支持。妈妈再也不用担心我的学习了

5fb89872jw1edq398r1hdj20c80fowfk.jpg (48.97 KB )

5fb89872jw1edq398r1hdj20c80fowfk.jpg

使用特权

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

本版积分规则