单片机嵌入式理论笔记

位运算:&与操作符(有0即等于0):一,清零操作对应位置为0其余为1。二,取一个数中的某些指定位,放弃的全部为0,需要的全部位1

|或运算:只要两个位中有一个为1,即为1

异或运算符^(两个数字相同即为0不相同即位1),用途:一,使特定位翻转为0不翻转,为1翻转,二,与零异或保留原值,三,交换两个值,不用临时变量

~取反运算符,也是单目运算符,按位取反1001

<<左移运算符,左移若干位,例如:a<<=2a=a左移两位的值,同时右边补零)

>>右移运算符,右移若干位,例如:a>>=2a=a右移两位的值,同时左边补零)

若左移溢出,则会把该值舍弃

2.1计算机的基本概念发展历史

2.2从晶体管到cpu

   2.2.1基本的逻辑关系:

与门/或门/非门/与非门(全为1时为0其余为1/或非门(全为01其余为0

/三态门(C1是输入为1,值为1,输入为0值为零,当C0的时候输入为01都是高阻)/异或门(一样为0不一样为1

高低的电压代表01

2.2.2组合逻辑电路:

半加器(首位的二进制加法运算)地址译码电路(特定的二进制数产生一个控制信号0或者1)解码器(通过一个输出信号产生一个特定的二进制数)D锁存器(储存数据当C0则数据不会因为D端的改变而改变,可以存贮一个高低电位的信号当C再次变为1则数据会释放)乘除法单元(2D锁存器的组合D触发器)

2.2.3概念cpu

四个bit数可以代表一个指令

2.3概念cpu、微控制器mcu和嵌入式系统

   2.3.1组成:

   Cpuramrom、引脚、外设、clock。。。

2.4八卦计算机史和创新

 

2.5不同领域不同系列的嵌入式系统

架构不同,指令集不同

 

2.6arm历史与mkl25z128-mcu

Arm一种架构 本课程中arm cotex构架,

mcu型号为M KL25 Z 128(存储128k V LK(封装形式)4(频率)

Arm可分成:应用处理器(a),实时控制处理器(r),微控制器(m)三种大类

向后几代逐一兼容

该单片机有32个引脚

3.1 cpu的基本结构和运行机制:

   3.1.1Cpu

运算逻辑单元:操作数、运算、运算结果、标志位(程序状态寄存器(零负溢出位))

寄存器组(用于临时保存/获取操作数):1非意识寄存器、2控制单元寄存器(pc寄存器(程序有序执行(时钟的驱动下))、sp寄存器(指向预先划定堆栈空间的底部)、指令分配寄存器)

栈(保存返回地址,和堆栈指针寄存器配合使用):1按照先入后出的方式工作2从顶部加入或取出数据

中断

时钟/复位

        储存

外设

3.2头脑体操

3.3.1arm的体系结构

     xPSR:保存cpu的设置状态的寄存器

           Apsr读取高四位的值(读取nzv0的基本的状态位)

           Ipsr读取后面的几位(中断时发生异常的中断号)

Epsr读取中间的一个bit(是否发生的异常中断)

Primask:被读取的是最后一bit(设置中断的开和关的寄存器)

Control:本课程中读取是主堆栈和进程堆栈设置(cup的工作模式(thre模式:跑main函数和函数的调用;和handler模式:当发生中断时去响应中断的状态)和状态的寄存器)

Basepri:按优先级开关中断的开关的寄存器

3.3.2头脑体操

3.4中断的概念和机制

       中断和轮询是相反的概念

       中断:由硬件来判断是否发生外部事件并通知cpu,并有专用的中断服务程序来处理这件事(外部事件打断程序,事件完成后再回到程序中)

1.        适合处理对响应时间非常短的时间

2.        适用于处理出现时间非常短的事件

3.        中断会降低功耗但是程序设计复杂

中断标志位(IF):有对应的中断标志,并引发cpu的中断请求,并可以通过读写操作来清除中断标志位

中断的堆栈占用:当有中断发生时,需要把中断之前当前的寄存器的值压入堆栈进行保存(保留中断前的现场以便进行中断事件发生之后的还原相当于时间停止)

egRO,R1,R2,R3,R12,LR,PC,XPSR

                       中断之后再执行中断函数

 

 

3.6复位、时钟、储存器和总线

   中断服务子程(ISR中断函数由cpu自动调用):在一些cpu中,中断服务子程不同于一般的c函数,函数退出时的返回汇编指令有所区别。(入RTI中断返回指令需完成堆栈操作也就是堆栈的地址逐一弹出)

                            armcortex mo+平台上,中断子程服务与一般c函数的写法没有区别,使用同样的汇报返回指令即可(堆栈弹出由nvic自动完成)

中断向量表:为了使cpu能够正确的找到cpu应该调用的中断服务函数

详细说明:在复位后中断向量表有默认的起始位置,每个中断在向量表中有相应的表项,该表项的值为改中断对应的赋予程序的地址(地址指针也就是中断函数的首地址)

中断优先级

中断的嵌套

3.7小结:Mcu的总体结构和程序运行机制

复位的流程:1将所有的寄存器恢复成默认值

            2确认mcu的工作模式

3.禁止掉全局中断

                4.关闭外设

                5.io置为高阻输入状态

                6.等待时钟震荡趋于稳定

                然后从固定地址取得复位向量并开始执行指令

    有多种引起复位的因素有相应的标志位和向量(可以进行不同的初始化流程相当于一种中断)

上电复位(上电是一种复位)

电源丢失复位

外部产生的手动复位信号

执行复位指令引发的复位

非法指令引起的复位

时钟丢失引起的复位

看门狗的复位

    时钟:指令执行的基本时间间隔,其中看门狗,定时器,异步通信等都依赖稳定的时钟。

      时钟树:MCU的内部是一个统一的时钟树,也就是可以把时钟的最大频率分频以供不同的外设的使用。(可以通过时钟放大电路来提高时钟的频率)

    存储器:rom/flashram

    内部总线接口:数据线,地址线,控制线

3.7小结:mcu的总体结构和程序运行机制

    外设(cpu通过外设和外部世界进行连接)

    不同的外设:1输入输出:DIO,ECT,PWM

                2模拟量处理:AD,DA

                3 通信:SPI,I2C,UART

    外设的访问:外设时通过一系列的寄存器来完成的设置的。

    所以:单片机编程的精髓在于储存器的使用

4.1第一种外设:IO

    引脚命名:端口PORT缩写为PT,例如PTE0

    每一个引脚可能会具有不同的功能,例如:点灯,通信

    IO通常是双向的(个别管脚是单向的)需要事先确定好每个IO的模式

    IO通常只是一个引脚的一个功能

    引脚的输出只能是高电平和低电平

    推挽输出,开源开漏输出

4.3 IO外设的进阶知识

    IO的灌电流能力高于拉电流能力(决定了为什么要用电源接灯泡而不用地接灯泡)

    机械抖动会对电信号造成干扰,所以要硬件(RC电路)去抖动或者是软件去抖动(延时对比确定)

    所以IO采样可能存在的问题:不适合高频信号的采样(可能无法得到稳定正确的状态采集,也就是信号信号源的频率要大于时钟周期的一个电平的时间)

    对于IO功能可以使能中断

有三个寄存器可以在程序运行时直接对每个引脚的状态进行规定(是否变为0或者1):PORTx_RCRnPORTx_GPCLRPORTx_GPCHRPORTx_ISFR

NVIC中断管理模块

中断的格式:

          void xxx_IRQhander (void)

          {

           …..

           clear the FLAG of interrupt

          }

4.4 嵌入式开发的基本概念与工具链

    交叉编译:在对象系统平台难以或不容易编译时非常有用(也就是把单片机接在电脑上进行程序的编译)

      开发板(大型评估板,小型板)

      编译器(变成汇编码)、汇编器(编程机器码)、链接器(把代码链接起来组成一个程序)IDE集成开发环境(把前面的几个器包括进去它指的是一系列拥有此功能的软件)

      模拟器(emulator):在计算机上虚拟出一个其他的平台(windows、安卓)并进行运行

      调试器:有许多不同的标准(BDM/JTAG/SWD它们都是一种通信协议)

              Cortex-M的在线调试是-OpenSDA,调试的appJlink

      编程、烧写器:应该是批量向单片机中写入程序的工具

4.5 嵌入式开发的进阶知识

   汇编源文件:.asm

 C源文件:XX.c.c++.h →(C编译器) 汇编语言源文件→

1(汇编翻译器)2目标文件.obj(未被分配地址)3链接配置文件.ld(类似程序空间的分配,linker来分配,编写有自己的计算机语法)4库文件.ldk

    最后得到可执行文件.exe.com.......

    Flash中的数据断电后不会丢失,不能随意的更改

4.6 嵌入式开发中的C语言

    1.选择合适的数据类型(尽量使用满足要求的最小变量类型)可以节省代码空间,提高运行速度(因为单片机的储存很不充裕)

    2.每个数据类型在不同的编译环境下的宽度可以是一个设定的值(不同的编译器宽度可能不一样) 

    3.避免直接使用基本数据类型(charintshortlong)——因为int类型在8bit(两个字节),32Bit(四个字节)系统上不同

          解决方法:用typedef定义成更清晰的数据类型

4.位操作:&(与)|(或)~(取反)<<(左移)>>(右移)

5.强制类型转换:例如 uchar_var=unsigned char)(高八位被舍去了)

                    Uchar_var=*((int*)(0x400FF0c0));

6.直接可以使用寄存器的名字来赋值是因为在库文件里已经把内存的首地址值赋到了这个寄存器的名字之中

7.中断程序是由cpu直接处理,所以根据单片机芯片类型的不同代码可能不同(一般是在声明函数类型时用interrupt,而在mo+芯片中直接在中断服务的代码中加入控制中断的开关就行了)

8.单片机的工作顺序:1.堆栈指针寄存器指向初始地址2.寄存器内所有地址对应值的归零3.main函数外全局变量的赋值4.call主函数

 

4.12智能车视角的嵌入式设计

    对芯片的使用要合理,了解芯片的特性。

5.1 arm微控制器外设学习概述

   外设知识概览

5.2arm微控制器外设:通讯

    每个寄存器有都会有一个属于它的物理地址

   串行,并行,同步(有时钟),异步(无时钟),半双工(通过开关改变消息流向),全双工(双向同时传输数据),对等方式,主从方式,单端信号(通过一条信号的高和低来判断01),差分信号(通过两个信号的大小来判断01

   可以把总线(BUS)理解成为一个传输指针(地址)的电路

   异步串行同步方式 一小段数据无时钟:空闲位,起始位,数据位(456789),奇偶校验位,停止位

   异步串行通讯(uart)的特点:串行,异步,全双工,对等,点对点

   SCI(串行通讯接口):

   Uart有两条信号线(1RT,2RX3接地线)

   uart方式中,RTRX是单向的(即一边用来发数据一边用来看数据,当两边因为两个设备中的时钟的频率不一样而使得接受端设备的信息索取会发生误差)

NRZ(不传输数据时位1)的编码方式

奇偶位的校验方式:奇校验就是填上一个数值使数据的1的个数为奇数个。

偶校验就是填上一个数值使数据的1的个数为偶数个。

根据比较大小的最小时间段长的时钟长度比较可得,当实际高频率与理论高频率的总误差不大于百分之五时可认为数据是准确的

RS-232的传输方式是UART,电平为正为0负为1的(TTL与正常的cmos相反的信号表达方式)

RS-232接口(UART)→UART-USB转换器(或者是UART-DB9)→PC端(USB接口的串行接口)

UART的编程步骤:

1.              打开两类时钟寄存器UART数据传输模块的时钟(芯片内有3UART模块)芯片内的振荡器经过锁环加强后的频率为20.97Mhz,而BUSCLK(总线时钟)的频率为时钟的一半10.48MhzUART1UART2是固定采用总线时钟的频率。而UART0可以变化,但默认为采用BUSCLK

                需要打开的两个时钟是引脚PORT的时钟(理解成为时钟许可)和UART模块的时钟。

 

2.指定引脚的功能给数据传输

  UART寄存器:UARTx_D数据寄存器(8个字节)

               UARTx_S 状态寄存器

               UARTx_C 控制寄存器

               

3.用寄存器来设置波特率,奇偶校验等等的功能的使用

5.4定时器

         最简单的时钟模块SysTickarm设计的,24bit位宽,内核外设,拥有4个寄存器分别为SYST_CSR时钟模块是否打开,中断,时钟的状态选择,中断标志位,SYST_RVR确定时钟周期,SYST_CVR当前的计数器数到多少,只要写入数据,内部数据会清零,SYST_CALIB

5.5 PWM

5.6 SPI寄存器

5.7 I2C通讯

5.8 ADC

6.1嵌入式系统的接口与设计

6.2嵌入式系统的实例

本文禁止转载或摘编

-- --
  • 投诉或建议
评论