前言
本文进行普通IO检测按键控制LED和中断检测按键控制LED。
引脚
原理图可以看到用户按键对应P105
查询方式
配置IO
测试代码
void hal_entry(void)
{
/* TODO: add your own code here */
R_BSP_PinAccessEnable();
R_BSP_PinCfg(USERLED,IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_BSP_PinCfg(USERKEY,((uint32_t) IOPORT_CFG_IRQ_ENABLE
| (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE) );
while(1)
{
//R_BSP_PinWrite(USERLED,BSP_IO_LEVEL_HIGH);
//R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);
//R_BSP_PinWrite(USERLED,BSP_IO_LEVEL_LOW);
//R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);
if(R_BSP_PinRead(USERKEY) != 0)
{
R_BSP_PinWrite(USERLED,BSP_IO_LEVEL_LOW);
}
else
{
R_BSP_PinWrite(USERLED,BSP_IO_LEVEL_HIGH);
}
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
按住按键点亮LED,松开熄灭,下载测试OK。
中断方式配置
设置如下属性,回调函数为userkey_isr
可以看到irq对应
设置引脚
生成
初始化代码
R_BSP_PinAccessEnable();
R_BSP_PinCfg(USERLED,IOPORT_CFG_PORT_DIRECTION_OUTPUT);
//R_BSP_PinCfg(USERKEY,((uint32_t) IOPORT_CFG_IRQ_ENABLE
// | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE) );
fsp_err_t err = FSP_SUCCESS;
/* Open ICU module */
err = R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg);
err = R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl);
实现回调函数
void userkey_isr(external_irq_callback_args_t *p_args)
{
static int tog = 0;
R_BSP_PinWrite(USERLED,tog ^= 1);
}
测试可以看到按一下按键LED亮,再按一下LED灭。
总结使用FSP可以快速生成代码框架,但是对工具需要一个熟悉的过程,
代码有几个层次
R_BSP_即对应的库函数,直接操作的硬件,可以直接调用该层接口,
生成的i_ruc (Stacks)则是对应的硬件的实例,可以认为是HAL层,调用该层接口则更抽象更简单。