关注+星标公众号,不错过精彩内容
来源 | 瑞萨嵌入式小百科
现在学习单片机有很多工具(比如:e2 studio),可以一键生成(底层驱动的)软件工程,包括像UART、I2C等各种单片机外设的底层驱动。
然后,网上很多人就发言:学单片机没必要学寄存器。
作为一个单片机十多年开发的过来人,想说一下:寄存器的单片机的灵活,不管是初学者,还是已经工作的工程师,寄存器是学单片机必不可少的一步。
不管是对你深入理解底层,还是将来项目找bug,掌握了寄存器的一些技能,能让你开发、找bug有事半功倍的效果。
这里分享一下前不久推送的一篇文章:学单片机,有必要寄存器吗?
这里结合瑞萨RA6M5系列单片机(野火启明6M5开发板)为大家分享一下IO口的几种模式,以及用寄存器点亮LED。
一般而言,点灯例程就像是刚学习C语言那时的“Hello World”程序那样,是简单入门一块单片机开发板的经典例程。C语言的“Hello World”程序使用printf函数来打印“Hello World!”字符串,而我们学习这块开发板的第一个例程的内容却不是打印“Hello World!”字符串,而是首先要学会控制芯片的引脚。
1
IO端口简介
芯片的引脚可以被粗略地分为IO引脚和非IO引脚。非IO引脚就是电源引脚、晶振引脚等的那些引脚,他们不具备GPIO(通用输入输出)功能。而IO引脚是那些具备GPIO功能的引脚,他们可以配置为各种模式、实现各种通用功能。
IO引脚最基本的输出功能是输出高、低电平,实现开关控制(比如开关LED灯、继电器或三极管等);最基本的输入功能是检测外部输入电平(比如通过引脚电平的高低区分按键是否被按下)。
IO引脚还可以用来连接外部设备,与外部设备进行通讯,发送控制指令,采集传感器数据等等。
IOPORT即I/O Port,在代码里面为了方便而写成“IOPORT”,表示输入输出端口。IOPORT是RA MCU的一个外设模块,它用来控制芯片的引脚,对每一个引脚进行详细的配置。具体地说,IOPORT 可以对引脚进行以下几个方面的配置:
配置引脚为普通IO功能,即输入或输出高电平或者低电平。
控制引脚的输入上拉电阻。
控制引脚的驱动能力。
控制引脚是否检测上升沿/下降沿/双边沿。
控制引脚是否作为中断输入引脚。
配置引脚为模拟输入功能或者将引脚在内部连接到其他外设模块。
瑞萨RA系列芯片的IO端口从理论上被分成16个组(0~9,A,B,C,D,E,F),每组有16个引脚(0~15)。然而,实际情况并非是完整的“16个组+每组16个引脚”的配置,而是因实际的芯片型号而异。以野火启明6M5板子上的R7FA6M5BH3CFC芯片为例,它是LQFP 176-pin封装,一共有176个引脚,其中的大部分引脚都是可以被IOPORT模块控制的IO引脚。而这些IO引脚被分成了0~9,A,B共11组引脚(注:A,B是10,11的十六进制表示),每组一般有16个引脚(引脚号为0~15),实际上有些组不到16个引脚。对于引脚数比较少的封装(LQFP 144-pin和LQFP 100-pin封装)来说,芯片的可用IO引脚数也会相对减少。
ojjerjpjpaw64055536453.jpg
送百套开发板给嵌入式工程师,等你来申领!
2
IO端口寄存器
RA6M5、RA4M2、RA2L1这三者的IOPORT模块框图结构是基本一致的。
以RA6M5为例,下图是RA6M5的外设IOPORT的功能结构框图,标有字母A处表示的是芯片实际引出 IO引脚。
zihdrluivdh64055536553.png
接下来我们对IOPORT外设的结构框图进行分析,将不难得出IOPORT有如下几种工作模式:
通用输入输出(GPIO)模式
输入模式(浮空/上拉)
输出模式(推挽/开漏)
模拟输入功能模式
复用功能模式
2.1
IO端口方向
见图中标注①处。
PDR(Port Direction Register)是端口方向寄存器,它控制端口的GPIO方向。当IO引脚需要控制输出高电平或者低电平时,可设置引脚的GPIO方向为GPIO输出;而当需要读取IO引脚的电平时,可设置引脚的GPIO方向为GPIO输入。
2.2
IO输入上拉控制
见图中标注②处。
PCR(Pull-up Control Register)是上拉控制寄存器,它控制IO引脚的GPIO输入是否使能上拉。当设置为允许上拉时,实际上会使得图中字母B处的弱上拉电阻连接到VCC电源正极,从而使得引脚处于弱上拉输入模式。需要注意的是,当引脚的GPIO方向被配置为“输入”时,才可以设置使用弱上拉电阻。从上图还可以看出,RA6M5的IO端口是没有下拉电阻的。
2.3
IO驱动能力和开漏输出控制
见图中标注③处。
DSCR(Port Drive Capability Register)是端口驱动能力寄存器,它控制IO引脚的驱动能力。驱动能
力指的是IO驱动的电流强度和IO的最大翻转速率。
NCODR(N-Channel Open-Drain Control Register)是开漏输出控制寄存器,它控制IO引脚是否使能开漏模式。当引脚的GPIO方向被配置为“输出”时,可以配置IO引脚输出的模式是推挽输出还是使能开漏输出。
2.4
IO端口输出数据
见图中标注④处。
这部分看似比较复杂,但是实际上EOSR、POSR、PORR、EORR的箭头最终都指向PODR,这意味着操作EOSR、POSR、PORR、EORR这些寄存器,实际上将最终操作的是PODR寄存器。
图中PODR(Port Output Data Regist)是端口输出数据寄存器,它控制GPIO引脚输出的电平。当引脚的GPIO方向被配置为“输出”时,可以配置引脚输出高电平或者低电平。
图中EOSR(Event Output Set Register)是事件输出置位寄存器(该寄存器我们暂且忽略它)。
图中POSR(Pmn Output Set Register)是端口输出数据寄存器,它控制GPIO引脚输出为高电平,但却不能控制输出低电平。
图中PORR(Pmn Output Reset Register)是端口输出数据寄存器,它控制GPIO引脚输出为低电平,但却不能控制输出高电平。
图中EORR(Event Output Reset Register)是事件输出复位寄存器(该寄存器我们暂且忽略它)。
2.5
IO端口输入数据
见图中标注⑤处。
PIDR(Port Input Data Register)是端口输入数据寄存器,可以通过它读取GPIO引脚的电平状态。
当引脚的GPIO方向被配置为“输入”时,程序可以读出输入引脚的电平是高电平还是低电平。
2.6
模拟输入模式
见图中标注⑥处。
ASEL(Analog Input Enable)是模拟输入选择控制位,可以通过它来将引脚配置为模拟输入模式。
当使用ADC功能时,需将引脚配置为模拟输入模式。
2.7
端口模式控制和外设复用选择
见图中标注⑦处。
PMR(Port Mode Control)是端口模式控制位,可以通过它来将引脚配置为GPIO输入/输出模式,
或者配置作为复用外设功能引脚。
PSEL(Peripheral Select)是外设复用选择,可以通过它来选择将引脚连接到某一个外设功能上。
2.8
IO边沿检测与中断
见图中标注⑧处。
EOFR(Event on Falling/Event on Rising)是事件触发选择,可以通过它来让引脚检测边沿信号,如果检测到指定信号将触发一个事件。
ISEL(IRQ Input Enable)是IRQ输入使能控制位,可以配置是否产生中断。
3
用寄存器点亮 LED 灯
上面已经讲述的IO端口的几种模式,这里结合e2 studio开发工具给大奖描述一下用寄存器点亮 LED 灯的方法。
首先,用e2 studio开发工具创建一个基础的工程,具体可以参看文章:瑞萨RA8系列教程 | 基于 e2 studio 创建RA8工程。
然后,我们在工程中添加寄存器控制IO(灯)的代码,这里直接附上代码:
po33mubft4464055536653.png
前面部分对IO端口进行配置,后面只需要一行寄存器代码即可控制IO(LED灯)翻转:
R_PORT4->PODR ^= 10xFF);看到这里,是不是觉得很简单?
送百套开发板给嵌入式工程师,等你来申领! |