当前课程知识点:ARM微控制器与嵌入式系统 > 第五章 ARM微控制器的各种外设 > 5.2.5 ARM微控制器外设:UART的寄存器编程(上) > 5.2.5 ARM微控制器外设:UART的寄存器编程(上)
各位同学大家好
我是清华大学工程物理系的曾鸣老师
欢迎大家回到我们
ARM微控制器与嵌入式系统的MOOC课堂
我们继续进行
这个章节关于外设里头UART异步通讯的学习
那么在前面几个单元呢
我们也认识了UART那样一个数据帧
也认识了包括RS232在内的
这样具体的电平标准这样的硬件实现
那么这个单元和下个单元
我来教大家如何编程真正把它用起来
去跟计算机通讯
去跟GPS、GSM模块这些外设模块通讯
如何把这样一个通讯真正实现出来
那么大家回忆一下第四章
我们所学的那一类编程开发的基本概念里头
我们讲的最最简单的一类外设
它也非常典型 就是IO
我们回忆当时选IO编程的时候
有两个基本概念
一个就是对于所有外设的编程
都是通过映射在地址上的
一系列寄存器的写0写1
我们写的是数据
但是实际工作是这些0和1对电路的控制
来实现对于外设工作方式 工作状态的控制
那么实现让它工作
第二个概念就是说
我们对于这样一个编程大家回忆一下
把一个IO用起来点灯
当时曾老师开了个玩笑
说要几个步骤呢
说要三个步骤
就跟大象塞到冰箱里一样
第一个步骤把这个模块所用到的时钟给打开
因为在默认状态下
这些时钟是关闭的
这样一个模块是处于低功耗的
第二个步骤呢
就是我们包括IO在内
所有的这些功能
它是复用在若干个物理的金属的引脚上的
我们要把这样的对应的引脚这个模块 这PORT
给指定为对应的功能来用
比如默认的功能1
可能是给IO用
但如果我们要把它给UART给串行通讯用
它就不能当IO用
这是要配置的
那么最后一个步骤呢
是对于每一个模块比如IO它就有
输入 输出 方向 这样一些寄存器进行控制
那么对于UART也是一样的
我们要有一系列寄存器来约定
我们刚才讲的那个数据帧
它的波特率它的奇偶校验等等
这些功能的使用
最后让它真正的通讯起来
那么在这个单元里我们先讲前两个步骤
最后一个步骤在下一个单元我来给大家讲
一个UART模块里有哪些寄存器
怎么用它
那么我们来看第一个步骤
第一个步骤把UART通讯要用到的时钟给打开
我们即使在原来讲一个IO的时候
也要用到时钟
时钟对于一个微控制器系统
就像一个动物的心脏
一下下的跳动指挥着所有的模块
在这个节奏下去工作
那么在一个微控制器里头
会有一个时钟树的概念
也就我们一开始讲过的这张图
那么这个时钟分配到了每一个模块
在同相位下以不同的频率
各自的速度来工作协调
那么我们在这门课的范畴里
如果不使用锁相环去进行倍频
不使用外部的晶振
那么上电默认状态
是使用片内的32KHz的IRC振荡器
产生的这样一个时钟
经过FLL锁频环
产生一个更高频率的时钟
一直沿着箭头的链路输出
产生片内的锁频环时钟
也就是MCGFLLCLK
它的频率在上电默认的值下面
大家记住对于MKL25Z128这块
我们学习的微控制器
这块ARM微控制器
默认值上电以后是20.97MHz
那么还有一个很重要的值就是所谓的Bus Clock
总线时钟
一般上电后是它的一半 二分频
也就是20.97MHz除以2
也就是10.485MHz
那么我们进行UART时钟的配置的时候
记住不仅仅是把时钟打开
我们要有一个概念
就是我们的UART模块用的是这个时钟
作为它的时钟来源
它直接影响到我们待会编程怎么来配置波特率
那么多说一句的是
在我们KL25这样一个微控制器里头
一共有三个UART模块
分别是UART0、UART1、UART2
大家可以理解是
我们有三个串行通讯接口可以用
每一个都可以通过编程
独立的与不同的设备进行通讯
那么其中UART1、UART2
后面这两个
它锁定了就是使用Bus clock
比如上电默认后就是10.485MHz作为它的时钟源
UART0我待会会讲到
它的时钟源是可选的
但是作为初学者
我们一般就把它配置成也使用Bus Clock
也就是10.485MHz
这样编程理解上会比较简单
那么怎么把这个时钟给打开呢
回忆我们做IO的时候我们会发现
如果我们看我们芯片手册的第192页
也就是第12章有一个模块单元
叫System integration module
也就是系统集成模块
里头有一系列的寄存器
那么在IO的时候
我们实际上是找了其中一个寄存器的一个比特
打开对应的比如说PORTA或者PORTB
它的那个时钟置0或者置1就打开
那么在我们这个单元里要把一个UART用起来
我们会用到两个寄存器
这两个寄存器
一个负责打开我们要用的那个UART模块的时钟源
一个负责打开这个UART模块
用的那两个引脚
所对应的那个PORT的时钟源
也就说你要把通讯打开
把通讯复用的这个引脚
对应的PORT的时钟也打开
保证这个引脚能够正确的用起来
那么在哪呢
一个寄存器就是我们刚才表中所写的
SIM_SCGC4这个寄存器
那么我们有一个概念寄存器
都是映射在物理地址上
一段可以写0写1的一个存储空间
但是它的0和1
又会变成高低电平去控制电路
所以这个寄存器名称是SIM_SCGC4
在我们开发里知道它是一个名称
而它实际的物质地址
在芯片手册可以看到
就是32位地址总线上的4004 8034这个地址
那么寄存器的定义也在芯片手册可以找着
我们可以发现有这么一个比特
他管着UART1的时钟置1就是打开
置0就是关闭
它的旁边分别是UART0和UART2的时钟开关
所以我们要把UART1的时钟打开很简单
就是SIM_SCGC4或一个0x0800
这个8是个比特1对不对
写成二进制就是00001000
一或,这一位
就置1了
我们就把对应的时钟开关打开了
我们完成了打开UART这个模块的时钟
那么我们还要记得
把现在复用的UART这个引脚
所对应的那个物理引脚PORT的时钟打开
那么这个时候我们就需要读一下电路图
在日后的学习当中
如果我们要真正的把我们编的程序
在实际电路上跑起来 玩起来
我们会反复阅读电路图
比如在我们这张图里我们会看到
我们使用了一个叫CP2102的
USB虚拟串口的芯片
完成与计算机USB口的连接
而它给出了一对UART的数据通信引脚
与我们的ARM微控制器的UART口连接
来帮助我们完成通讯
那么这对引脚呢
接到了我们ARM微控制器 大家看电路图里头
第216、217这两个引脚
那这两个引脚分别功能是
UART1的收RX和UART1的发送TX
我们之所以这么接
是因为我们知道这两个引脚
也就是PORTC的第三号引脚
和PORTC的第四号引脚
在芯片设计的功能里有一个复用的功能
是当UART数据通讯用
而不是当IO用
所以如果我们去看一看
芯片手册的时候就会发现
这两个引脚在芯片手册的复用功能表里头
是它的ALT3
也就是第三号功能
那么这个功能的配置是待会第二个步骤
我们会讲到的
现在想
我们要想把这两个引脚UART功能用起来
光把UART模块的时钟打开是不够的
我们要把它对应的PORTC这个模块的时钟也打开
就跟我们做IO的编程一样
那么PORTC的时钟打开
跟我们做IO编程里头一样
在SIM_SCGC5这个寄存器里头
也就是它的物理地址
是4004 8038这个物理地址的寄存器里头
有这么若干个比特
每个比特管一个PORT的时钟开关
从PORTA B C D这么一直下去
所以我们只需要把PORTC对应的这个比特置1
就把刚才所说的这个复用模块
所对应引脚的时钟打开了
那么方法就是编程这么简单的一句话
SIM_SCGC5这个寄存器或等于0x 同样是0800
这样就把这一个比特值通过或运算置1
于是这样子
我们就完成了打开UART模块的时钟
也打开了对应引脚的这个PORT口的时钟
写出来就是这两句话
所以说起来很复杂
实践起来C语言就两句话
大家学习编程的时候
一定要知其然知其所以然
既能把曾老师这两句话给自己写出来
也能根据自己日后开发的需要
自己去写出这句话
那么大家就学会了如何去使用这样一个模块
好 那我们看看除了UART1和UART2
如果我们要把UART0用起来
我们还要多做一件什么事呢
在这里我简单做个介绍
就是最开始提到在时钟树里
UART0的时钟源
不一定是Bus clock那个10.485MHz
大家是可以选的
那么这个寄存器叫做SIM_SOPT2
有兴趣同学可以通过芯片手册去读一读它
那么所要使用的是我标红框的这两个位置
各两个比特的配置
那么比如说我们给他们分别赋值都选择01
就会选择同样的20.97MHz的一半
作为我们UART0的时钟源
也就是10.485MHz
使我们的编程能够跟UART1是一样的
那么这是一个额外的内容
如果要用UART0大家可以学习一下
好 到这里我们完成了三个步骤里头的
第一个步骤
这个单元我们接下来再讲一讲第二个步骤
我们打开了时钟源
万事俱备之前我们还差一个步骤
就是要把这个引脚
这个PORT里的这个物理的引脚
指定给UART用
而不是给别的功能比如IO用
比如说AD用对吧
那么这样一个配置功能非常简单
跟我们在第四章学IO编程的时候一样
有一系列的寄存器在我们芯片手册第177页
也就是PORT引脚管理的这个模块里头
给了一系列这样的寄存器
而用的最多的呢
就是我们现在打框的这个寄存器
我们之前用过了
叫PORTx_PCRn
这样一个寄存器是每个引脚对应一个
有多少个引脚
就会对应多少个一模一样的寄存器
比如PORTC PTC3和PTC4对应的
就是PORTC_PCR3和PORTC_PCR4
这样两个一模一样的独立寄存器
那么在这样两个寄存器
就像我们刚才看电路图一样
我们会发现PORTC3和PORTC4
它对应的从000到111
也就是0到7这八个可用的功能里头
第3号功能
是我们现在想希望它使用的UART1的
收和发送数据这两个功能
那么对应到PORTC_PCR3或者PORTC_PCR4
这个寄存器里头
就是我们之前学过有这么三个比特的值
可以进行设置
它的值可以从000设置到111
对应我们希望这个引脚使用第几号功能
因为我们要使用第三号功能
那这三个比特就得置成011
所以这个寄存器我们虽然用过
可能大家忘了
我们现在回忆起来
对两个引脚的功能
进行指定写出来就是两句话
PORTC_PCR3如果用强行赋值等于0x0300
PORTC_PCR4等于0x0300
所以做完这两句话
我们就把我们想用的这两个引脚
指定为了给UART用
接下来怎么用
就是怎么给UART寄存器编程的问题了
也就是我们下一个单元
要给大家讲的第三个步骤
那么这个单元到这儿就结束了
-1.1 课程概览
--1.1 课程概览
-1.2 如何学好嵌入式系统
-2.1 计算机的基本概念、发展历史
-2.2 从晶体管到CPU
-2.3 概念CPU、微控制器MCU和嵌入式系统
-2.4 八卦计算机史
-2.5 不同领域、不同系列的嵌入式系统
-2.6 ARM历史与MKL25Z128 MCU
--2.6 ARM历史与MKL25Z128 MCU【习题】
-3.1 CPU的基本结构和运行机制
-3.2.1 堆栈的概念
--3.2.1 堆栈的概念【习题】
-3.2.2 堆栈的概念-头脑体操
-3.3.1 ARM的体系结构
--3.3.1 ARM的体系结构【习题】
-3.3.2 ARM的体系结构-头脑体操
-3.4.1 中断的概念和机制
-3.4.2 中断子程的概念和编程
-3.5 复位、时钟、存储器和总线
--3.5 复位、时钟、存储器和总线【习题】
-3.6 小结:MCU的总体结构和程序运行机制
--3.6 小结:MCU的总体结构和程序运行机制【习题】
-4.1 第一种外设:IO
-4.2 IO外设的编程实操-点亮LED
-4.3 IO外设的进阶知识
-4.4 嵌入式开发的基本概念与工具链
-4.5 嵌入式开发的进阶知识
-4.6 嵌入式开发中的C语言(上)
--4.6 嵌入式开发中的C语言(上)【习题】
-4.7 嵌入式开发中的C语言(下)
--4.7 嵌入式开发中的C语言(下)【习题】
-E0.1 实验零 开发板的初步认识与工具链的安装
-E0.2 实验零 体验一个例程的编译与下载
-E0.3 实验零 编写第一个程序:点亮核心板LED
-E1 实验一 点灯秘籍
-5.1 ARM微控制器外设学习概述
-5.2.1 ARM微控制器外设:通讯
-5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)【习题】
-5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器的外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)【习题】
-5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
--5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
-5.2.5 ARM微控制器外设:UART的寄存器编程(上)
--5.2.5 ARM微控制器外设:UART的寄存器编程(上)
-5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)【习题】
-E2 实验二 UART编程实操
-5.3.1 ARM微控制器外设:IO的中断编程(上)
-5.3.2 ARM微控制器外设:IO的中断编程(下)
-5.4.1 ARM微控制器外设:定时器的原理
-5.4.2 ARM微控制器外设:定时器的编程
--5.4.2 ARM微控制器外设:定时器的编程【习题】
-E3 实验三 定时器中断编程实操
-5.5.1 ARM微控制器外设:PWM的原理
-5.5.2 ARM微控制器外设:PWM寄存器与编程
-5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
--5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
-E4 实验四 数码管显示编程实操
-5.6.1 ARM微控制器外设:SPI通讯简介
--5.6.1 ARM微控制器外设:SPI通讯简介【习题】
-5.6.2 ARM微控制器外设:SPI寄存器与编程
-5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
--5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
-5.7.1 ARM微控制器外设:I2C通讯简介
-5.7.2 ARM微控制器外设:I2C的通讯协议
-5.7.3 ARM微控制器外设:I2C寄存器与编程
--5.7.3 ARM微控制器外设:I2C寄存器与编程【习题】
-5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
--5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
-5.8.1 ARM微控制器外设:ADC简介
-5.8.2 ARM微控制器外设:ADC基础
-5.8.3 ARM微控制器外设:ADC寄存器与编程
-E5 实验五 ADC编程实操
-E6 挑战实验
--E6 挑战实验
-6.1 嵌入式系统的接口与设计
-6.2 嵌入式系统的实例


