【FR801xH】富芮坤FR801xH之EXTI

00. 目录

01. FR801xH概述

在这里插入图片描述

FR801xH 系列芯片是面向SOC(片上系统),易于快速开发的低功耗蓝牙芯片。基于 Freqchip 的蓝牙智能固件和协议栈的支持,完全兼容蓝牙 V5.3(LE 模式)协议。同时用户可以基于芯片内置的 ARM CorteM3 嵌入式 32 位高性能单片机开发各种应用程序。

蓝牙智能固件包括 L2CAP 服务层协议、安全管理器 (SM)、属性协议(ATT)、通用属性配置文件 (GATT)和通用访问配置文件(GAP)。此外,还 支持应用程序配置文件,例如接近度、健康温度计、 心率、血压、血糖、人机界面设备(HID)和 SDK (包括驱动程序、OS-API 等)。SDK 还集成了用于网络应用程序的 SIG Mesh 协议。

采用 Freqchip 的创新技术,将 PMU(锂电池充电 器+LDO)、带 XIP 模式的 QSPI FLASH ROM、 I2C、UART、GPIO、ADC、PWM 集成在一块芯片中,为客户提供:

  • 竞争力的功耗
  • 稳定的蓝牙连接
  • 极低的 BOM 成本

02. FR801xH功能框图

在这里插入图片描述

03. EXTI相关类型

头文件components/driver/include/driver_exti.h

3.1 ext_int_type_t

enum ext_int_type_t
{
    EXT_INT_TYPE_LOW,
    EXT_INT_TYPE_HIGH,
    EXT_INT_TYPE_POS,
    EXT_INT_TYPE_NEG,
};

3.2 exti_mux_t

enum exti_mux_t
{
    EXTI_0_PA0  = 0,
    EXTI_0_PC0,
    EXTI_0_PC7,

    EXTI_1_PA1  = 0,
    EXTI_1_PC1,
    EXTI_1_PC6,

    EXTI_2_PA2  = 0,
    EXTI_2_PC2,
    EXTI_2_PC5,

    EXTI_3_PA3  = 0,
    EXTI_3_PC3,
    EXTI_3_PC4,

    EXTI_4_PA4  = 0,
    EXTI_4_PC4,
    EXTI_4_PC3,

    EXTI_5_PA5  = 0,
    EXTI_5_PC5,
    EXTI_5_PC2,

    EXTI_6_PA6  = 0,
    EXTI_6_PC6,
    EXTI_6_PC1,

    EXTI_7_PA7  = 0,
    EXTI_7_PC7,
    EXTI_7_PC0,

    EXTI_8_PB0  = 0,
    EXTI_8_PD0,
    EXTI_8_PD7,

    EXTI_9_PB1  = 0,
    EXTI_9_PD1,
    EXTI_9_PD6,

    EXTI_10_PB2  = 0,
    EXTI_10_PD2,
    EXTI_10_PD5,

    EXTI_11_PB3  = 0,
    EXTI_11_PD3,
    EXTI_11_PD4,

    EXTI_12_PB4  = 0,
    EXTI_12_PD4,
    EXTI_12_PD3,

    EXTI_13_PB5  = 0,
    EXTI_13_PD5,
    EXTI_13_PD2,

    EXTI_14_PB6  = 0,
    EXTI_14_PD6,
    EXTI_14_PD2,

    EXTI_15_PB7  = 0,
    EXTI_15_PD7,
    EXTI_15_PD1,
};

3.3 exti_channel_t

enum exti_channel_t
{
    EXTI_0,
    EXTI_1,
    EXTI_2,
    EXTI_3,
    EXTI_4,
    EXTI_5,
    EXTI_6,
    EXTI_7,
    EXTI_8,
    EXTI_9,
    EXTI_10,
    EXTI_11,
    EXTI_12,
    EXTI_13,
    EXTI_14,
    EXTI_15,
};

04. EXTI相关API

4.1 ext_int_set_port_mux

void ext_int_set_port_mux(enum exti_channel_t exti_channel,enum exti_mux_t exti_io);
功能:
	配置外部中断 (External Interrupt - EXTI) 信号源
参数:
	exti_channel 外部中断通道
    exti_io 连接到上面指定 exti_channel 的物理 GPIO 引脚/信号源    
返回值:
	None

4.2 ext_int_set_type

void ext_int_set_type(enum exti_channel_t exti_channel, enum ext_int_type_t type);
功能:
	配置指定外部中断通道(EXTI Channel)的触发类型
参数:
	exti_channel 外部中断通道
    type 中断触发类型   
返回值:
	None

4.3 ext_int_set_control

void ext_int_set_control(enum exti_channel_t exti_channel, uint32_t clk, uint8_t counter);
功能:
	配置外部中断相关参数
参数:
	exti_channel 外部中断通道
    clk 时钟预分频值
    counter 计数值 中断源持续次数大于counter才触发中断   
返回值:
	None

4.4 ext_int_enable

void ext_int_enable(enum exti_channel_t exti_channel);
功能:
	使能中断
参数:
	exti_channel 外部中断通道
返回值:
	None

05. 普通GPIO中断程序示例

示例

static enum ext_int_type_t exti_type;

__attribute__((section("ram_code"))) void exti_isr_ram(void)
{
    uint32_t exti_src;

    exti_src = ext_int_get_src();
    ext_int_clear(exti_src);
    co_printf("exti_key:%x\r\n", exti_src);
    if (exti_src & BIT(EXTI_12))
    {
        if (exti_type == EXT_INT_TYPE_LOW)
            exti_type = EXT_INT_TYPE_HIGH;
        else if (exti_type == EXT_INT_TYPE_HIGH)
            exti_type = EXT_INT_TYPE_LOW;
        ext_int_set_type(EXTI_12, exti_type);
    }
    else if (exti_src & BIT(EXTI_13))
    {
    }
}

void peripheral_demo(void)
{
    co_printf("digital exti isr\r\n");

    system_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PORTD4_FUNC_D4);
    gpio_set_dir(GPIO_PORT_D, GPIO_BIT_4, GPIO_DIR_IN);
    system_set_port_pull(GPIO_PD4, true);
    ext_int_set_port_mux(EXTI_12, EXTI_12_PD4);
    ext_int_set_type(EXTI_12, EXT_INT_TYPE_LOW);
    ext_int_set_control(EXTI_12, 1000, 4);
    ext_int_enable(EXTI_12);

    system_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PORTD5_FUNC_D5);
    gpio_set_dir(GPIO_PORT_D, GPIO_BIT_5, GPIO_DIR_IN);
    system_set_port_pull(GPIO_PD5, true);
    ext_int_set_port_mux(EXTI_13, EXTI_13_PD5);
    ext_int_set_type(EXTI_13, EXT_INT_TYPE_NEG);
    ext_int_set_control(EXTI_13, 1000, 4);
    ext_int_enable(EXTI_13);

    exti_type = EXT_INT_TYPE_LOW;
    NVIC_SetPriority(EXTI_IRQn, 4);
    NVIC_EnableIRQ(EXTI_IRQn);
}

运行结果

freqchipuser_entry_after_ble_init
digital exti isr
exti_key:1000
exti_key:1000
exti_key:1000
exti_key:1000
exti_key:2000
exti_key:2000
exti_key:2000
exti_key:2000
exti_key:2000
exti_key:2000
exti_key:2000
exti_key:2000


06. PMU GPIO中断程序示例

程序示例

#include "driver_exti.h"

static enum ext_int_type_t exti_type;

static os_timer_t button_anti_shake_timer;
static uint32_t curr_button_before_anti_shake = 0;

static void button_anti_shake_timeout_handler(void *param)
{
    uint32_t pmu_int_pin_setting = ool_read32(PMU_REG_PORTA_TRIG_MASK);
    uint32_t gpio_value = ool_read32(PMU_REG_GPIOA_V);
    gpio_value &= pmu_int_pin_setting;
    gpio_value ^= pmu_int_pin_setting;

    if (gpio_value == curr_button_before_anti_shake)
    {
        gpio_value &= ~GPIO_PC4; // ignore PC4, because of inner usage in lib
        if (gpio_value == 0)
        {
            co_printf("L\r\n");
        }
        else
        {
            co_printf("K:%08X\r\n", gpio_value);
        }
    }
}
__attribute__((section("ram_code"))) void pmu_gpio_isr_ram(void)
{
    uint32_t pmu_int_pin_setting = ool_read32(PMU_REG_PORTA_TRIG_MASK);
    uint32_t gpio_value = ool_read32(PMU_REG_GPIOA_V);

    ool_write32(PMU_REG_PORTA_LAST, gpio_value);
    uint32_t tmp = gpio_value & pmu_int_pin_setting;
    curr_button_before_anti_shake = tmp ^ pmu_int_pin_setting;
    os_timer_start(&button_anti_shake_timer, 10, false);
}

void demo_pmu_exti(void)
{
    co_printf("pmu exti isr\r\n");
    os_timer_init(&button_anti_shake_timer, button_anti_shake_timeout_handler, NULL);
    pmu_set_pin_pull(GPIO_PORT_D, BIT(6) | BIT(7), true); // PD6 low voltage ->isr
    // pmu_set_pin_pull(GPIO_PORT_D, BIT(7), false);     //PD7 high voltage ->isr
    pmu_port_wakeup_func_set(GPIO_PD6 | GPIO_PD7); // PD7 pin should connect to GND with 4.7K resistor
}

07. 附录

内容概要:论文提出了一种基于空间调制的能量高效分子通信方案(SM-MC),将传输符号分为空间符号和浓度符号。空间符号通过激活单个发射纳米机器人的索引来传输信息,浓度符号则采用传统的浓度移位键控(CSK)调制。相比现有的MIMO分子通信方案,SM-MC避免了链路间干扰,降低了检测复杂度并提高了性能。论文分析了SM-MC及其特例SSK-MC的符号错误率(SER),并通过仿真验证了其性能优于传统的MIMO-MC和SISO-MC方案。此外,论文还探讨了分子通信领域的挑战、优势及相关研究工作,强调了空间维度作为新的信息自由度的重要性,并提出了未来的研究方向和技术挑战。 适合人群:具备一定通信理论基础,特别是对纳米通信和分子通信感兴趣的科研人员、研究生和工程师。 使用场景及目标:①理解分子通信中空间调制的工作原理及其优势;②掌握SM-MC系统的具体实现细节,包括发射、接收、检测算法及性能分析;③对比不同分子通信方案(如MIMO-MC、SISO-MC、SSK-MC)的性能差异;④探索分子通信在纳米网络中的应用前景。 其他说明:论文不仅提供了详细的理论分析和仿真验证,还给出了具体的代码实现,帮助读者更好地理解和复现实验结果。此外,论文还讨论了分子通信领域的标准化进展,以及未来可能的研究方向,如混合调制方案、自适应调制技术和纳米机器协作协议等。
### 芮坤中断处理方案及相关技术 芮坤是一家专注于嵌入式微控制器设计与开发的企业,其产品广泛应用于物联网、消费电子等领域。对于中断处理这一核心功能,以下是基于现有技术和引用内容的分析。 #### 1. 中断机制概述 在嵌入式系统中,中断是一种高效的事件响应方式。它允许处理器暂停当前的任务执行,转而优先处理外部或内部触发的事件。芮坤芯片通常采用ARM Cortex-M系列架构,该架构内置了Nested Vectored Interrupt Controller (NVIC),用于管理多级中断请求并实现快速响应[^3]。 ```c // 启用特定中断源示例 void EnableInterrupt(void) { NVIC_EnableIRQ(EXTI_LINE); // EXTI_LINE为具体外设中断线号 } ``` 上述代码展示了如何通过NVIC启用指定的中断源。此方法适用于大多数基于Cortex-M内核的设计环境。 #### 2. 中断优先级配置 为了确保不同类型的中断能够按照预期顺序得到处理,必须合理设置各中断源的优先级。ARM Cortex-M提供了可编程的抢占优先级和子优先级位数分配策略[^4]。 ```c // 设置中断优先级函数定义 void SetPriority(uint8_t IRQn, uint32_t priority){ NVIC_SetPriority((IRQn_Type)IRQn, priority); } SetPriority(USART_IRQn, 5); // 假设串口中断编号为USART_IRQn,设定其中断级别为5 ``` 以上片段演示了如何利用`NVIC_SetPriority()` API调整某一特定硬件模块(如UART)对应的中断优先权值大小关系。 #### 3. CANopen协议栈中的中断应用实例 结合引用材料提到的支持CANopen标准的功能特性[^2],可以推测出,在实际项目里如果选用搭载了此类通信能力的产品,则必然涉及到针对收发缓冲区满溢或者错误帧检测等情况所引发的相关异常状况下的即时反馈动作实施过程描述如下: 当接收到一帧新的数据包时,会产生一次接收完成标志位更新操作从而激活关联向量表项指向的服务程序入口地址位置处继续往下运行逻辑流程直至最终达成既定目标为止即成功解析出了有效载荷部分的数据结构体成员变量赋初值完毕之后再返回至上层调用方等待下一轮循环迭代开始新一轮监听状态维持下去不断重复这个周期性的活动模式直到整个生命周期结束为止。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧海一笑-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值