查看: 641|回复: 1

【瑞萨RA4系列开发板体验】外部中断模块的使用 + 点LED

[复制链接]

116

主题

133

帖子

3768

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3768
发表于 2023-2-3 15:40:13 | 显示全部楼层 |阅读模式
【瑞萨RA4系列开发板体验】外部中断模块的使用 + 点LED
作者:jf_23522415


本篇介绍RA4M2按键中断控制LED。主要使用了RA4M2的ICU外部中断模块,当然实现类似功能也可以直接通过读取按键引脚电平来做一个按键检测的功能来实现不同的亮灯逻辑。
实现功能:点按RA4M2试用板子的SW1,控制三个led灯的亮灯逻辑。默认上电后,三个灯一秒亮一秒灭,点按SW1后,切换成,三个灯轮流亮,间隔300ms。
新建工程
1.新建工程
2.
3.填写好项目名称后点击下一步
4.选择对应的芯片类型,下一步
5.
6.点击完成
配置1.打开configuration.xml,右边窗口选中Stacks卡片,添加一个r_icu外部中断控制
2.点击新建项,在属性窗口会更新可配置的内容,依次配置
3.绑定引脚
4.
5.绑定好后,回到Pins选项卡
6.分别配置p404 405 415三个io口的Mode模式为:Output mode (initial low)
7.ctrl + s保存,到这一步基本配置好了,接下来写调用逻辑。点击右上角generate project content。
编写逻辑
1.打开项目资源管理器中src文件夹下hal_entery.c文件,准备添加内容。
2.添加中断回调的内容
  1. bsp_io_level_t button1_status = BSP_IO_LEVEL_LOW; //全局

  2. void button1_callback(external_irq_callback_args_t *p_args)
  3. {
  4.     button1_status = ~button1_status;
  5. }
复制代码
3.添加亮灯的宏定义
  1. #define LED_3 \
  2.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW);     \
  3.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_HIGH);    \
  4.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_LOW);

  5. #define LED_2   \
  6.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH);    \
  7.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_LOW);     \
  8.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_LOW);

  9. #define LED_1  \
  10.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW);     \
  11.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_LOW);     \
  12.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_HIGH);

  13. #define LED_HIGH \
  14.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH);    \
  15.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_HIGH);    \
  16.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_HIGH);

  17. #define LED_LOW    \
  18.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW);    \
  19.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_LOW);    \
  20.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_LOW);
复制代码
4.添加IRQ初始化函数
  1. void IRQ_INIT(void)
  2. {
  3.     R_ICU_ExternalIrqOpen(button1.p_ctrl, button1.p_cfg);   //配置一个IRQ输入引脚与外部中断接口一起使用
  4.     R_ICU_ExternalIrqEnable(button1.p_ctrl);                //在NVIC为指定通道启用外部中断
  5. }
复制代码
5.主代码
  1. void hal_entry(void)
  2. {

  3.     /* TODO: add your own code here */
  4.     IRQ_INIT(); //按键中断初始化

  5.     while (1)
  6.     {
  7.         if (button1_status)
  8.         {
  9.             LED_1;
  10.             R_BSP_SoftwareDelay(300, BSP_DELAY_UNITS_MILLISECONDS);
  11.             LED_2;
  12.             R_BSP_SoftwareDelay(300, BSP_DELAY_UNITS_MILLISECONDS);
  13.             LED_3;
  14.             R_BSP_SoftwareDelay(300, BSP_DELAY_UNITS_MILLISECONDS);
  15.             LED_2;
  16.             R_BSP_SoftwareDelay(300, BSP_DELAY_UNITS_MILLISECONDS);
  17.         }
  18.         else
  19.         {
  20.             LED_HIGH;
  21.             R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
  22.             LED_LOW;
  23.             R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
  24.         }
  25.     }

  26. #if BSP_TZ_SECURE_BUILD
  27.     /* Enter non-secure code */
  28.     R_BSP_NonSecureEnter();
  29. #endif
  30. }
复制代码
完整代码
  1. #include "hal_data.h"

  2. FSP_CPP_HEADER
  3. void R_BSP_WarmStart(bsp_warm_start_event_t event);
  4. FSP_CPP_FOOTER


  5. bsp_io_level_t button1_status = BSP_IO_LEVEL_LOW;

  6. #define LED_3                                                                           \
  7.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW);     \
  8.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_HIGH);    \
  9.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_LOW);


  10. #define LED_2                                                                           \
  11.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH);    \
  12.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_LOW);     \
  13.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_LOW);

  14. #define LED_1                                                                           \
  15.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW);     \
  16.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_LOW);     \
  17.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_HIGH);

  18. #define LED_HIGH                                                                         \
  19.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH);    \
  20.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_HIGH);    \
  21.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_HIGH);

  22. #define LED_LOW                                                                         \
  23.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW);    \
  24.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_LOW);    \
  25.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_LOW);


  26. void button1_callback(external_irq_callback_args_t *p_args)
  27. {
  28.     (void) p_args;
  29.     button1_status = ~button1_status;
  30. }


  31. void IRQ_INIT(void)
  32. {
  33.     R_ICU_ExternalIrqOpen(button1.p_ctrl, button1.p_cfg);   //配置一个IRQ输入引脚与外部中断接口一起使用
  34.     R_ICU_ExternalIrqEnable(button1.p_ctrl);                //在NVIC为指定通道启用外部中断
  35. }


  36. void hal_entry(void)
  37. {

  38.     /* TODO: add your own code here */
  39.     IRQ_INIT(); //按键中断初始化

  40.     while (1)
  41.     {
  42.         if (button1_status)
  43.         {
  44.             LED_1;
  45.             R_BSP_SoftwareDelay(300, BSP_DELAY_UNITS_MILLISECONDS);
  46.             LED_2;
  47.             R_BSP_SoftwareDelay(300, BSP_DELAY_UNITS_MILLISECONDS);
  48.             LED_3;
  49.             R_BSP_SoftwareDelay(300, BSP_DELAY_UNITS_MILLISECONDS);
  50.             LED_2;
  51.             R_BSP_SoftwareDelay(300, BSP_DELAY_UNITS_MILLISECONDS);
  52.         }        
  53.         else
  54.         {
  55.             LED_HIGH;
  56.             R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
  57.             LED_LOW;
  58.             R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
  59.         }
  60.     }

  61. #if BSP_TZ_SECURE_BUILD
  62.     /* Enter non-secure code */
  63.     R_BSP_NonSecureEnter();
  64. #endif
  65. }
复制代码


回复

使用道具 举报

3

主题

195

帖子

1196

积分

金牌会员

Rank: 6Rank: 6

积分
1196
发表于 2023-3-14 11:04:06 | 显示全部楼层

不错,学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户排行榜

RA助手

主题: 116帖子:133精华:0

RA_Lance

主题: 92帖子:132精华:9

lugl

主题: 38帖子:126精华:0

xujiwei263

主题: 16帖子:73精华:0

books咦

主题: 11帖子:11精华:2

Juggernaut

主题: 9帖子:95精华:0
快速回复 返回顶部 返回列表