你还在为看懂数据手册而苦恼吗,从零开始学单片机
本章节白勺数据手册阅读技巧是综合多种芯片白勺数据手册来描述白勺。通用于多种芯片白勺数据手册阅读技巧通过本章节,有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.第二步
找到单片机的时钟源来源
(查询关键字:时钟源、系统时钟、时钟源框图、或时钟树框图/震荡器配置)配置时钟源
英文文档可查询如下关键字:
Clocks、oscillator、 Clocks and startup、Clock tree、OSC、Oscillator 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选择了外部低速时钟的话,那么则往最上面的路通过OSCS走向XTAL
那么此时只需要从左往右配置OSCS和CLKSS这俩个配置位就可以完成FOSC的配置了
如果CLKSS选择高速时钟,并且OSCS选择的非外部时钟源
那么走的就是走上面的线并通过OSCS这个梯形走下面的线到达Foscs这个梯形
然后Foscs这个梯形可以选择预分频,到达INTOSCH
上面的步骤是从结果逆推,更容易看懂时钟的来源
而一般配置我们从左往右配置,比如开始用户就知道自己是要用高频时钟还是低频时钟
外部时钟还是内部时钟
例如
我们需要一个8Mhz频率的时钟源
从手册上查到可知
INTOSCH提供的是16Mhz
INTOSCL提供的是32Khz
好像上面的都不符合我们的要求,但是手里又没有8Mhz的外部振荡器
我们的策略是选择INTOSCH,通过预分频来达到目的
所以从上面的框图我们选择从INTOSCH开始到FOSC结束这条路线
FOSCS选择FHIOSC/2预分频就可以获得16Mhz/2=8MHz的频率了
然后再配置OSCS和CLKSS这两个配置位就可以了
3.查看关键配置和外设功能复用引脚
第三步:
查看引脚,以及引脚的涉及的功能和配置
从下面可以看到芯片相关引脚的功能
上图是芯片的引脚排列以及功能
引脚从芯片带圆点的位置逆时钟从低到高排列
如上图1号VSS(电源负极,或者地GND)和16号VDD(电源正极)是芯片的电源相关引脚
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);
}
}
说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~