找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 537|回复: 0
打印 上一主题 下一主题
收起左侧

山外K60—学习笔记

[复制链接]
跳转到指定楼层
楼主
ID:979806 发表于 2021-11-16 21:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    写这个的原因是,作业三需要理解学长们的程序(节能二队程序),画出思维导图,而学长的程序是用KEA128作为开发板。

一、开发板 TRK-KEA128

如今车载的电器设备、娱乐功能越来越多,然而更多的功能也意味着更多的电子元件、更多的线路,这无疑让车身布线成为一项十分艰难的工作,因此,CAN总线出现啦。

通俗的讲,CAN总线好比在汽车的控制元件之间建立的网络,使它们实现资源上的共享(CAN总线通信方式:节点发送的信息可被网络中所有其他节点看到),这样,不仅大大减少了相同传感器、导线的数量,同时也使可以配置的控制单元读取更多信息,实现更加精确的控制。

显然,TRK-KEA128就是基于CAN功能的控制芯片。

TRK-KEA128板载的资源:

    采用80 LQFP封装的Kinetis KEA128 MCU
    采用PK20DX128 MCU的板载OpenSDA调试和编程电路
    一个CAN通信接口、一个LIN通信接口
    一个环境光传感器、四个用户LEDs
    一个MCU RESET按键、一个SDA RESET按键、两个用户按键
    12V DC Jack输入、5V MicroUSB口输入

TRK-KEA128板载的电路功能:

    主控MCU以及延生的电路功能(例如IO口引出的用户扩展接口、按键\LED电路、利用ADC功能拓展的光线传感器电路)
    基于PK20DX128 MCU的板载OpenSDA调试电路
    通过外部PHY扩展的CAN、LIN接口电路

下图是KEAZ128的中文手册目录,来自网络(侵权必删):
二、微控制器  PKEAZ128AMLK

主控MCU是 PKEAZ128AMLK,基于48MHz主频的32位ARM Cortex-M0+处理器,集成了128KB FLASH以及16KB RAM,主要集成了CAN控制器,适合面向汽车网络的应用设计,并且采用了常见的LQFP80封装。

PKEAZ128AMLK微控制器的特点:

    高达48 MHz的ARM Cortex M0+内核,集成128KB FLASH、16KB RAM
    2.7V~5.5V宽电压供电
    一个16通道12位SAR ADC,两个模拟比较器、定时器、安全模块等
    SPI、I2C、UART、CAN2.0A/B、KBI等接口,最高支持扩展71GPIOs
    电源管理模块(PMC)具有三种模式:运行、等待、停止

PKEAZ128AMLK微控制器的特性:

    基于ARM Cortex-M0+处理器,功耗低,生态圈广泛;
    集成了CAN2.0A/B控制器,具备CAN网关功能,适合需要CAN总线网络的应用。

三、KEA128的KBI模块

恩智浦Kinetis KE0x、KEA 系列MCU片上集成有KBI ( Keyboard Interrupts 键盘中断模块 )。

KEA128有两个支持引脚中断的 KBI 模块,KBI0和KBI1。

KBI使用总线时钟,SIM_SCGC寄存器使能KBI总线时钟。
3.1  KBI端口

3.2 模块功能配置代码
3.2.1 初始化

void kbi_init(uint_16 kbiNo, uint_8 kbiMod, uint_8 EdgeSelect)
{
//(1)声明局部变量
uint_8 module; //模块号
uint_8 chn; //通道号
//(2)解析模块号和通道号
kbi_mux_val(kbiNo,&module,&chn);
//(3)根据不同模块号进行设置
switch(module)
{
//(3.1)KBI0模块
case 0:
SIM_SCGC |= SIM_SCGC_KBI0_MASK; // 使能KBI0总线时钟
KBI0_SC = 0; //初始化KBI0_SC寄存器(状态寄存器)
if (kbiMod == 0) //进行边缘检测
{
KBI0_SC |= 0x00;
}
else //否则 检测和电平控制
{
KBI0_SC |= 0x01;
}
//触发条件
if(EdgeSelect == 0) //下降沿或低电平触发
{
KBI0_ES |= KBI_ES_KBEDG(0x00); //当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发
PORT_PUE0 |= 1<<chn;
}
else //上升沿或低电平触发
{
KBI0_ES |= KBI_ES_KBEDG(1<<chn);//当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发
}
KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
break;
//(3.1)KBI1模块
case 1:
SIM_SCGC |= SIM_SCGC_KBI1_MASK; // 使能KBI1总线时钟
if (kbiMod == 0) //边缘检测
{
KBI1_SC |= 0x00;
}
else //边缘检测和电平控制
{
KBI1_SC |= 0x01;
}
if(EdgeSelect == 0) //触发条件:0-31位每一位代表每个引脚
{
KBI1_ES |= KBI_ES_KBEDG(0x00); //当 kbiMod = 0,表示下降沿; 当 kbiMod = 1,表示下降沿或者低电平触发
PORT_PUE1 |= 1<<chn; //上拉引脚
}
else
{
KBI1_ES |= KBI_ES_KBEDG(1<<chn); //当 kbiMod = 0,表示上升沿; 当 kbiMod = 1,表示上升沿或者高电平触发
}
KBI1_PE |= KBI_PE_KBIPE(1<<chn); //中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
break;
}
}

None
3.2.2 KBI模块中断使能

void kbi_enable_irq(uint_16 kbiNo)
{
//(1)声明局部变量
if(kbiNo == 0)
{
KBI0_SC |= KBI_SC_KBSPEN_MASK; //使能清除中断源引脚寄存器
KBI0_SC |= KBI_SC_RSTKBSP_MASK; //中断源引脚寄存器清0
KBI0_SC |= KBI_SC_KBIE_MASK; //使能KBI0中断
}
else
{
KBI1_SC |= KBI_SC_KBSPEN_MASK; //使能清除中断源引脚寄存器
KBI1_SC |= KBI_SC_RSTKBSP_MASK; //中断源引脚寄存器清0
KBI1_SC |= KBI_SC_KBIE_MASK; //使能KBI1中断
}
//(2)清空中断寄存器
NVIC_ClearPendingIRQ(table_irq_kbi[kbiNo]);
//(3)使能中断
NVIC_EnableIRQ(table_irq_kbi[kbiNo]);
}

None
3.2.3 禁用KBI引脚中断

void kbi_disable_pin_irq(uint_16 kbiNo)
{
//(1)声明局部变量
uint_8 module; //模块号
uint_8 chn; //通道号
//(2)解析模块号和通道号
kbi_mux_val(kbiNo,&module,&chn);
//(3)根据不同模块号进行设置
switch(module)
{
//(3.1)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
case 0:
KBI0_PE &= ~KBI_PE_KBIPE(1<<chn);
break;
//(3.2)禁止中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
case 1:
KBI1_PE &= ~KBI_PE_KBIPE(1<<chn);
break;
}
}

None
3.2.4 使能KBI引脚中断

void kbi_enable_pin_irq(uint_16 kbiNo)
{
//(1)声明局部变量
uint_8 module; //模块号
uint_8 chn; //通道号
//(2)解析模块号和通道号
kbi_mux_val(kbiNo,&module,&chn);
//(3)根据不同模块号进行设置
switch(module)
{
//(3.1)KBI0模块
case 0:
KBI0_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
break;
//(3.2)KBI1模块
case 1:
KBI1_PE |= KBI_PE_KBIPE(1<<chn);//中断使能:0-31位每一位代表每个引脚,0 禁止, 1 使能
break;
}
}

None
四、KEA128的时钟配置

参见NXP KEA128 DS(S9KEA128P80M48SF0.pdf ),可以知道MCU最高支持48MHz core frequency.

中文版数据手册:

具体的时钟定义:

后续待更:

系统时钟(core clock/system clock)与总线时钟(bus clock/flash clock),FTM/PWT关系

core clock = ICSOUTCLK / div1, bus clock = core clock / div2, FTM/PWT时钟 = core clock / div3
本文采用 CC BY-NC-SA 4.0 许可协议,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:jarrod-zhou
来源:山外K60——学习笔记之二 – 科创与算法小屋
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表