你还在为看懂数据手册而苦恼吗,从零开始学单片机

2022-04-01   大方老师单片机

原标题:你还在为看懂数据手册而苦恼吗,从零开始学单片机

你还在为看懂数据手册而苦恼吗,从零开始学单片机

本章节白勺数据手册阅读技巧是综合多种芯片白勺数据手册来描述白勺。通用于多种芯片白勺数据手册阅读技巧通过本章节,c语言基础白勺人都可以做出点LED灯这样白勺简单操作了

前置知识

开始确定查CPU内核确CPU的机器周期

这个信息可能在芯片数据手册上有提供,可能需要去找这个芯片的内核的用户手册查找

查不到可以询问芯片提供方(注意区分芯片数据手册和内核用户手册是两个东西)

时钟周期1/FOSC(单位是时间ns,us,ms,s) //最小的时间单位

FOSC的单--->1/FOSC的单位

Mhz---->us

Khz---->ms

Hz---->s

机器周

一般查CPU内核概述或内核用户手册就可以知道

例如一个芯片的机器周期2个时钟周期,而这个芯片FOSC=4Mhz

那么这个芯片的机器周t=2*(1/FOSC)=2/FOSC=2/4=0.5us=500ns

FOSC的单位Hz,那么获得的周期单位s

1Mhz=1000000Hz

1Khz=1000hz

指令周期:指一条指令所花费的机器周期

单指令:指令周=机器周期(注意在一些流水线设计的内核中一个指令周期等于多个机器周期)

双指令:指令周=2*机器周期

1.查看开头部分的芯片特性

其大概包括如下信息

1.芯片架构

2.支持外设白勺种类和特性

3.支持最大时钟频率

4.有些手册会将待机功耗(一般说白勺是待机电流)和正常功耗写在这,

有些需要去查电气信息才能了解

5.单片机白勺相关特性

...等等

查看该手册支持哪些芯片

一般在支持哪些芯片就会画上支持芯片白勺管脚图

手册一般会有选型表描述支持的芯片型号

2.数据手册查询信息步骤

第一步:

1.(直Ctrl+F查找,或者通过目录查找)找到芯片的基本型模块框(或者结构框)

英文文档可查询如下关键字block diagram

结构框图可以大概了解芯片的如下信息

IO引脚

外部时钟源引脚

电源引脚

各种总线

有一个大概的了解

查询时钟来源,查看时钟树图

2.第二步

找到单片机的时钟源来源

(查询关键字:时钟源、系统时钟、时钟源框图、或时钟树框/震荡器配)配置时钟源

英文文档可查询如下关键字:

Clocksoscillator Clocks and startupClock treeOSCOscillator Configurations

注意有些单片机没有时钟配置,也就是它只有一个内部时钟,并没有分频和倍频电路,

也就不会有时钟树图

还有一些因为时钟源配置简单而没有时钟树图说明,碰到这样的查询技巧是找到该芯片的

OSC相关管脚,然后找该管脚相关的寄存器(通Registers查找到寄存器表)

单片机的时钟来源有三个

1 HSE OSC外部高OSC时钟

2 LSI RC 内部低RC时钟

3 PLL

如下图是东软某款芯片的时钟源框

图标含义

梯形图:选择分支(梯形底部为分支来源,顶部为选择结果输出)

一般矩形图:功能名称

DIV矩形:分频除以后面的数字

小矩形内部有交叉线:引脚

指向图形的箭头:寄存器配置

看框图配置时钟源

注意查FOSC的配置来源从右往左看,配置的时候最好从左往右配()

配置后的时钟源就是上图中最后FOSC这条线

1从这条线往左走,碰到第一个连接点连接到DIV16,

这表CLKO输出的FOSC/16的频率

2继续往左走,碰到一CLKSS的箭头指向的矩形

这表CLKSS这个配置位,作用是时钟切换,并且受到前面OSCS这个配置位的影响

0:表示低速时钟

1:表示高速时钟

3继续往左走,有分支,具体走那个分支还受OSCS这个配置位的影响

CLKSS选择的是低速时钟,

OSCS没有选择外部低速时钟的话则往下走INTOSCL

OSCS选择了外部低速时钟的话,那么则往最上面的路通OSCSXTAL

那么此时只需要从左往右配OSCSCLKSS这俩个配置位就可以完FOSC的配置了

CLKSS选择高速时,OSCS选择的非外部时钟源

那么走的就是走上面的线并通OSCS这个梯形走下面的线到Foscs这个梯形

Foscs这个梯形可以选择预分频,到INTOSCH

上面的步骤是从结果逆推,更容易看懂时钟的来源

而一般配置我们从左往右配置,比如开始用户就知道自己是要用高频时钟还是低频时钟

外部时钟还是内部时钟

例如

我们需要一8Mhz频率的时钟源

从手册上查到可知

INTOSCH提供的16Mhz

INTOSCL提供的32Khz

好像上面的都不符合我们的要求,但是手里又没8Mhz的外部振荡器

我们的策略是选INTOSCH,通过预分频来达到目的

所以从上面的框图我们选择INTOSCH开始FOSC结束这条路线

FOSCSFHIOSC/2预分频就可以获16Mhz/2=8MHz的频率了

然后再配OSCSCLKSS这两个配置位就可以了

3.查看关键配置和外设功能复用引脚

第三步:

查看引脚,以及引脚的涉及的功能和配置

从下面可以看到芯片相关引脚的功

上图是芯片的引脚排列以及功能

引脚从芯片带圆点的位置逆时钟从低到高排列

如上1VSS(电源负极,或者GND)16VDD(电源正)是芯片的电源相关引脚

PA0~PA7,PB0~PB7,表示的是普IO引脚

2号引脚

PA5:表示具有普IO外设功能

KIN5:具有外部唤醒功能(芯片睡眠器件可通过该引脚外部信号的电平变化来唤醒芯片)

PINT3:具有外部中断功能(外部信号通过引脚变化会产生中断,

一般这样的具有中断功能的引脚也具备唤醒功能)

OSC1:可以作为外部晶振输入

CLKI:外部时钟输入

可以通过管脚复用说明查询相关功能

PA5/KIN5/PINT3..描述使用左斜杠分隔,意义为引脚的复用功能

简单的说这个引脚可被多个功能使用(通过配置相关寄存器来选择该引脚使用的功能)

查看引脚复用功能表

一般为如下图表,一般在管脚图下方或者器件概述章节

4.外设配置

第四步:

根据使用的外设查询对应的章节

以普通IO(GPIO)外设配置为例

在数据手册上IO端口或者输/输出端英文文档查I/O Port

描述的信息有

1.描述外设的电路的简单框图

2.外设的功能

3.外设涉及到的寄存器

GPIO管脚的通IO配置步骤如下

1.配置管脚的方向,输入还是输出

2.配置管脚的数据,就是管脚的电平

PIC TRISA寄存器配置管脚的方向0:为输出1为输入

这个寄存器8位的寄存器,每一位代表着这IO端口的一个引脚

TRISA:配置的PA端口PA0~PA7这样8个引脚,

TRISB:配置的PB端口PB0~PB7这样8个引脚,

配置位不一定都用到,可能只用到其中几个,具体根据手册信息

寄存器查询技巧:

Registers查找到寄存器表,再通过寄存器的名称

找到寄存器的详细描述表

PORTA寄存器就是管脚的数据寄存器

假设,配置值16进制表示,可将其转换为二进制更直观查看与配置位的关系

TRISA=0x00

PORTA=0x01

上面配置PA0引脚输出高电平,如果你芯片上的该引脚连接了一LED

查看原理图上,LED灯是高电平点亮,这个设置就会点LED灯了

还有其他外设的配置流程一般入下

1.配置外设时钟源(例I2C,uart等外设)

2.配置该外设的复用引脚

3.根据手册配置该外设的其他寄存器

4.配置外设的中断(该外设有中断功能的)

5.编写中断服务函数,在函数内做自定义信号标记并清除该中断的标记位,

在主循环中轮训自定义信息标记,来判断该外设是否产生了中断

(服务例程中最好不要做耗时等操作,这样做是为了尽量减少对其他外设中断的影响)

5其他相关章节

1.存储器构成(一般是在自己设计软件包时用,以及自己实os内核查看,并且

这些信息只是简单的信息)

描述了该芯片的存储构成,寄存器的映射地址,堆栈、中断向量、数据存储器的映射地址等信息

2.电气信息

描述的是器件的电压,电流等信息

3.指令集

汇编中才用到

6.一个完整的程序流程伪代码

#include <芯片寄存器相关的头文件,由该芯片的软件包提供,

也可以自己根据手册的寄存器映射地址自己定>

unsigned char myFlag=0;

void IntFunction(){

//中断服务例程,有些需要由特殊的关键字定义如:

// void interrupt函数(void)

// void __interrupt()函数(void)

// 芯片不同服务函数的关键字也不一样,例STM可以修改启动文件自己定义

// 8位的芯片所有的中断都用一个中断服务函数处理,由寄存器的标记位

// 来区分产生的是什么中断,也有为不同中断分配不同服务函数的

if(xxxIE&&xxxIF){

//xxxIE:该中断的使能位

//xxxIF:该中断的标记位

//这些位的名称根据手册上的描述来

xxxIF=0;//清零中断标记一般都要立马清除标记位,否则下次中断不会进入中断服务函数

myFlag=1;

}

}

void main(void){

配置时钟

配置引脚

配置外设

while(1){

芯片运行...

if(myFlag){

myFlag=0;

//轮询到中断,在这里处理中断要达到的目的

}

///下面led闪烁的伪代码

led_();

delay(500);

led_()

delay(500);

}

}

说了这么多,大家记得留意下方评论第一条(或者私信我)有干~