TI 280049 GPIO 相关笔记

1. gpio.h 文件整理

cpp 复制代码
//*****************************************************************************
//
// 驱动内部使用宏定义,应用层代码不建议直接调用
//
//*****************************************************************************
#define GPIO_CTRL_REGS_STEP     ((GPIO_O_GPBCTRL - GPIO_O_GPACTRL) / 2U)    // GPIO控制寄存器组,A与B组寄存器地址步长
#define GPIO_DATA_REGS_STEP     ((GPIO_O_GPBDAT - GPIO_O_GPADAT) / 2U)    // GPIO数据寄存器组,A与B组寄存器地址步长

// GPIOA各寄存器在寄存器数组中的索引偏移,用于指针寻址计算
#define GPIO_GPxCTRL_INDEX      (GPIO_O_GPACTRL / 2U)      // GPxCTRL寄存器索引
#define GPIO_GPxQSEL_INDEX      (GPIO_O_GPAQSEL1 / 2U)     // GPxQSEL1寄存器索引,输入限定模式
#define GPIO_GPxMUX_INDEX       (GPIO_O_GPAMUX1 / 2U)      // GPxMUX1寄存器索引,功能复用选择
#define GPIO_GPxDIR_INDEX       (GPIO_O_GPADIR / 2U)       // GPxDIR寄存器索引,方向寄存器
#define GPIO_GPxAMSEL_INDEX     (GPIO_O_GPAAMSEL / 2U)     // GPxAMSEL寄存器索引,模拟模式选择
#define GPIO_GPxPUD_INDEX       (GPIO_O_GPAPUD / 2U)       // GPxPUD寄存器索引,上拉使能
#define GPIO_GPxINV_INDEX       (GPIO_O_GPAINV / 2U)       // GPxINV寄存器索引,输入极性反转
#define GPIO_GPxODR_INDEX       (GPIO_O_GPAODR / 2U)       // GPxODR寄存器索引,开漏输出
#define GPIO_GPxGMUX_INDEX      (GPIO_O_GPAGMUX1 / 2U)     // GPxGMUX1寄存器索引,高功能复用
#define GPIO_GPxCSEL_INDEX      (GPIO_O_GPACSEL1 / 2U)     // GPxCSEL1寄存器索引,主核选择
#define GPIO_GPxLOCK_INDEX      (GPIO_O_GPALOCK / 2U)      // GPxLOCK寄存器索引,配置锁存
#define GPIO_GPxCR_INDEX        (GPIO_O_GPACR / 2U)        // GPxCR寄存器索引,配置永久提交
#define GPIO_GPxDAT_INDEX       (GPIO_O_GPADAT / 2U)       // GPxDAT寄存器索引,数据寄存器
#define GPIO_GPxSET_INDEX       (GPIO_O_GPASET / 2U)       // GPxSET寄存器索引,置位寄存器
#define GPIO_GPxCLEAR_INDEX     (GPIO_O_GPACLEAR / 2U)     // GPxCLEAR寄存器索引,清零寄存器
#define GPIO_GPxTOGGLE_INDEX    (GPIO_O_GPATOGGLE / 2U)    // GPxTOGGLE寄存器索引,翻转寄存器

#define GPIO_MUX_TO_GMUX        (GPIO_O_GPAGMUX1 - GPIO_O_GPAMUX1)  // MUX与GMUX寄存器地址偏移

#ifndef DOXYGEN_PDF_IGNORE
//*****************************************************************************
//
//! GPIO引脚PAD属性配置参数,作为GPIO_setPadConfig入参 / GPIO_getPadConfig返回值
//
//*****************************************************************************
#define GPIO_PIN_TYPE_STD       0x0000U //!< 推挽输出 / 浮空输入
#define GPIO_PIN_TYPE_PULLUP    0x0001U //!< 输入上拉使能
#define GPIO_PIN_TYPE_INVERT    0x0002U //!< 输入信号极性反转
#define GPIO_PIN_TYPE_OD        0x0004U //!< 输出开漏模式
#endif

//*****************************************************************************
//
//! GPIO引脚方向枚举,GPIO_setDirectionMode入参 / GPIO_getDirectionMode返回值
//
//*****************************************************************************
typedef enum
{
    GPIO_DIR_MODE_IN,                    //!< GPIO配置为输入
    GPIO_DIR_MODE_OUT                    //!< GPIO配置为输出
} GPIO_Direction;

//*****************************************************************************
//
//! GPIO外部中断触发类型枚举,GPIO_setInterruptType入参 / GPIO_getInterruptType返回值
//
//*****************************************************************************
typedef enum
{
    GPIO_INT_TYPE_FALLING_EDGE = 0x00,   //!< 下降沿触发外部中断
    GPIO_INT_TYPE_RISING_EDGE  = 0x04,   //!< 上升沿触发外部中断
    GPIO_INT_TYPE_BOTH_EDGES   = 0x0C    //!< 双边沿均可触发外部中断
} GPIO_IntType;

//*****************************************************************************
//
//! GPIO输入限定滤波模式枚举,GPIO_setQualificationMode入参 / GPIO_getQualificationMode返回值
//
//*****************************************************************************
typedef enum
{
    GPIO_QUAL_SYNC,                      //!< 同步SYSCLKOUT系统时钟采样
    GPIO_QUAL_3SAMPLE,                   //!< 3次采样滤波消抖
    GPIO_QUAL_6SAMPLE,                   //!< 6次采样滤波消抖
    GPIO_QUAL_ASYNC                      //!< 异步,不做同步/滤波
} GPIO_QualificationMode;

//*****************************************************************************
//
//! GPIO模拟模式开关枚举,GPIO_setAnalogMode入参
//
//*****************************************************************************
typedef enum
{
    GPIO_ANALOG_DISABLED,     //!< 引脚数字模式(普通GPIO)
    GPIO_ANALOG_ENABLED       //!< 引脚模拟模式(ADC输入)
} GPIO_AnalogMode;

//*****************************************************************************
//
//! GPIO主控制权核选择枚举,GPIO_setMasterCore入参
//
//*****************************************************************************
typedef enum
{
    GPIO_CORE_CPU1,           //!< CPU1作为该GPIO的主控核
    GPIO_CORE_CPU1_CLA1       //!< CPU1的CLA1作为该GPIO的主控核
} GPIO_CoreSelect;

//*****************************************************************************
//
//! GPIO端口号枚举,端口读写API入参
//
//*****************************************************************************
typedef enum
{
    GPIO_PORT_A = 0,                     //!< GPIOA端口(GPIO0~31)
    GPIO_PORT_B = 1,                     //!< GPIOB端口(GPIO32~63)
    GPIO_PORT_H = 7                      //!< GPIOH端口
} GPIO_Port;

//*****************************************************************************
//
//! C2000外部中断XINT编号枚举,外部中断相关API入参
//
//*****************************************************************************
typedef enum
{
    GPIO_INT_XINT1,                      //!< 外部中断1
    GPIO_INT_XINT2,                      //!< 外部中断2
    GPIO_INT_XINT3,                      //!< 外部中断3
    GPIO_INT_XINT4,                      //!< 外部中断4
    GPIO_INT_XINT5                       //!< 外部中断5
} GPIO_ExternalIntNum;

//*****************************************************************************
//
// API函数原型声明
//
//*****************************************************************************

//*****************************************************************************
//! \internal
//! 校验GPIO引脚号合法性,DEBUG模式下生效
//!
//! 注意:该范围为器件最大封装引脚范围,实际有效引脚请查阅芯片数据手册
//! \param pin GPIO引脚编号
//! \return true:引脚号合法;false:引脚号非法
//*****************************************************************************
#ifdef DEBUG
static inline bool
GPIO_isPinValid(uint32_t pin)
{
    return((pin <= 59U) || ((pin >= 224U) && (pin <= 247U)));
}
#endif

//*****************************************************************************
//! 设置外部中断触发边沿类型
//! \param extIntNum 外部中断号 XINT1~XINT5
//! \param intType 触发类型:上升沿/下降沿/双边沿
//! \return 无
//*****************************************************************************
static inline void
GPIO_setInterruptType(GPIO_ExternalIntNum extIntNum, GPIO_IntType intType)
{
    // 修改XINT控制寄存器的极性位,保留其他位不变
    HWREGH(XINT_BASE + (uint16_t)extIntNum) =
        (HWREGH(XINT_BASE + (uint16_t)extIntNum) & ~XINT_1CR_POLARITY_M) |
        (uint16_t)intType;
}

//*****************************************************************************
//! 获取外部中断当前触发边沿类型
//! \param extIntNum 外部中断号 XINT1~XINT5
//! \return 返回当前中断触发类型 GPIO_IntType枚举
//*****************************************************************************
static inline GPIO_IntType
GPIO_getInterruptType(GPIO_ExternalIntNum extIntNum)
{
    // 读取寄存器极性掩码位,转换为枚举返回
    return((GPIO_IntType)(HWREGH(XINT_BASE + (uint16_t)extIntNum) &
                          XINT_1CR_POLARITY_M));
}

//*****************************************************************************
//! 使能指定外部中断
//! \param extIntNum 外部中断号 XINT1~XINT5
//! \return 无
//*****************************************************************************
static inline void
GPIO_enableInterrupt(GPIO_ExternalIntNum extIntNum)
{
    // 将中断使能位置1
    HWREGH(XINT_BASE + (uint16_t)extIntNum) |= XINT_1CR_ENABLE;
}

//*****************************************************************************
//! 关闭指定外部中断
//! \param extIntNum 外部中断号 XINT1~XINT5
//! \return 无
//*****************************************************************************
static inline void
GPIO_disableInterrupt(GPIO_ExternalIntNum extIntNum)
{
    // 将中断使能位清零
    HWREGH(XINT_BASE + (uint16_t)extIntNum) &= ~XINT_1CR_ENABLE;
}

//*****************************************************************************
//! 读取单个GPIO引脚电平
//! \param pin GPIO引脚编号
//! \return 返回引脚电平 0 / 1;输入输出模式均可读取
//*****************************************************************************
static inline uint32_t
GPIO_readPin(uint32_t pin)
{
    volatile uint32_t *gpioDataReg;
    // 参数合法性检查,DEBUG模式断言
    ASSERT(GPIO_isPinValid(pin));
    // 计算该引脚所在端口数据寄存器基地址,每32个GPIO为一组端口
    gpioDataReg = (uint32_t *)GPIODATA_BASE +
                  ((pin / 32U) * GPIO_DATA_REGS_STEP);
    // 取出对应bit位,返回0或1
    return((gpioDataReg[GPIO_GPxDAT_INDEX] >> (pin % 32U)) & (uint32_t)0x1U);
}

//*****************************************************************************
//! 设置单个GPIO输出引脚电平
//! \param pin GPIO引脚编号
//! \param outVal 输出值 0/1;输入引脚调用无效果
//! \return 无
//*****************************************************************************
static inline void
GPIO_writePin(uint32_t pin, uint32_t outVal)
{
    volatile uint32_t *gpioDataReg;
    uint32_t pinMask;
    ASSERT(GPIO_isPinValid(pin));
    gpioDataReg = (uint32_t *)GPIODATA_BASE +
                  ((pin / 32U) * GPIO_DATA_REGS_STEP);
    pinMask = (uint32_t)1U << (pin % 32U);
    if(outVal == 0U)
    {
        gpioDataReg[GPIO_GPxCLEAR_INDEX] = pinMask;     // 写CLEAR寄存器清零引脚
    }
    else
    {
        gpioDataReg[GPIO_GPxSET_INDEX] = pinMask;       // 写SET寄存器置位引脚
    }
}

//*****************************************************************************
//! GPIO引脚电平翻转
//! \param pin GPIO引脚编号;输入引脚调用无效果
//! \return 无
//*****************************************************************************
static inline void
GPIO_togglePin(uint32_t pin)
{
    volatile uint32_t *gpioDataReg;
    ASSERT(GPIO_isPinValid(pin));
    gpioDataReg = (uint32_t *)GPIODATA_BASE +
                  ((pin / 32U) * GPIO_DATA_REGS_STEP);
    gpioDataReg[GPIO_GPxTOGGLE_INDEX] = (uint32_t)1U << (pin % 32U); // 写TOGGLE寄存器翻转电平
}

//*****************************************************************************
//! 读取整个端口全部引脚数据
//! \param port GPIO端口号 GPIO_PORT_A / GPIO_PORT_B
//! \return 返回端口32位寄存器值,每bit对应一个引脚
//*****************************************************************************
static inline uint32_t
GPIO_readPortData(GPIO_Port port)
{
    volatile uint32_t *gpioDataReg;
    // 获取端口寄存器基地址,读取DAT寄存器
    gpioDataReg = (uint32_t *)GPIODATA_BASE +
                  ((uint32_t)port * GPIO_DATA_REGS_STEP);
    return(gpioDataReg[GPIO_GPxDAT_INDEX]);
}

//*****************************************************************************
//! 直接写整个端口DAT寄存器(直接赋值)
//! \param port GPIO端口号
//! \param outVal 32位端口输出值
//! \return 无
//*****************************************************************************
static inline void
GPIO_writePortData(GPIO_Port port, uint32_t outVal)
{
    volatile uint32_t *gpioDataReg;
    gpioDataReg = (uint32_t *)GPIODATA_BASE +
                  ((uint32_t)port * GPIO_DATA_REGS_STEP);
    gpioDataReg[GPIO_GPxDAT_INDEX] = outVal;
}

//*****************************************************************************
//! 将端口指定mask对应引脚置1
//! \param port GPIO端口号
//! \param pinMask 置位引脚掩码,bit=1对应引脚置高
//! \return 无
//*****************************************************************************
static inline void
GPIO_setPortPins(GPIO_Port port, uint32_t pinMask)
{
    volatile uint32_t *gpioDataReg;
    gpioDataReg = (uint32_t *)GPIODATA_BASE +
                  ((uint32_t)port * GPIO_DATA_REGS_STEP);
    gpioDataReg[GPIO_GPxSET_INDEX] = pinMask;
}

//*****************************************************************************
//! 将端口指定mask对应引脚清零
//! \param port GPIO端口号
//! \param pinMask 清零引脚掩码,bit=1对应引脚置低
//! \return 无
//*****************************************************************************
static inline void
GPIO_clearPortPins(GPIO_Port port, uint32_t pinMask)
{
    volatile uint32_t *gpioDataReg;
    gpioDataReg = (uint32_t *)GPIODATA_BASE +
                  ((uint32_t)port * GPIO_DATA_REGS_STEP);
    gpioDataReg[GPIO_GPxCLEAR_INDEX] = pinMask;
}

//*****************************************************************************
//! 将端口mask指定引脚电平翻转
//! \param port GPIO端口号
//! \param pinMask 翻转引脚掩码,bit=1对应引脚翻转
//! \return 无
//*****************************************************************************
static inline void
GPIO_togglePortPins(GPIO_Port port, uint32_t pinMask)
{
    volatile uint32_t *gpioDataReg;
    gpioDataReg = (uint32_t *)GPIODATA_BASE +
                  ((uint32_t)port * GPIO_DATA_REGS_STEP);
    gpioDataReg[GPIO_GPxTOGGLE_INDEX] = pinMask;
}

//*****************************************************************************
//! 锁定端口指定引脚的配置寄存器(方向、MUX、上拉等,不锁定输出电平)
//! \param port GPIO端口号
//! \param pinMask 需要锁定的引脚掩码
//! \return 无
//! 注意:LOCK仅阻止修改配置,引脚输出电平仍然可以改写;EALLOW解锁寄存器写保护
//*****************************************************************************
static inline void
GPIO_lockPortConfig(GPIO_Port port, uint32_t pinMask)
{
    volatile uint32_t *gpioDataReg;
    gpioDataReg = (uint32_t *)GPIOCTRL_BASE +
                  ((uint32_t)port * GPIO_CTRL_REGS_STEP);
    EALLOW;
    gpioDataReg[GPIO_GPxLOCK_INDEX] |= pinMask;
    EDIS;
}

//*****************************************************************************
//! 解锁端口指定引脚配置寄存器,允许重新修改配置
//! \param port GPIO端口号
//! \param pinMask 需要解锁的引脚掩码
//! \return 无
//*****************************************************************************
static inline void
GPIO_unlockPortConfig(GPIO_Port port, uint32_t pinMask)
{
    volatile uint32_t *gpioDataReg;
    gpioDataReg = (uint32_t *)GPIOCTRL_BASE +
                  ((uint32_t)port * GPIO_CTRL_REGS_STEP);
    EALLOW;
    gpioDataReg[GPIO_GPxLOCK_INDEX] &= ~pinMask;
    EDIS;
}

//*****************************************************************************
//! 永久提交锁配置;调用后lock/unlock将不再对该组引脚生效,不可逆
//! \param port GPIO端口号
//! \param pinMask 需要永久锁定的引脚掩码
//! \return 无
//*****************************************************************************
static inline void
GPIO_commitPortConfig(GPIO_Port port, uint32_t pinMask)
{
    volatile uint32_t *gpioDataReg;
    gpioDataReg = (uint32_t *)GPIOCTRL_BASE +
                  ((uint32_t)port * GPIO_CTRL_REGS_STEP);
    EALLOW;
    gpioDataReg[GPIO_GPxCR_INDEX] |= pinMask;
    EDIS;
}

//*****************************************************************************
//! 设置GPIO引脚方向:输入/输出
//! \param pin GPIO引脚编号
//! \param pinIO GPIO_DIR_MODE_IN / GPIO_DIR_MODE_OUT
//! \return 无
//*****************************************************************************
extern void
GPIO_setDirectionMode(uint32_t pin, GPIO_Direction pinIO);

//*****************************************************************************
//! 获取GPIO引脚当前方向
//! \param pin GPIO引脚编号
//! \return 返回GPIO_Direction枚举值
//*****************************************************************************
extern GPIO_Direction
GPIO_getDirectionMode(uint32_t pin);

//*****************************************************************************
//! 将指定GPIO引脚映射到外部中断XINTn
//! \param pin GPIO引脚编号
//! \param extIntNum XINT1~XINT5外部中断号
//! \return 无
//! \sa XBAR_setInputPin()
//*****************************************************************************
extern void
GPIO_setInterruptPin(uint32_t pin, GPIO_ExternalIntNum extIntNum);

//*****************************************************************************
//! 设置引脚PAD电气属性:上拉、开漏、极性反转
//! \param pin GPIO引脚编号
//! \param pinType 组合位参数:GPIO_PIN_TYPE_STD / PULLUP / OD / INVERT
//! \return 无
//*****************************************************************************
extern void
GPIO_setPadConfig(uint32_t pin, uint32_t pinType);

//*****************************************************************************
//! 读取引脚PAD电气配置
//! \param pin GPIO引脚编号
//! \return 返回bit组合的pad配置值
//*****************************************************************************
extern uint32_t
GPIO_getPadConfig(uint32_t pin);

//*****************************************************************************
//! 设置GPIO输入限定滤波模式(同步/3采样/6采样/异步)
//! \param pin GPIO引脚编号
//! \param qualification GPIO_QualificationMode枚举
//! \return 无
//*****************************************************************************
extern void
GPIO_setQualificationMode(uint32_t pin, GPIO_QualificationMode qualification);

//*****************************************************************************
//! 获取GPIO输入限定滤波模式
//! \param pin GPIO引脚编号
//! \return 返回GPIO_QualificationMode枚举
//*****************************************************************************
extern GPIO_QualificationMode
GPIO_getQualificationMode(uint32_t pin);

//*****************************************************************************
//! 设置输入限定采样时钟分频;8个引脚共用一组分频配置
//! \param pin 该组中任意引脚号,内部会向下对齐8的倍数
//! \param divider SYSCLKOUT分频系数,1或2~510偶数
//! \return 无
//*****************************************************************************
extern void
GPIO_setQualificationPeriod(uint32_t pin, uint32_t divider);

//*****************************************************************************
//! 设置GPIO数据寄存器主控内核(CPU1 / CPU1_CLA1)
//! \param pin GPIO引脚编号
//! \param core GPIO_CoreSelect枚举
//! \return 无
//! 说明:设置后,只有指定内核可以读写该引脚SET/CLEAR/DAT/TOGGLE寄存器
//*****************************************************************************
extern void
GPIO_setMasterCore(uint32_t pin, GPIO_CoreSelect core);

//*****************************************************************************
//! 设置引脚模拟模式开关,切换数字GPIO / ADC模拟输入
//! \param pin GPIO引脚编号
//! \param mode GPIO_ANALOG_DISABLED / GPIO_ANALOG_ENABLED
//! \return 无
//*****************************************************************************
extern void
GPIO_setAnalogMode(uint32_t pin, GPIO_AnalogMode mode);

//*****************************************************************************
//! 设置引脚功能复用MUX,切换GPIO/外设功能(SCI,PWM,CAN等)
//! \param pinConfig 来自pin_map.h的引脚配置宏,例如GPIO0_GPIO0
//! \return 无
//*****************************************************************************
extern void
GPIO_setPinConfig(uint32_t pinConfig);

//*****************************************************************************
// Close the Doxygen group.
//! @}
//*****************************************************************************

//*****************************************************************************
// C++编译器兼容,结束C绑定
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif //  GPIO_H

2.函数清单与功能说明

区分:static inline 头文件内联函数;extern 在.c 源文件实现,头文件只做声明

2.1内联函数列表 (static inline)

函数名 功能简述
GPIO_isPinValid DEBUG 模式校验 GPIO 引脚号是否合法,断言使用
GPIO_setInterruptType 设置外部 XINT 中断触发边沿:上升沿 / 下降沿 / 双边沿
GPIO_getInterruptType 读取外部 XINT 中断当前触发边沿配置
GPIO_enableInterrupt 使能 XINT 外部中断
GPIO_disableInterrupt 关闭 XINT 外部中断
GPIO_readPin 读取单个 GPIO 引脚电平 (0/1)
GPIO_writePin 设置单个 GPIO 输出引脚电平 (0/1)
GPIO_togglePin 翻转单个 GPIO 输出引脚电平
GPIO_readPortData 读取完整端口 32 位 GPIO 数据寄存器
GPIO_writePortData 直接赋值写端口 DAT 寄存器
GPIO_setPortPins 端口掩码置位:mask 中 bit=1 引脚输出高电平
GPIO_clearPortPins 端口掩码清零:mask 中 bit=1 引脚输出低电平
GPIO_togglePortPins 端口掩码翻转:mask 中 bit=1 引脚电平翻转
GPIO_lockPortConfig 锁定端口指定引脚配置寄存器,禁止修改 MUX/DIR/PUD 等,不锁输出电平
GPIO_unlockPortConfig 解锁端口指定引脚配置,允许修改配置
GPIO_commitPortConfig 永久提交锁定配置,不可逆,lock/unlock 不再生效

2.2外部声明函数列表 (extern,在 gpio.c 源文件实现)

函数名 功能简述
GPIO_setDirectionMode 配置单引脚方向:输入 / 输出
GPIO_getDirectionMode 读取单引脚当前 IO 方向
GPIO_setInterruptPin 把某个 GPIO 引脚分配给 XINT1~XINT5 外部中断输入
GPIO_setPadConfig 配置引脚 PAD 属性:上拉、开漏输出、输入极性反转
GPIO_getPadConfig 读取引脚 PAD 电气配置参数
GPIO_setQualificationMode 设置输入滤波限定模式:同步 SYSCLK / 3 采样 /6 采样 / 异步
GPIO_getQualificationMode 读取输入限定滤波模式
GPIO_setQualificationPeriod 设置输入限定采样时钟分频;8 个引脚共享一组分频参数
GPIO_setMasterCore 设置 GPIO 数据寄存器的主控内核 (CPU1 / CLA1),多核器件使用
GPIO_setAnalogMode 开启 / 关闭引脚模拟模式,切换 GPIO 与 ADC 输入
GPIO_setPinConfig 引脚 MUX 功能复用配置,切换 GPIO、PWM、SCI、CAN 等外设功能

3.补充知识点

  1. EALLOW / EDIS:C2000 器件寄存器写保护;LOCK/CR 等安全寄存器需要 EALLOW 解锁才允许写入。
  2. SET/CLEAR/TOGGLE 寄存器:推荐优先使用,读写不会影响端口其他引脚,比直接写 DAT 寄存器更安全。
  3. LOCK 锁的是配置寄存器 ,引脚输出电平不受 LOCK 影响;GPIO_commitPortConfig()是硬件级永久锁,一旦执行无法撤销。
  4. Qualification 限定采样:用于输入引脚滤除毛刺,采样时钟由 QualificationPeriod 分频 SYSCLKOUT 得到。
  5. MasterCore:C2000 CPU+CLA 架构,设置后只有指定内核可以操作该引脚 SET/CLEAR/DAT/TOGGLE 寄存器。
相关推荐
星一工作室2 小时前
【STM32模块教程】-TT马达(直流电机)
单片机·嵌入式硬件
单片机仿真设计2 小时前
【proteus仿真】基于 STM32 单片机汽车安全监控装置设计(仿真 + 源码)
stm32·单片机·嵌入式硬件·proteus·毕设
单片机仿真设计2 小时前
【proteus仿真】基于 STM32 单片机的智能浴室系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
天空'之城2 小时前
单片机基础核心知识点汇总(二十六)
单片机·嵌入式硬件
Jason_zhao_MR3 小时前
Linux与采集MCU通信为什么我们用了双SPI
linux·arm开发·单片机·嵌入式硬件·嵌入式
嵌入式阿蔡3 小时前
云平台设备接入实战:三元组鉴权、属性上报与命令下发(阿里云/华为云)
嵌入式硬件·物联网·嵌入式·存储
liuguomark3 小时前
TMC5160使用问题2
嵌入式硬件·tmc5160
三佛科技-187366133973 小时前
MT8F82XX系列MCU型号选型指南:兼容替代型号全梳理
单片机·嵌入式硬件
Jaixln_HRF4 小时前
芯维尔CN3921 2A/30V同步降压转换器芯片,集成120/80mΩ MOSFET与680kHz频率,用于汽车电子/IoT/便携仪器
嵌入式硬件·物联网·硬件工程