专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
单片机的要务——控制外设
2019-04-15 17:38
发布
生成海报
站内文章
/
PIC单片机
10219
0
1441
单片机的要务——控制外设
首先明确一个概念:当我们使用单片机的时候,我们在使用它的什么?计算能力?逻辑分析能力?
NO
!我们使用得最多的是它所提供得各个功能模块(外设模块)。
所谓外设,是指将特定功能做成一个模块,然后给出控制端口,让处理器来控制。只要处理器给了足够的信息,外设就能完成特定的一组任务(个人理解
o.O
)。
举例来说(以下只是简单举例,实际还有更多的应用);
GPIO
:配置好需要的引脚之后,就可以从该引脚输入或输出信号;
Timer
(定时器):配置好之后,给定一个数值,它就不断的数数,到该值之后就会触发一个信号(当然还有别的功能)。
UART
(异步串行通信接口):配置好之后,给出需要传输的信息,它就会将信息传输到指定位置(如上位机)。
ADC
(模数转换器):可以读取外界模拟信号的数量值(如电压),转换为数字值(如
0100
)。
……
这里不再穷举了,课本里面都很详细。
确定了单片机控制外设这样一个概念之后,我们再来讲讲(简单讲讲吧,水平也不高),单片机到底是如何控制外设的。
如果看过数据手册的话,应该会发现,在每一个外设的章节,都会由寄存器映射(
Register Map
)和寄存器描述(
Register Descriptions
)。每一个外设都有……没错,
MPU
就是通过寄存器来控制的。我们所有的操作,都是在读取或者写入数值到相应的寄存器中。
在
51
单片机称霸的时代(吹牛皮不犯法吧),所写的代码就是直接对寄存器赋值,或者读取寄存器的值。因为那时普遍还是
8
位的单片机,寄存器只有
8
位,开发人员熟悉这么简单的寄存器很容易。但渐渐的,单片机的位数提高了,寄存器现在普遍达到了
32
位之多,去记住每一位代表什么意思,让人很头疼。因此就出现了官方库,开发人员只需要了解库函数有什么作用,就可以使用单片机了。
如果想要了解对寄存器的操作,使用我们手头的
EK-TM4C1294xx
,也可以做到。
以最近使用的
UART
为例:
在头文件包含
#include “inc/tm4c1294ncpdtf.h”
定义变量:
char
start[]={
"Hello "
};
使用如下语句代替
UARTCharPut(UART0_BASE,arr[i]);
while
(!(UART0_FR_R & (0x0001<<7)));
UART0_DR_R=arr[i];
//UARTCharPut(UART0_BASE,arr[i]);
这两个语句就是通过对
UART0
的数据寄存器写入数据的方式实现发送数据的。
其中
while
用来判断数据寄存器是否为空(为空就跳出,此时才能写入数据),
while
里面就是通过读
UART0_FR_R
的寄存器的第
7
位的状态。该位的状态就表示数据寄存器是否为空。
DataSheet
中对
UART
的状态寄存器的描述如下图:
其中位
7
(
bit 7
)叫做
TXFE
,就是指示当前数据寄存器是否为空。其描述如下图:
第二句就是将我们需要发送的字符赋值送入
UART0_DR_R
(数据寄存器,
Data Register
),然后
UART0
外设模块就自动将数据发送至上位机了(我们这里使用的个人电脑)。这也就是
UART
之所以可以称为一个模块的原因,它能自动传输数据。只是数据需要我们给它而已。
DataSheet
中对
UART
的数据寄存器的描述如下图:
可以看到只有
[7:0]
八位是可以给用户写入数据的,也就是说,一次只能发送一个字符,发送完之后才能重新装载。
那么
UART0_DR_R=arr[i];
这条语句是如何与寄存器挂钩的呢?也就是说数据是如何存储到指定的寄存器的?
在头文件
中,将
UART0_DR_R
通过宏定义的方式定义了它指向
UART0
的数据寄存器。就是说,
UART0_DR_R
就是一个指针,指针指向的地址的值如何改变,这对于学过
C
语言的你们来说,应该没问题了。
可以看看头文件
中对
UART0_DR_R
的宏定义:
可以看到
UART0_DR_R
指向了
0x4000C000
这个地址,从存储器映射那一节课我们已经了解的
UART0
外设就是被分配到了从这个地址开使的一段空间。
也就是说我们将数据送到了
UART0
的这个位置,然后它就自动帮我们发送了。
另外,对
UART
的配置什么的也都是通过
UART
配置寄存器进行操作的,只不过我们使用库函数开发,库函数对这些东西进行了高度的封装,我们不容易注意到而已。
关于寄存器的操作,只是为了让大家熟悉底层到底在干些什么,个人认为不必去记忆对应的寄存器对应的位是干什么的,因为我们可以使用库函数。下一篇文章,如果有必要的话,我准备简单介绍一下,库函数又是对应如何实现控制外设的。
其实可能有些多余,因为这里已经讲了通过寄存器操作了。到时候看情况吧。
好了,水平不高,仅供交流,多多指教。
祝福大家。
Ta的文章
更多
>>
identifier not found问题解决
0 个评论
单片机的要务——控制外设
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮