首先说明
半路出家 母语能力十分有限 视频中肯定有讲错 或者理解不对的地方 还望大家能多多见谅 欢迎大家提出宝贵意见!
- 针对人群: 学习 飞思卡尔Kinetis K系列的朋友们 硬件不限
- 入门难度: 纯小白Plus+ 高手勿喷
- 针对芯片: K60DN512系列
- 论坛: www.beyondcore.net
谢谢大家!
学前班 - 环境搭建
软件工具 开发环境安装
源代码编辑工具介绍和使用
- NotePad++
- SourceInsight
驱动类 安装
- 异步串口(UART)驱动 CH340G
- 顺便介绍下串口: 最古老的的计算机通讯方式 速度慢 简单 比如现在在 单片机中流行的 UART 和 SPI 就是数据串口,好像很多人都误认为只有UART叫做串口。。
- Jlink 驱动 (Jlink JTAG SWD 都是什么)
UART 串口工具 安装
- 串口调试助手 下载:www.beyondcore.net
- PuTTY 下载:官网
IDE 安装
- 什么是IDE? 集成开发环境
- 主流IDE: Keil(MDK) 下载 官网
- 主流IDE:IAR (版本兼容问题。IAR兼容性差) 下载 官网
获取必要的资料
芯片介绍 手册下载
- 上节课补充: 所有软件都尽量安装在英文目录下 否则可能出现比较纠结的问题。
- Goto www.freescale.com 获得最详细最专业的内容 和选型表
- 获取参考资料: (都会放到开发板光盘中 但是推荐大家学习自己寻找获取 不要拿来主义 毕竟这是工程师的基本技能)
- 所有资料都 我都会放到开发板光盘资料中
- 目标芯片 :MK60DN512VLQ10
- Reference Manual: K60P144M100SF2V2RM
http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=K60_100&nodeId=01624698C9DE2DDDAF - Cortex-M4 Generic User Guide
- Data Sheet
Keil 工程配置 新建工程 目标:点亮小灯
芯片启动过程(启动文件做的事情)
- CMSIS 启动标准文件 在哪? Keil安装目录
- MK60D10.h 芯片头文件(.h)
- system_MK60D10.h 时钟配置头文件(.c)
- startup_MK60D10.s 启动文件(.s)
- system_MK60D10.c 时钟配置文件(.c)
启动文件内容做了什么
- 设置栈 (调用C函数前必须设置栈) CM4手册2.1.3
- 调用main
- 设置main返回地址
- 关看门狗 (SystemInit 函数实现)
- 设置时钟 (SystemInit 函数实现)
code indent 设置
点亮小灯所要做的寄存器配置
- SIM - 开关
- PORT - 选择引脚复用
- GPIO - 设置输出 输出1
- 位操作 |= &= ~ 不要影响其他位
IAR 工程配置 新建工程 在线调试 目标:点亮小灯#
CMSIS 启动标准文件
- 启动文件 system_MK60D10.c startup_MK60D10.s
- 头文件 system_MK60D10.h MK60D10.h
- 和 Keil相同,但是由于编译器的差别startup_MK60D10.s内容是不同的,但是实现的功能是一样的。
- system_MK60D10.c system_MK60D10.h 和 和 Keil完全相同。都是C语言编写。
- 启动文件的作用见 上一课:Keil新建工程
code indent,Linker file,flash loader 头文件路径 等配置
- Code indent: Tools->Option
- Linker file: 默认即可
- flash loader:默认即可
- 头文件: 相对路径 绝对路径
实现点灯代码
- 点亮小灯的代码和Keil完全一样。
- Debug 和 Release 区别,优化等级 调试时请用Debug
- 选择 仿真器 , IAR 在线调试
- IAR下几个好用的快捷键:
- Ctrl+D 调试
- Ctrl+K 注释
- Ctrl+Shift+K 反注释
其他
- 以后视频讲解 主要以Keil为主,实际上用Keil和IAR主要看个人偏好,两者相同优化等级下 编译出来的代码size 和 执行效率相近。
3 GPIO PORT 原理配置 详细介绍 调试技巧 工程组织
3.1 Jlink下载调试时可能遇到的问题
3.2 头文件详解
- GPIO知识通用,适用于大部分 Kinetis系列
- 重新组织工程 可以根据自己的喜好 (include path问题 open file dir问题)
- 头文件中的GPIO寄存器定义
- volitale 防止编辑器自作聪明 优化
- __I __IO 什么意思?
- const 关键字 防止误写 帮助程序员少犯错误
Keil IAR 在线调试 蜂鸣器 按键读入
- Keil 中在线调试
- IAR 中在线调试
- 调优化等级,看现象
- 驱动蜂鸣器
- 数据读入 (配置片内上拉电阻)
开发板例程文件结构介绍 GPIO 及 位带操作 按键实验
开发板例程结构介绍
- 获得开发板例程代码 www.beyondcore.net
- 新建工程 复制工程模板 都可以
- 加入全局宏定义 以包含正确的头文件
- 至少包含 common.c common.h 和 gpio.c gpio.h 和 systick.c systick.h
- gpio驱动文件演示 及原理实现
- 按需求加入其它driver文件
位带操作 及 实现原理
- GPIO位带操作原理 本质都是操作寄存器 省去了 读-改-写 的步骤 实现原子操作。
- 输出 操作 PDOR
- 输入 操作 PDIR
- CM4 GUD 2.2 Memory model
- CM4 GUD 2.2.5 Optional bit-banding
- 流水灯
简单的按键状态机
- 位带操作的应用
K60时钟系统简介
- 相对比较复杂。
- 最重要的图:5.3
- 时钟名称介绍: 主要的是: 5.4.1
- MCGOUTCLK
- Core/System Clock
- Bus Clock
- Flexbus Clock
- 有关的模块:
- MCG:输出各种时钟,有2个内部时钟源 和倍频器 FLL PLL
- SIM:控制时钟开关,分频
- OSC:外部晶振震荡电路
- 几种时钟模式,实际上就是在MCG模块中各种走向
- FEI: FLL Engaged Internal
- FEE: FLL Engaged External
- PEE: PLL Engaged External
-
MCG模块下面的Figure 25-1.
-
应用,比较复杂,调试也比较困难,容易出错,
-
MCG->C6 控制PLL倍频
-
MCG->C4控制进入PLL前的分频
-
直接添加system_xxx.c 就可以了。(最好也不要修改原来的)
Systick 系统滴答定时器
- 中文翻译 只好叫做系统滴答定时器 CM4手册 4.4章节
- 他属于CM4内核外设,和K60没关系,他的寄存器定义在Core_cm4.h
- 寄存器介绍
- Polling 模式实验延时
- 中断方式,中断向量表 介绍 硬中断 弱定义
UART 通用异步串行收发器
基本概念介绍
- 首先说明:K60 UART 功能强大(FIFO 硬件流控 各种帧格式 IR 等等)->比较复杂->比较难配(寄存器多)
- 本节只演示学习最常用的功能。如果比较了解串口可直接PASS本节
- 串口硬件: 单片机TTL电平的串口 数据的传输使用 2根线 Tx Rx(当然还有其他线) 一般还要供地 , 看开发板原理图
- 全双工概念: 准许同一时刻2个方向上同时传输(手机)
- 异步概念: 按帧发送,一帧一帧之间没有固定的时序要求,简单,效率低(有起始位和停止位的开销)
- K60 所支持的UART 一共5个,引脚在哪里看 RM-Pinout一节
- 串口帧格式: 最简单的一种介绍 N-8-N-1 RM:52.4.5.3
应用演示 轮询发送 轮询接收##
- 使用于大多数 K系列
- 例程里默认将printf连接到第一个初始化的串口上
- 基本函数:
- UART_Init
- UART_ReadByte
- UART_WriteByte
- 基本演示 LOGIC
- 校验位演示: 8bit parity 9bit parity- no parity 用LOGIC抓图
- parity 奇偶校验位:最简单的错误检测机制
- 校验位怎么算?UART->C1[PT] 有解释
更加简便的一种初始化方式 打印芯片信息
- 上节补漏: UART_QuickInit
- 打印芯片信息
应用演示 中断发送 中断接收##
- 为什么要中断发送接收,轮询, polling blocking ,non-blocking 概念
- K60里有很多UART中断,例程代码只实现了2个最常用的
- 发送完成中断
- 接收完成中断
- UART中断接收例程详解(常用的模式)
- UART中断发送例程详解(不常用)
- 编程实现-原理-软回调函数
- Polling IT DMA 3种基本模式
中断发送 中断接收
- 主要学习中断接收就好,中断发送不是很常用
PIT(周期性定时器模块)
原理寄存器讲解
- 很简单,类似Systick 相当于Systick 的增强版
- 寄存器不多,逐一介绍逐位介绍
- SysTick能实现的PIT都能实现,PIT能实现的SysTick也都能实现
- 时钟源 BusClock, 可以用PIT Trigger K60上其他硬件模块
- 寄存器
- MCR : 全局控制
- LDVAL:Reload值
- CVAL :当前计数值
- TCTRL:各个通道开关
- TFLG :中断/溢出标准
PIT具体编程应用
- 例程源码分析 产生定时中断
看门狗
看门狗原理介绍
- 什么是看门狗?
- 看门狗实际上是一计数器,在程序运行中,你得抽空去清看门狗,不能让计数器计满.一但程序在干扰下跑飞了,没去清看门狗,看门狗数值计满后,就会发出一复位脉冲,让程序复位。
- 看门狗本质上也是硬件定时器,只不过他是正向计数的
- 开启看门狗后,要在看门狗时限内“喂狗(重新清0Val值)” 这也是system_xxx.c 里面先禁止看门狗的原因
- 时钟源 busclock or LPO clock
- 独立看门狗 窗体看门狗
看门狗编程实现
- 应用编程实现,设计demo
- 独立看门狗
- 窗体看门狗
- wdog reset counter 记录看门狗复位了多少次
外部引脚中断
外部引脚中断原理
- Kinetis K 系列几乎所有的引脚都可以配置为 外部中断、
- 中断触发条件都可以编程设置为:
- 上升沿触发
- 下降沿触发
- 上升或下降沿触发
- 高电平触发
- 低电平触发
- 相关的寄存器位 逐寄存器逐位讲解
- PORT->PCR[ISF] 中断标志
- IRQC 触发源配置
外部引脚中断编程实现
- 例程分析: 每一个端口32个引脚共享一个中断,看中断向量表
- 例程分析, 外部引脚中断
- 总结: 开启中断的一般步骤:
- 开启模块本身的中断(IRQC)
- 开启NVIC控制器上对应的中断(NVIC_EnableIRQ函数)
- 配置中断优先级(下节课讲)
NVIC 嵌套向量中断控制器
原理介绍
- 比较理论 比较枯燥,编程应用可以直接PASS本节
- NVIC 嵌套向量中断控制器,内核外设 内核中断管理器
他与内核有很深的"私交" 通过PPB总线连接。 - 相关 寄存器:
- ISER: Set Enable
- ICER: Clear Enable
- ISPR: Set Pending
- ICPR: Clear Pending
- IABR: Active bit Register
- IP: Priority Register (8Bit wide)
- STIR: Software Trigger Interrupt
- 还有一个在 SCB->AIRCR 中,控制优先级分组
- 对用户接口和作用:
- 中断开关
- 管理中断优先级
- 中断开关:
- 相关寄存器 ISER[8] ICER[8]
- 自己配太麻烦,ARM再推CMSIS,所以他肯定有CMSIS函数 Enable_IRQn Disable_IRQn
- 看下我们的开发板例程,实际上开中断之钱都会打开NVIC
- 中断优先级:
- 每个中断可以配置为255级,就是一个8bit寄存器分配给一个中断IP[0] - IP[240], 但是根据K60RM,只有高4位有效。(记住每个中断有4位配置位,优先级0-15)
- 这16位中断优先级到底怎么优先呢? CM4 GUD:
- 这16个优先级又被分成
- 组优先级(抢占优先级)
- 子优先级
编程应用
- PIT demo NVIC 抢占与非抢占的效果。
- GPIO KEY 全面演示NVIC中断优先级的功能。
ADC(模数转换模块)
K60 ADC功能介绍及引脚分配
- 特性: (SAR ADC)
- 最大16bit转换精度
- 最大4组查分,24路单端输入
- 可配置的转换速度
- DMA触发,硬件软件触发,连续触发
- 可配置的时钟源
- 内置温度传感器
- 硬件平均功能
- 可选择的电压参考源
- 自校准
- 转换时间,后面讲
- 引脚:
- VDDA VSSA: 模拟电源输入
- VREFH VREFL:模拟参考电压
- ADC_Chn 转换通道: 包括内部通道 (ADC模块只有2个,通道有N个,分时复用)
- ADC转换通道:3.7.1.3
- ADC通道对应的引脚如何找? Ch10 PinMux
- 开发板上ADC通道: ADC0-DP0,ADC0-DM0
- ADC模块block: 35.1.2
- 很强大,细节很多 本视频也不可能把每个功能细节通通走一遍,所以只能带大家学习下基本的架构和功能,引导大家自己学习
- 后面还需要大家努力自己挖掘。其实学到这里,配置这些底层操作无非就是对就是对寄存器写来写去。
- 这种编程,软件完全有硬件决定,手册上让你这么写,你就得这么写,没有那么多为什么。所以,学习一款芯片的外设,其实也称不上学习,就是看说明书,把说明书上的语言描述编程代码而已。对于编程人员没有多少自由可言。并非真正意义上的软件编程。嵌入式底层驱动,尤其是裸机驱动,更是如此。
编程应用
- 上节课遗留:
- 通道复用: 3.7.1.5
- SCAn寄存器 SC1A只能软件触发 SC1n 可以硬件触发。
- ADC 单端输入例程 步骤: 看ADC_Init()
- 打开时钟 SIM->SCGC6 SIM->SCGC3
- 校准(略过)
- 选择输入时钟源 ADC->CFG1
- 分辨率 ADC->CFG1
- 时钟参考源ADC->SC2
- 触发模式 ADC->SC2
- 是否连续转换 ADC->SC3
- 硬件平均功能 ADC->SC3
- …
- 单端差分 是否使能中断,配置通道 ADC->SC1n
- 配置Pinmux
- ADC 单端输入例程 使用ChlB Mux
- ADC中断
- PIT 触发ADC
- 转换时间计算: 35.4.5.5
- 结果寄存器R 数据保存格式
ADC 内部温度传感器
- 属于ADC模块,算是ADC模块的一个应用 35.4.9
VREF 电压参考源#
- 可以产生1.2V 电压参考 供给内部模拟模块或者外部模块(通过VREF_OUT)
- 应用例程
DAC模块
原理介绍
- 比ADC略简单,特性 固定12位,不同的系列有0,1,2 等等多个DAC模块
- 多说一句,读手册是最全面,最好的学习方法。如果想深入学习芯片本身,通读一遍英文原版手册是最好的办法和最基本的要求。如果想直接应用,直接用别人的代码就好。无需了解太详细。
- 输出引脚
- DAC_OUT0
- DAC_OUT1
- Block Diagram
- 触发方式:
- 硬件触发(PDB)
- 软件触发
- 参考源选择(Chip Configuration)
- 3.7.3.3
- 数据触发:硬件16word buffer
- 无buffer 37.5.1
- 有buffer 通过C2 DACBFUP 设置上限
- 中断触发源:
- DACBFWMF : watermark flag
- DACBFRPTF: reach 0
- DACBFRPBF: reach C2[DACBFUP]
- 输出电压计算公式
应用例程
- 用 ADC 测量DAC输出的电压
- Buffer模式下 软件触发
- DAC 产生中断
TSI 电容触摸
原理介绍
- 原理介绍
- 56.7.1
- 频率计算公式:Figure 56-35. Equation
- 一个电极采样时间: Figure 56-37. Equation 3: Electrode sampling time
- K60上的TSI引脚 Pinout
- 中断 EndOfScan 中断 或者OutofRange
编程应用
- 开发板上TSI的连接 (注意和JTAG共用 所以下载后要拔掉JLINK)
- TSI获得Counter并打印
- TSI 中断,控制小灯
RTC 实时时钟
原理介绍
- 目的: 提供掉电不丢失的 实时时钟
- 特性:
- 外部引脚
- EXTAL32
- XTAL32
- RTC_CLKOUT
- RTC_WEAKUP
- RTC时钟来源 独立的32.768KHz时钟 秒脉冲是如何产生的? 如何将计算真实时间?
- RTC寄存器介绍
编程应用
- RTC 读取 设置时间
- RTC 闹钟设置
- RTC ClkOut
DMA 直接存储器读取
基本概念介绍
- DMA(Direct Memory Access)是 直接内存存取, 数据搬运时无需CPU干预 比如memcpy的问题
- 寄存器比较多,换一种讲法。先讲例程和概念
- 既然是内存存取,必要的基本参数有:
- 源地址 目的地址(来源去向)
- 传输多少字节?
- 每次传输的位宽? 8位16位32位?
- 传输什么时候开始,每次的时间(触发源)是什么?
- 每次传输完成后,需不需要调整源地址 目的地址, 调整多少?
K60 EDMA Mem2Mem例程:
- K60有一个eDMA模块一个DMAMux一起来完成DMA工作,eDMA根据芯片不同有不同的通道数,每个通道都可以独立完成传输,我们的芯片有15个通道。
- 主循环MajorLoop: 循环多少次子循环
- 子循环 MinorLoop:每次tirgger之后,数据搬运多少次
- 触发源查询?Chip config
- Mem2Mem 的代码分析
- DMA的中断 Half Major
- 修改参数,看现象
寄存器分析
- K60上的DMA系统分为 eDMA 和 DMAMux
- DMAMux
- eDMA 主要寄存器
- CSR
- …
- …
使用DMA来发送接收串口数据
- DMA-UART发送数据
- DMA-UART回环测试例程
使用DMA来测量外部脉冲
- 看到智能车论坛有这个例程
I2C 总线
部分讲解
- I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
- 只介绍最简单也一种I2C模式: 2线制 7位地址 K60做主机 最快100Kbit模式
- 信号:
- SCL 时钟
- SDA 数据
- 不同的型号的芯片上也有不同数量的I2C模块,开发板上的芯片有2个I2C 模块
- I2C传输帧格式: 51.4
I2C 扫描总线上的设备
I2C AT24CXX
I2C ADXL345
Flexbus 总线
6800 & 8080 总线
- 很多外设基本遵循8080或6800时序
- 6800又叫moto总线,8080总线又叫Intel总线。
- Intel总线的控制线有四根,RD写使能, WR读使能, ALE地址锁存, CS片选。
- 而moto总线只有三根,R/W 读/写,ALE地址锁存,CE片使能。
K60 Flexbus
- FlexBus 在System Mamory Map中的区域
- AN4393
- 引脚 Pinout & Chip configuration 一节有
- 可以接6个不用的外设
FlexBus驱动 SRAM
- 硬件接线
- 程序代码
FlexBus 驱动LCD
- 硬件接线
- 程序代码
FTM 模块
- 灵活定时器 K60中比较强大和复杂的定时器 就想他的名字一样,非常灵活,内容非常多。本视频也不可能一一尽述。更多内容还需要大家慢慢发掘
- 主要应用
- 既然是定时器,可以当普通定时器用
- 产生PWM波 电机控制等
- 正交解码
- 输入捕捉
- K60中的FTM模块,3个,每个模块又有不同个数的通道: FTM_CH0-FTM_CHn(PinOut)
- 基本原理 Functional Description
FTM 产生PWM波
- CPWMS & EPWM
- Function Desciption
- 39.4.6
FTM 正交解码
- 编码器种类型号
- 介绍
- 例程