Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread Studio
RT-Thread活动
瑞萨_RA6M4
基于RT-Thread+RA6M4的虚拟仪器开发:第五章直接使用寄存器操作点灯
发布于 2022-07-07 15:27:14 浏览:617
订阅该版
[TOC] # 第五章GPIO之直接使用寄存器操作点灯 ## 前言 对于一般程序开发,我们的第一个程序基本就是HelloWorld。而点灯程序就是嵌入式开发世界的HelloWorld。在自己编写的程序烧录到芯片中,然后看到LED一闪一闪的时候,会非常有成就感。我们这里不使用官方的Demo,而是完全从零开始,阅读芯片手册,根据芯片手册的信息,直接操作寄存器,从零开始实现我们自己的点灯程序。目的是授人以渔,从简单的例子开始熟悉怎么根据芯片手册去操作芯片外设。为后面更复杂的外设驱动实现打下基础,对于嵌入式学习,一定要知其然知其所以然,了解底层细节。要能从官网,芯片手册上获取信息去开发一个完全全新的架构的芯片。 代码见 https://gitee.com/qinyunti/ra6m4 ## GPIO模块介绍 我们参考芯片手册的<<19. I/O Ports>>章节。 IO一般可以作为普通IO或者外设引脚,那么就需要进行引脚的功能配置,配置输入输出等,还有些芯片IO端口可能需要单独使能,或者使能对应时钟。 我们从手册可以了解复位后IO默认为普通IO输入模式。 阅读芯片寄存器相关内容可以大致了解下各寄存器功能,一般要看下寄存器的读写属性,访问位宽,访问权限等。 PCNTR1:配置引脚的输入输出方向和输出值 PCNTR2:获取引脚状态和事件 PCNTR3:置高置低引脚。有了PCNTR1为什么还要有该寄存器呢,这是因为PCNTR1是直接对对应到16个引脚的,如果需要配置一个引脚那么就需要先读出整个寄存器值修改一个bit然后再写入,这样效率较低。而该寄存器可以直接写入对指定的bit(引脚)置高置低而不影响其他引脚,效率更高。 PCNTR4:ELC事件时,置高置低引脚。 PmnPFS:配置某个引脚为普通功能还是外设功能,如果是外设功能选择哪个外设。同时配置引脚的输出方向输出值,获取引脚状态,上拉,开漏,驱动能力,事件信号类型,终端,模拟等。 该寄存器可以配置一个引脚的所有属性。与此不同PCNTR4时一个寄存器配置16个引脚。 PWPR:PmnPFS寄存器的读写保护,该设计可以避免误操作修改引脚属性,更安全。这也是renesas相对其他芯片的一个小亮点,在航天领域避免单粒子打翻误操作等有一定意义,如果工况有类似的选型时可以考虑该特性。该寄存器设置实际双重保护,即要两步解锁。 PFENET:以太网RMII/MII模式配置,特定功能,不属于IO通用配置,不是所有芯片都有。 PWPRS:与PWPR一样,不过只能 secure访问。 PmSAR:设置端口的Security属性,该寄存器只能 secure访问。 ## GPIO操作步骤 了解寄存器之后,我们再看一般的操作步骤。通过手册可以看到如下步骤 1.清除 PWPR 的B0WI. 使能写PWPR的PFSWE。 2. 置位 PWPR的 PFSWE. 来容许写 PmnPFS。如果端口配置是 security属性则需要配置PWPRS。 3. 配置PmnPFS的PMR选择是普通IO还是外设,设置为0是普通IO否则是外设。 4. 配置PmnPFS的 PSEL[4:0]选择具体是哪一个外设. 5.清除 PWPR的PFSWE 禁止写 PmnPFS。 6. 置位 PWPR的B0WI. 禁止写 PWPR的PFSWE 。 原理图上可以看到P106驱动LED,高点亮。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220707/2e91d5552dcbdc07051ef58e24121f05.png.webp) 经过如上分析我们可以写出对应的引脚初始化代码 ## 操作代码 直接操作寄存器需要知道寄存器的地址,可以包含#include "base_addresses.h" 实际需要#include "bsp_api.h",因为base_addresses.h的路径没有直接设置为工程的包含路径 因为bsp_api.h包含了bsp_api.h再包含了base_addresses.h 修改hal_entry.c 添加#include "bsp_api.h" hal_entry改为 ``` void hal_entry(void) { rt_kprintf("\nHello RT-Thread!\n"); R_PMISC->PWPR_b.B0WI = 0; /* 解锁 PmnPFS */ R_PMISC->PWPR_b.PFSWE = 1; R_PFS->PORT[1].PIN[6].PmnPFS_b.PMR = 0; /* 普通IO */ R_PFS->PORT[1].PIN[6].PmnPFS_b.PDR = 1; /* 输出 */ R_PFS->PORT[1].PIN[6].PmnPFS_b.PCR = 1; /* 使能上拉*/ R_PFS->PORT[1].PIN[6].PmnPFS_b.NCODR = 0; /* CMOS模式 非开漏*/ R_PFS->PORT[1].PIN[6].PmnPFS_b.DSCR = 3; /* 高驱动能力 */ R_PFS->PORT[1].PIN[6].PmnPFS_b.EOFR = 0; /* 未使用事件模式所以写默认值 */ R_PFS->PORT[1].PIN[6].PmnPFS_b.ISEL = 0; /* 不使能外部中断 */ R_PFS->PORT[1].PIN[6].PmnPFS_b.ASEL = 0; /* 非AD */ R_PFS->PORT[1].PIN[6].PmnPFS_b.PODR = 0; /* 默认输出0 熄灯*/ R_PFS->PORT[1].PIN[6].PmnPFS_b.PSEL = 0; /* PMR=1时才有效 */ R_PMISC->PWPR_b.PFSWE = 0; /* 锁定 PmnPFS */ R_PMISC->PWPR_b.B0WI = 1; while (1) { //R_PORT1->PCNTR3_b.POSR = (uint16_t)1<<6; /* 亮*/ //R_PORT1->PCNTR1_b.PODR |= (uint16_t)1<<6; R_PMISC->PWPR_b.B0WI = 0; /* 解锁 PmnPFS */ R_PMISC->PWPR_b.PFSWE = 1; R_PFS->PORT[1].PIN[6].PmnPFS_b.PODR =1; R_PMISC->PWPR_b.PFSWE = 0; /* 锁定 PmnPFS */ R_PMISC->PWPR_b.B0WI = 1; rt_thread_mdelay(500); //R_PORT1->PCNTR3_b.PORR = (uint16_t)1<<6; /* 灭 */ //R_PORT1->PCNTR1_b.PODR &= ~(uint16_t)1<<6; R_PMISC->PWPR_b.B0WI = 0; /* 解锁 PmnPFS */ R_PMISC->PWPR_b.PFSWE = 1; R_PFS->PORT[1].PIN[6].PmnPFS_b.PODR = 0; R_PMISC->PWPR_b.PFSWE = 0; /* 锁定 PmnPFS */ R_PMISC->PWPR_b.B0WI = 1; rt_thread_mdelay(500); } } ``` 上面代码实现了三种IO设置值的方式,可以都试一下。注意操作PmnPFS需要解锁。 ## 测试 将上述三种方式操作的代码分别编译下,下载到板子执行,我们可以看到板载LED闪烁。可以使用仿真器查看对应的寄存器的值。 ## 总结 从以上过程,我们了解了如何从零开始,去操作寄存器来驱动相关的外设。从现在开始一定要有阅读手册的习惯,一切信息都从手册中获取。这个例子是简单的,后面更复杂的外设也是一样的,只是寄存器多一点,相关联的外设模块多一点而已,比如串口和SCI,ICU,低功耗模块等都有关,那么相关的寄存器哦都要配置。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
1
被采纳
0
关注TA
发私信
相关文章
1
(苏州站)RT-Thread物联网开发者沙龙【已结束】
2
(成都站)RT-Thread物联网开发者沙龙
3
(深圳站)RT-Thread物联网开发者沙龙
4
(西安站)RT-Thread物联网开发者沙龙
5
成都站2018 RT-Thread开发者沙龙回顾及PPT下载
6
2018 RT-Thread物联网开发者沙龙(北京站)
7
2018 RT-Thread物联网开发者沙龙(南京站)
8
第十三届研电赛RT-Thread企业专项奖发布通知
9
RT-Thread应用作品征集大赛开始啦!
10
你的投票将决定RT-Thread官网应该优先准备的文档是哪些
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部