本篇实现一个简单的功能:按键点灯
也就是按下按钮(SW1:P005)灯点亮(LED1:P207)
电路如下图:
或者说实现功能:P005为低电平时,P207为高电平。
有两种方式实现:
1:轮询,CPU不停地检测P005的输入电平状态,如果为低电平,则输出P207为高电平。
2:中断,CPU待机,中断服务器一直待命,若检测到中断,判断是谁触发的,检测到是P005(上升沿),则输出P207为高电平。
这两种方式,很显然中断的方式CPU负荷低,不用一直工作,而且功能多样,可以上升沿/下降沿触发,轮询就不行了。
下面我们分别测试两种方式的实现:
1:轮询
首先设置P005为输入P207为输出。
头部定义一个状态变量key,用于传递高低电平
bsp_io_level_t仅有低电平和高电平两种状态
bsp_io_level_t key;
在hal_entry中添加代码:
void hal_entry(void)
{
/* TODO: add your own code here */
while(1)
{
R_IOPORT_PinRead(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_05, &key);
if(key == 0)
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_HIGH);
else
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_LOW);
}
}
2:中断
中断的方式稍微复杂点:
在设置P005为输入时,还要设置IRQ为IRQ10-DS
P207设置输出方式同轮询中一样。
接下来我们在Stack选项卡中,新建输入中断,中断名称采用默认:
g_external_irq0
选择新建好的中断g_external_irq0
在底部属性选项卡设置如下:
最重要的是设置好Channel(通道为10,刚刚在Pin设置时选好的)
触发方式可选:上升沿(Rising)/下降沿(Falling)/Both(前述两种)/Low Level(低电平,有点像前述轮询方式)
还要设置好Callback函数,也就是中断函数,名字自己取:key_in
voidhal_entry(void)
{
/* TODO: add your own code here */
R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg);
R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl);
while(1);
}
voidkey_in(external_irq_callback_args_t *p_args)
{
/* 判断中断通道 */
if (10 == p_args->channel)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_HIGH); // 按键KEY按下,LED高电平点亮
}
}
R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg);
R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl);
上述两句是开启中断
if (10 == p_args->channel)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_HIGH); // 按键KEY按下,LED高电平点亮
}
上述函数是判断哪个通道产生中断,进而执行对应动作。
本次体验就到这里。
更多回帖