您的当前位置:首页正文

瑞萨e2studio笔记——gpio输入输出

2024-11-22 来源:个人技术集锦

gpio输出:

一.第一步搭建工程

二.打开e2studio配置GPIO

任务:点亮两个led灯

根据外设板图得知,板子上的led灯需要高电平才可以点亮,故假设以P401和P404为例。

1.在e2studio中可以直接设置p401和p404为高电平输出模式。

可以用R_IOPORT_PinWrite()和R_IOPORT_PortWrite()两个函数进行配置高电平。

R_IOPORT_PinWrite()   特点:只能配置一个引脚

R_IOPORT_PinWrite()函数原型
fsp_err_t R_IOPORT_PinWrite(
                            ioport_ctrl *const p_ctrl,
                            bsp_io_port_pin_t pin,
                            bsp_io_level_t level                                
                            )
Sets a pin's output either high or low.Implements ioport_api_t::pinWrite.
Return values
FSP_SUCCESS  //写入成功
FSP_ERR_INVALID_ARGUMENT //pin和level无效
FSP_ERR_NOT_OPEN //模块尚未打开
ESP_ERR_ASSERTION //空指针
note:
这个函数对于不同的引脚是可重入的,可以在函数上直接修改引脚
例子:
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_01, BSP_IO_LEVEL_HIGH);
可以直接在函数上修改为
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH);

R_IOPORT_PortWrite()   特点:是对一个Port的所有Pin脚进行写操作

R_IOPORT_PorWrite()
fsp_err_t R_IOPORT_PortWrite(
                                ioport_ctrl_t *const p_ctrl,
                                bsp_io_port_t  port,
                                ioport_size_t  value,
                                ioport_size_t  mask
                            )
Writes to multiple pins on a port,Implements ioport_api_t::porWrite.
输入值将被写入指定的端口,value参数中的每个位对应端口上的一个位,以此类推,掩码参数中的每一个位对应端口上的一个引脚。
只有掩码设置中对应的位才会被更新,例如,value=0xFFFF,mask=0x0003只会产生0位和1位更新
return value
FSP_SUCCESS  //写入成功
FSP_ERR_INVALID_ARGUMENT //端口或者掩码无效
FSP_ERR_NOT_OPEN //模块尚未打开
ESP_ERR_ASSERTION //空指针

note:
这个函数对于不同的端口是可以重入的,这个函数使用PCNTR3寄存器修改端口上指定引脚的电平
例子:
 //0x0002为设定值,0x00ff为mark,即需要开启的管脚
R_IOPORT_PortWrite(&g_ioport_ctrl, BSP_IO_PORT_03, 0x0002, 0x00ff);

gpio输入:

一.第一步搭建工程

二.打开e2studio配置GPIO

任务:按下key键(假设P104),led(假设p301亮),否则led(假设pin301灭)

由板子图得知,板子上有led(p301),分析得出需要给一个高电平,才能是led亮

由于前面的按键key有一个上拉电阻,所以必须给key一个低电平输入。

主要逻辑:

led灯需要高电平才能亮,当我们按下key键之后,key为低电平输入,

if(p_port_value_port_104&0x0010), 两者相与0的时候,led点亮// 0010为灯的位

else ,两者相与为1的时候,按键为高电平,没有按下,led熄灭。

R_IOPORT_PortRead()函数原型

fsp_err_t R_IOPORT_PortRead	(	ioport_ctrl_t *const 	p_ctrl,
bsp_io_port_t 	port,
ioport_size_t * 	p_port_value 
)	

说明:
Reads the value on an IO port. Implements ioport_api_t::portRead.

The specified port will be read, and the levels for all the pins will be returned. Each bit in the returned value corresponds to a pin on the port. For example, bit 7 corresponds to pin 7, bit 6 to pin 6, and so on.

可以用R_IOPORT_PortRead()函数进行读取IO口电平状态,该函数是把一个PORT口的16个端口一起读取出来。

ioport_size_t p_port_value_port_104; 
R_IOPORT_PortRead(&g_ioport_ctrl, BSP_IO_PORT_01, &p_port_value_port_104);

R_IOPORT_PinRead()函数原型


fsp_err_t R_IOPORT_PinRead	(	ioport_ctrl_t *const 	p_ctrl,
bsp_io_port_pin_t 	pin,
bsp_io_level_t * 	p_pin_value 
)		

说明:
Reads the level on a pin. Implements ioport_api_t::pinRead.

故可以用R_IOPORT_PinRead()函数进行读取IO口电平状态,该函数只能读取一个端口的电平。

bsp_io_level_t p_port_value_port_104_1;
R_IOPORT_PinRead(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, &p_port_value_port_104_1);


 由上述可以得知,R_IOPORT_PortRead完全可以替代R_IOPORT_PinRead。

显示全文