1069|2

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【瑞萨RA4E1评估板】输入捕获中断的使用-按键捕获 [复制链接]

前段时间忙成狗了,公司新的板子到了,调的飞起,现在调的差不多了开始补测评

下面是在上几篇的基础上

新建输入捕获中断

中断配置如下

io配置如下

代码实现

#include "hal_data.h"

#include <stdio.h>

#include <string.h>

#include <stdarg.h>

#include "common_data.h"

FSP_CPP_HEADER

void R_BSP_WarmStart(bsp_warm_start_event_t event);

FSP_CPP_FOOTER

int cmd_get_char(char *ch);

void LedBlink(uint16_t call_period);

void myprintf(const void *format, ...);

char cmd;

volatile bool switch1 = false;

#define DELAY_TIME (5)

/*******************************************************************************************************************/

/**

 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function

 * is called by main() when no RTOS is used.

 **********************************************************************************************************************/

void hal_entry(void)

{

    /* TODO: add your own code here */

    fsp_err_t err = FSP_SUCCESS;

#if BSP_TZ_SECURE_BUILD

    /* Enter non-secure code */

    R_BSP_NonSecureEnter();

#endif

    /* Open the transfer instance with initial configuration. */

    err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);

    err = R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg);

    err = R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl);

    //err = R_ICU_ExternalIrqClose(&g_external_irq0_ctrl);

    assert(FSP_SUCCESS == err);

    for (;;)

    {

        if (switch1)

        {

            myprintf("switch\r\n");

            switch1 = false;

            LedBlink(1000);

        }

        // LedBlink(DELAY_TIME);

        R_BSP_SoftwareDelay(DELAY_TIME, BSP_DELAY_UNITS_MILLISECONDS);

    }

}

/**

 * @brief 灯闪烁

 *

 * @param call_period 调用周期

 */

void LedBlink(uint16_t call_period)

{

#define LEN_OPEN_TIME (1000)

#define LEN_CLOSE_TIME (2000)

    static uint16_t sys_time = 0;

    sys_time += call_period;

    if (sys_time >= LEN_CLOSE_TIME)

    {

        sys_time = 0;

        R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_LEVEL_HIGH);

        R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_08, BSP_IO_LEVEL_LOW);

    }

    else if (sys_time >= LEN_OPEN_TIME)

    {

        R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_LEVEL_LOW);

        R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_08, BSP_IO_LEVEL_HIGH);

    }

}

/*******************************************************************************************************************/

/**

 * This function is called at various points during the startup process.  This implementation uses the event that is

 * called right before main() to set up the pins.

 *

 * @param[in]  event    Where at in the start up process the code is currently at

 **********************************************************************************************************************/

void R_BSP_WarmStart(bsp_warm_start_event_t event)

{

    if (BSP_WARM_START_RESET == event)

    {

#if BSP_FEATURE_FLASH_LP_VERSION != 0

        /* Enable reading from data flash. */

        R_FACI_LP->DFLCTL = 1U;

        /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and

         * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */

#endif

    }

    if (BSP_WARM_START_POST_C == event)

    {

        /* C runtime environment and system clocks are setup. */

        /* Configure pins. */

        R_IOPORT_Open(&g_ioport_ctrl, g_ioport.p_cfg);

    }

}

#if BSP_TZ_SECURE_BUILD

FSP_CPP_HEADER

BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable();

/* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */

BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable()

{

}

FSP_CPP_FOOTER

#endif

#define RING_LEN (255)

char rx_buff[RING_LEN] = {0};

volatile int twrite = 0;

int tread = 0;

/**

 * @brief 串口数据回调函数

 *

 * @param p_args

 */

void xcmd_callback(uart_callback_args_t *p_args)

{

    /* TODO: add your own code here */

    if (p_args->event == UART_EVENT_RX_CHAR)

    {

        rx_buff[twrite] = (char)(p_args->data);

        twrite++;

        if (twrite >= RING_LEN)

            twrite = 0;

    }

}

/**

 * @brief 从循环buf中获取一个字节

 *

 * @param ch 输出的字节

 * @return int 0:未读到数据,1:读到数据

 */

int cmd_get_char(char *ch)

{

    if (tread != twrite)

    {

        *ch = rx_buff[tread];

        tread++;

        if(tread >= RING_LEN)

            tread = 0;

        return 1;

    }

    return 0;

}

#define CMD_LEN_MAX (1024)

char buff[CMD_LEN_MAX];

/**

 * @brief 打印数据

 *

 * @param format 格式

 * @param ...

 */

void myprintf(const void *format, ...)

{

    int len = 0;

    va_list list;

    va_start(list, format);

    len = vsnprintf(buff, CMD_LEN_MAX, format, list);

    va_end(list);

    if (len > 0)

    {

        R_SCI_UART_Write(&g_uart0_ctrl, (const uint8_t* const) buff, (uint32_t)len);

    }

}

/**

 * @brief 按键回调函数

 *

 * @param p_args

 */

void switchCallBack(external_irq_callback_args_t *p_args)

{

    if(1 == p_args->channel) // 中断通道为1

    {

        switch1 = true;

    }

}

程序思路就是

接收中断->置个标志->主循环中不断访问这个标志,然后交替闪灯

最新回复

    err = R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg);     err = R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl);   void switchCallBack(external_irq_callback_args_t *p_args) {     if(1 == p_args->channel) // 中断通道为1     {         switch1 = true;     } } 核心的代码是这几行吧,RA的清中断标志,不知道是在哪里搞好的。     详情 回复 发表于 2023-8-8 07:46
点赞 关注

回复
举报

6815

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

接收中断->置个标志->主循环中不断访问这个标志,然后交替闪灯

测试的思路比较清晰,值得学学习

 
 

回复

6998

帖子

11

TA的资源

版主

板凳
 

    err = R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg);

    err = R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl);

 

void switchCallBack(external_irq_callback_args_t *p_args)

{

    if(1 == p_args->channel) // 中断通道为1

    {

        switch1 = true;

    }

}

核心的代码是这几行吧,RA的清中断标志,不知道是在哪里搞好的。

 

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表