单片机学习小组
直播中

李志静

7年用户 1307经验值
私信 关注

求大佬分享智能车K60学习笔记

求大佬分享智能车K60学习笔记

回帖(1)

王雪

2022-2-7 11:30:04
一系列定义或名称
MCU微控制单元(Microcontroller Unit) ,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit,CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。


内存是计算机中重要的部件之一,它是外存与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器和主存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,操作系统就会把需要运算的数据从内存调到CPU中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。


UART通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。


PLC可编程逻辑控制器(Programmable Logic Controller,PLC),一种具有微处理器的用于自动化控制的数字运算控制器,可以将控制指令随时载入内存进行储存与执行。


DMA直接存储器访问(Direct Memory Access)是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。


GPIO通用型输入输出(General-purpose input/output),其接脚可以供使用者由程控自由使用


I2CInter-Integrated Circuit。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。


SPI串行外设接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。是一种高速、高效率的串行接口技术。


ADC模数转换器(analog to digital converter)作用是将时间连续、幅值也连续的模拟量转换为时间离散、幅值也离散的数字信号,因此,A/D转换一般要经过取样、保持、量化及编码4个过程。在实际电路中,这些过程有的是合并进行的。


DAC数模转换器(digital to analog converter)它是把数字量转变成模拟的器件。DAC主要由数字寄存器、模拟电子开关、位权网络、求和运算放大器和基准电压源(或恒流源)组成。用存于数字寄存器的数字量的各位数码,分别控制对应位的模拟电子开关,使数码为1的位在位权网络上产生与其位权成正比的电流值,再由运算放大器对各电流值求和,并转换成电压值。


PIT可编程间隔定时器(programmable interval timer)


简单位运算
‘>>’,二进制右移。x>>5相当于除25 ^5
5
并向下取整。


‘<<’,二进制左移,效果参照’>>’。


‘&’,按位与。x&0x1f相当于只取二进制最后五位。


中断(Interrupt)
定义:指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断。
优先级:在某一时刻有几个中断源同时发出中断请求时,处理器只响应其中优先权最高的中断源。当处理机正在运行某个中断服务程序期间出现另一个中断源的请求时,如果后者的优先权低于前者,处理机不予理睬,反之,处理机立即响应后者,进入所谓的“嵌套中断”。中断优先权的排序按其性质、重要性以及处理的方便性决定,由硬件的优先权仲裁逻辑或软件的顺序询问程序来实现。
中断向量:对应每个中断源设置一个向量。这些向量顺序存在主存储器的特定存储区。向量的内容是相应中断服务程序的起始地址和处理机状态字。在响应中断时,由中断系统硬件提供向量地址,处理机根据该地址取得向量,并转入相应的中断服务程序。
“紧急事件”须向处理器提出申请(发一个电脉冲信号),要求“中断”,即要求处理器先停下“自己手头的工作”先去处理“我的急件”,这一“申请”过程,称中断请求(Interrupt ReQuest,IRQ)。
8051 定时器中断
8051的单片机有5个中断源,2个优先级


中断源:INT0(外部中断0),INT1(外部中断1),T0(定时器0),T1(定时器1),RXD和TXD(同属串口中断)


中断相关的特殊寄存器:


中断允许控制寄存器(IE)--------控制各中断的开放和屏蔽


定时器/计数器控制寄存器(TCON)-------定时器和外部中断的控制


串行口控制寄存器(SCON)-------串行中断的控制


中断优先级控制寄存器(IP)-------设置各中断的优先级


void funcname(void) interrupt x using y
{
        your code;
}


x 范围为0~4,分别代表5个中断源,例如外部中断INT0就是0,T0就是1,INT1就是2,T1就是3,串行中断就是4


y 的范围为0~3,分别表示4组工作寄存器,不写就用0,不写也可以


TLx和THx寄存器,x=0,1。高八位和低八位寄存器,用于计数,一共16位。TCON和TMOD,其中TCON用于开启定时器/计数器中断,TMOD用于设置定时器/计数器的工作方式。有以下四种例如TMOD= 0x01对应方式1。


TLx和THx的计算


例:定时10ms。晶振频率是12M,工作模式在方式1。


f = 12M/12 =1M(机械周期为时钟周期的1 12 frac{1}{12}
12



)即1秒有1 0 6 10^610


个机械周期,则10ms有1 0 4 10^410


个机器周期。从而65536-10000=55536,意思是计数器从65536 一直减到 55536 所用的时间就是10ms。55536的十六进制是0xD8F0,所以设置 TH0 = 0XD8,TL0=0XF0。


#include
***it LED0=P1^0;
unsigned char i;

void main()
{
        TMOD=0X01;  //设置使用定时器0,16位的定时/计数寄存器
        TL0=0xD8;    //低八位赋初值
        TH0=0XF0;    //高八位赋初值
        ET0=1;          //开启定时器0中断
        TR0=1;         //运行定时器0
        EA=1;          //开启中断总开关
        while(1);
}

void Delay(void) interrupt 1 using 0
{
        i++;
        //  TR0=0;//进入中断函数时,关闭定时器  似乎不是必要的语句
        TL0=0XD8;//重新赋初值
        TH0=0XF0;
        if(i==20)//因为10ms一次处罚看不出明显结果,所以让20次触发才让灯变一次
        {
        LED0=~LED0;
        i=0;
        }
        //   TR0=1;//重新开启定时器   似乎不是必要的语句
}


Kinetis K60介绍
简单的说, K60 是一块 MCU 芯片,其内部还可以细分多个模块: Cortex-M4 内 核、 GPIO、 UART、 I2C、 SPI、 ADC、 DAC、 DMA、 PIT、 FTM 等。除 Cortex-M4 内核 模块外,其他的 GPIO、 UART 等模块就是 K60 的外设。


K60模块
PORT模块
PORT 模块,是 K60/KL26 的管脚管理模块,控制每个管脚复用到各个不同的内部模块(GPIO、UART、 I2C 等),还可以配置每个管脚的各种属性(上拉下拉电阻、无源滤波等)。 似乎是用来触发一系列中断而使用的。以下给出相应的函数,作为做软件的菜鸡虽然写不来但起码也得看吧。中断的逻辑应该为:


中断初始化port_init
设置中断向量set_vector_handler
使能中断enable_irq直接调用库函数即可
//中断初始化函数,ptxn是对应端口号,cfg是端口属性配置
//example: port_init (PTA8, IRQ_RISING | PF | ALT1 | PULLUP ); 初始化 PTA8 管脚,上升沿触发中断,带无源滤波器,复用功能为GPIO(对应ALT1) ,上拉电阻
void  port_init(PTXn_e ptxn, uint32 cfg )
{
    SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << PTX(ptxn));//开启PORTx端口
    PORT_ISFR_REG(PORTX_BASE(ptxn)) = (1<     PORT_PCR_REG(PORTX_BASE(ptxn), PTn(ptxn)) = cfg;// 复用功能 , 确定触发模式 ,开启上拉或下拉电阻
}


//中断处理函数,PORT_FUNC函数前两个参数对应端口号,当对应引脚触发中断时会执行最后输入的函数,在这里是key
void PORTD_IRQHandler(void)
{
        PORT_FUNC(A,6,key);
}


//设置中断向量表里的中断服务函数,只有中断向量表位于icf指定的RAM区域时,此函数才有效
//example:set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler)
void set_vector_handler(VECTORn_t vector , void pfunc_handler(void))
{
    extern uint32 __VECTOR_RAM[];
    ASSERT(SCB->VTOR == (uint32)__VECTOR_RAM);//断言,检测中断向量表是否在 RAM 里
    __VECTOR_RAM[vector] = (uint32)pfunc_handler;
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分