MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件
MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件
1、功能描述
msa311可以识别单击、双击事件,类似手机上的点击返回,双击截屏功能。
单击,双击都能产生中断事件。
中断事件产生后,从对应的状态寄存器读取是双击还是单击。
中断需要打开映射。
单双击可设置阈值。
对应寄存器的描述如下:
2、设置相关寄存器
a、设置tap_quite
b、设置tap_shock
c、设置tap_duration
d、设置tap_threshole
e、设置中断映射
f、设置中断使能。
对应代码:
#if ENABLE_TAP_DETECT == 1Msa311_SetTapQuiteParam(MSA311_TAPQUITE_30_MS);Msa311_GetTapQuiteParam(&tapQuite);printf("Msa311_getTapQuiteParam == %s\r\n",tapQuite == MSA311_TAPQUITE_30_MS ? "MSA311_TAPQUITE_30_MS" : "MSA311_TAPQUITE_20_MS");Msa311_SetTapShockParam(MSA311_TAPSHOCK_50_MS);Msa311_GetTapShockParam(&tapShock);printf("Msa311_GetTapShockParam == %s\r\n",tapShock == MSA311_TAPSHOCK_50_MS ? "MSA311_TAPSHOCK_50_MS" : "MSA311_TAPSHOCK_70_MS");Msa311_SetTapDurationParam(MSA311_TAPDUR_250_MS);Msa311_GetTapDurationParam(&tapDuration);printf("Msa311_GetTapDurationParam == 0x%02x\r\n",tapDuration);Msa311_ThresholdConvertToRegister(1.0f,®);Msa311_SetTapThresholdParam(reg);Msa311_GetTapThresholdParam(&threshold);printf("Msa311_GetTapThresholdParam == 0x%02x\r\n",threshold);//使能S_TAP D_TAP IntMsa311_SetInterruptMap0(MSA311_INTERRUPT_D_TAP,MSA311_BOOL_TRUE);Msa311_SetInterruptMap0(MSA311_INTERRUPT_S_TAP,MSA311_BOOL_TRUE);Msa311_GetInterruptMap0(MSA311_INTERRUPT_D_TAP,&enable);printf("Msa311_GetInterruptMap0 MSA311_INTERRUPT_D_TAP %s\r\n",enable==MSA311_BOOL_TRUE ? "enable" : "disable");Msa311_GetInterruptMap0(MSA311_INTERRUPT_S_TAP,&enable);printf("Msa311_GetInterruptMap0 MSA311_INTERRUPT_S_TAP %s\r\n",enable==MSA311_BOOL_TRUE ? "enable" : "disable");Msa311_SetInterrupt0Enable(MSA311_INTERRUPT_D_TAP_EN,MSA311_BOOL_TRUE);Msa311_GetInterrupt0Enable(MSA311_INTERRUPT_D_TAP_EN,&enable);printf("Msa311_GetInterrupt0Enable MSA311_INTERRUPT_D_TAP %s\r\n",enable==MSA311_BOOL_TRUE ? "enable" : "disable");Msa311_SetInterrupt0Enable(MSA311_INTERRUPT_S_TAP_EN,MSA311_BOOL_TRUE);Msa311_GetInterrupt0Enable(MSA311_INTERRUPT_S_TAP_EN,&enable);printf("Msa311_GetInterrupt0Enable MSA311_INTERRUPT_S_TAP_EN %s\r\n",enable==MSA311_BOOL_TRUE ? "enable" : "disable");#endif
每个功能函数:
static bool Msa311_SetTapQuiteParam(msa311_tapquite_t tapQuite)
{uint8_t r_data;uint8_t w_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_TAPDUR,&r_data);if (bRet == false){perror("Msa311_SetTapQuiteParam read error\n");return false;}w_data = ((r_data & MSA311_TAP_QUITE_MASK) | tapQuite);bRet = Msa311_WirteReg(MSA311_REG_TAPDUR,w_data);if (bRet == false){perror("Msa311_SetTapQuiteParam write error\n");return false;}return bRet;
}static bool Msa311_GetTapQuiteParam(msa311_tapquite_t *tapQuite)
{ uint8_t r_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_TAPDUR,&r_data);if (bRet == false){perror("Msa311_GetRange read error\n");return false;}*tapQuite = (r_data & ~(MSA311_TAP_QUITE_MASK));return bRet;
}static bool Msa311_SetTapShockParam(msa311_tapshock_t tapShock)
{uint8_t r_data;uint8_t w_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_TAPDUR,&r_data);if (bRet == false){perror("Msa311_SetTapShockParam read error\n");return false;}w_data = ((r_data & MSA311_TAP_SHOCK_MASK) | tapShock);bRet = Msa311_WirteReg(MSA311_REG_TAPDUR,w_data);if (bRet == false){perror("Msa311_SetTapShockParam write error\n");return false;}return bRet;
}static bool Msa311_GetTapShockParam(msa311_tapshock_t *tapShock)
{ uint8_t r_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_TAPDUR,&r_data);if (bRet == false){perror("Msa311_GetTapShockParam read error\n");return false;}*tapShock = (r_data & ~(MSA311_TAP_SHOCK_MASK));return bRet;
}static bool Msa311_SetTapDurationParam(msa311_tapduration_t tapDuration)
{uint8_t r_data;uint8_t w_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_TAPDUR,&r_data);if (bRet == false){perror("Msa311_SetTapDurationParam read error\n");return false;}w_data = ((r_data & MSA311_TAP_DUR_MASK) | tapDuration);bRet = Msa311_WirteReg(MSA311_REG_TAPDUR,w_data);if (bRet == false){perror("Msa311_SetTapDurationParam write error\n");return false;}return bRet;
}static bool Msa311_GetTapDurationParam(msa311_tapduration_t *tapDuration)
{ uint8_t r_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_TAPDUR,&r_data);if (bRet == false){perror("Msa311_GetTapDurationParam read error\n");return false;}*tapDuration = (r_data & ~(MSA311_TAP_DUR_MASK));return bRet;
}static uint8_t Msa311_ThresholdConvertToRegister(float g, uint8_t *reg)
{msa311_range_t range;Msa311_GetRange(&range);switch (range){case MSA311_RANGE_2_G/* constant-expression */:/* code */*reg = (int8_t)(g / 0.0625f); break;case MSA311_RANGE_4_G/* constant-expression */:/* code */*reg = (int8_t)(g / 0.125f); break;case MSA311_RANGE_8_G/* constant-expression */:/* code */*reg = (int8_t)(g / 0.250f); break;case MSA311_RANGE_16_G/* constant-expression */:/* code */*reg = (int8_t)(g / 0.5f); break; default:printf("Msa311_ThresholdConvertToRegister error\r\n");break;}return 0;
}static uint8_t Msa311_ThresholdConvertToData(uint8_t reg, float *g)
{msa311_range_t range;Msa311_GetRange(&range);switch (range){case MSA311_RANGE_2_G/* constant-expression */:/* code */*g = (float)(reg) * 0.0625f; break;case MSA311_RANGE_4_G/* constant-expression */:/* code */*g = (float)(reg) * 0.125f; break;case MSA311_RANGE_8_G/* constant-expression */:/* code */*g = (float)(reg) * 0.250f; break;case MSA311_RANGE_16_G/* constant-expression */:/* code */*g = (float)(reg) * 0.500f; break; default:printf("Msa311_ThresholdConvertToData error\r\n");break;}*g = (float)(reg) * 0.0039f; return 0;
}static bool Msa311_SetTapThresholdParam(uint8_t threshold)
{uint8_t r_data;uint8_t w_data;bool bRet = 0;w_data = threshold;bRet = Msa311_WirteReg(MSA311_REG_TAPTH,w_data);if (bRet == false){perror("Msa311_SetTapThresholdParam write error\n");return false;}return bRet;
}static bool Msa311_GetTapThresholdParam(uint8_t *threshold)
{ uint8_t r_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_TAPTH,&r_data);if (bRet == false){perror("Msa311_SetTapThresholdParam read error\n");return false;}*threshold = r_data;return bRet;
}static bool Msa311_SetInterruptMap0(msa311_interrupt_map0_t type, msa311_bool_t enable)
{uint8_t r_data;uint8_t w_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_INTMAP0,&r_data);if (bRet == false){perror("Msa311_SetInterruptMap0 read error\n");return false;}r_data &= ~(1 << type); /* clear type */r_data |= enable << type; bRet = Msa311_WirteReg(MSA311_REG_INTMAP0,r_data);if (bRet == false){perror("Msa311_SetInterruptMap0 write error\n");return false;}return bRet;
}static bool Msa311_GetInterruptMap0(msa311_interrupt_map0_t type, msa311_bool_t *enable)
{uint8_t r_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_INTMAP0,&r_data);if (bRet == false){perror("Msa311_SetInterruptMap0 read error\n");return false;}r_data &= (1 << type); /* clear config */*enable = (msa311_bool_t)(r_data >> type); return 0;
}static bool Msa311_SetInterrupt0Enable(msa311_interrupt_sw0_t type, msa311_bool_t enable)
{uint8_t r_data;uint8_t w_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_INTSET0,&r_data);if (bRet == false){perror("Msa311_SetInterrupt0Enable read error\n");return false;}r_data &= ~(1 << type); /* clear type */r_data |= enable << type; bRet = Msa311_WirteReg(MSA311_REG_INTSET0,r_data);if (bRet == false){perror("Msa311_SetInterrupt0Enable write error\n");return false;}return bRet;
}static bool Msa311_GetInterrupt0Enable(msa311_interrupt_sw0_t type, msa311_bool_t *enable)
{uint8_t r_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_INTMAP0,&r_data);if (bRet == false){perror("Msa311_GetInterrupt0Enable read error\n");return false;}r_data &= (1 << type); /* clear config */*enable = (msa311_bool_t)(r_data >> type); return 0;
}static bool Msa311_SetInterrupt1Enable(msa311_interrupt_sw1_t type, msa311_bool_t enable)
{uint8_t r_data;uint8_t w_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_INTSET1,&r_data);if (bRet == false){perror("Msa311_SetInterrupt1Enable read error\n");return false;}r_data &= ~(1 << type); /* clear type */r_data |= enable << type; bRet = Msa311_WirteReg(MSA311_REG_INTSET1,r_data);if (bRet == false){perror("Msa311_SetInterrupt1Enable write error\n");return false;}return bRet;
}static bool Msa311_GetInterrupt1Enable(msa311_interrupt_sw1_t type, msa311_bool_t *enable)
{uint8_t r_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_INTMAP1,&r_data);if (bRet == false){perror("Msa311_GetInterrupt1Enable read error\n");return false;}r_data &= (1 << type); /* clear config */*enable = (msa311_bool_t)(r_data >> type); return 0;
}static bool Msa311_GetInterruptState(msa311_int_state_t state, msa311_bool_t *enable)
{uint8_t r_data;bool bRet = 0;bRet = Msa311_ReadReg(MSA311_REG_MOTIONINT,&r_data);if (bRet == false){perror("Msa311_GetInterrupt1Enable read error\n");return false;}r_data &= (1 << state); /* clear config */*enable = (msa311_bool_t)(r_data >> state); return 0;
}
对应头文件:
#ifndef __MSA311_H__
#define __MSA311_H__#define MSA311_I2CADDR_DEFAULT_7 (0x62) ///< Fixed I2C address
#define MSA311_I2CADDR_DEFAULT_8 (0xC4) ///< Fixed I2C address/*=========================================================================*/#define MSA311_REG_RESET 0x00 ///< Register soft reset
#define MSA311_REG_PARTID 0x01 ///< Register that contains the part ID
#define MSA311_REG_OUT_X_L 0x02 ///< Register address for X axis lower byte
#define MSA311_REG_OUT_X_H 0x03 ///< Register address for X axis higher byte
#define MSA311_REG_OUT_Y_L 0x04 ///< Register address for Y axis lower byte
#define MSA311_REG_OUT_Y_H 0x05 ///< Register address for Y axis higher byte
#define MSA311_REG_OUT_Z_L 0x06 ///< Register address for Z axis lower byte
#define MSA311_REG_OUT_Z_H 0x07 ///< Register address for Z axis higher byte
#define MSA311_REG_MOTIONINT 0x09 ///< Register address for motion interrupt
#define MSA311_REG_DATAINT 0x0A ///< Register address for data interrupt
#define MSA311_REG_CLICKSTATUS 0x0B ///< Register address for click/doubleclick status
#define MSA311_REG_ORIENTATION_STATUS 0x0C ///< Register address for orientation status
#define MSA311_REG_RESRANGE 0x0F ///< Register address for resolution range
#define MSA311_REG_ODR 0x10 ///< Register address for data rate setting
#define MSA311_REG_POWERMODE 0x11 ///< Register address for power mode setting
#define MSA311_REG_INTSET0 0x16 ///< Register address for interrupt setting #0
#define MSA311_REG_INTSET1 0x17 ///< Register address for interrupt setting #1
#define MSA311_REG_INTMAP0 0x19 ///< Register address for interrupt map #0
#define MSA311_REG_INTMAP1 0x1A ///< Register address for interrupt map #1
#define MSA311_REG_TAPDUR 0x2A ///< Register address for tap duration
#define MSA311_REG_TAPTH 0x2B ///< Register address for tap threshold#define MSA311_REG_OFFSET_X 0x38
#define MSA311_REG_OFFSET_Y 0x39
#define MSA311_REG_OFFSET_Z 0x3A#define MSA311_POWER_MODE_MSAK 0x3F
#define MSA311_POWER_MODE_SHIFT 0x05u/** The accelerometer power mode */
typedef enum {MSA311_NORMALMODE = 0x00, ///< Normal (high speed) modeMSA311_LOWPOWERMODE = 0x40, ///< Low power (slow speed) modeMSA311_SUSPENDMODE = 0xC0, ///< Suspend (sleep) mode
} msa311_powermode_t;#define MSA311_AXES_ENABLE_MSAK 0x1F
typedef enum{AXES_DISABLE = 0x00,AXES_ENABLE = 0xE0,
}msa311_axes_state_t;#define MSA311_DATA_RATE_MASK 0xF0
/** The accelerometer data rate */
typedef enum {MSA311_DATARATE_1_HZ = 0x00, ///< 1 HzMSA311_DATARATE_1_95_HZ = 0x01, ///< 1.95 HzMSA311_DATARATE_3_9_HZ = 0x02, ///< 3.9 HzMSA311_DATARATE_7_81_HZ = 0x03, ///< 7.81 HzMSA311_DATARATE_15_63_HZ = 0x04, ///< 15.63 HzMSA311_DATARATE_31_25_HZ = 0x05, ///< 31.25 HzMSA311_DATARATE_62_5_HZ = 0x06, ///< 62.5 HzMSA311_DATARATE_125_HZ = 0x07, ///< 125 HzMSA311_DATARATE_250_HZ = 0x08, ///< 250 HzMSA311_DATARATE_500_HZ = 0x09, ///< 500 HzMSA311_DATARATE_1000_HZ = 0x0A, ///< 1000 Hz
} msa311_dataRate_t;#define MSA311_BAND_WIDTH_MASK 0xE1
/** The accelerometer bandwidth */
typedef enum {MSA301_BANDWIDTH_1_95_HZ = 0x00, ///< 1.95 HzMSA301_BANDWIDTH_3_9_HZ = 0x06, ///< 3.9 HzMSA301_BANDWIDTH_7_81_HZ = 0x08, ///< 7.81 HzMSA301_BANDWIDTH_15_63_HZ = 0x0A, ///< 15.63 HzMSA301_BANDWIDTH_31_25_HZ = 0x0C, ///< 31.25 HzMSA301_BANDWIDTH_62_5_HZ = 0x0E, ///< 62.5 HzMSA301_BANDWIDTH_125_HZ = 0x10, ///< 125 HzMSA301_BANDWIDTH_250_HZ = 0x12, ///< 250 HzMSA301_BANDWIDTH_500_HZ = 0x14, ///< 500 Hz
} msa301_bandwidth_t;#define MSA311_RANG_MASK 0xFC
/** The accelerometer ranges */
typedef enum {MSA311_RANGE_2_G = 0x00, ///< +/- 2g (default value)MSA311_RANGE_4_G = 0x01, ///< +/- 4gMSA311_RANGE_8_G = 0x02, ///< +/- 8gMSA311_RANGE_16_G = 0x03, ///< +/- 16g
} msa311_range_t;#define MSA311_TAP_DUR_MASK 0xF8
/** Tap duration parameter */
typedef enum {MSA311_TAPDUR_50_MS = 0x00, ///< 50 millisMSA311_TAPDUR_100_MS = 0x01, ///< 100 millisMSA311_TAPDUR_150_MS = 0x02, ///< 150 millisMSA311_TAPDUR_200_MS = 0x03, ///< 200 millisMSA311_TAPDUR_250_MS = 0x04, ///< 250 millisMSA311_TAPDUR_375_MS = 0x05, ///< 375 millisMSA311_TAPDUR_500_MS = 0x06, ///< 500 millisMSA311_TAPDUR_700_MS = 0x07, ///< 50 millis700 millis
} msa311_tapduration_t;#define MSA311_TAP_QUITE_MASK 0x7F
typedef enum{MSA311_TAPQUITE_20_MS = 0x80,MSA311_TAPQUITE_30_MS = 0x00,
}msa311_tapquite_t;#define MSA311_TAP_SHOCK_MASK 0xBF typedef enum{MSA311_TAPSHOCK_50_MS = 0x00,MSA311_TAPSHOCK_70_MS = 0x40,}msa311_tapshock_t;typedef enum
{MSA311_BOOL_FALSE = 0x00, /**< false */MSA311_BOOL_TRUE = 0x01, /**< true */
} msa311_bool_t;typedef enum
{MSA311_INTERRUPT_FREE_FALL = 0x00, /**< free fall */MSA311_INTERRUPT_ACTIVE = 0x02,MSA311_INTERRUPT_D_TAP = 0x04,MSA311_INTERRUPT_S_TAP = 0x05,MSA311_INTERRUPT_ORIENT = 0x06,} msa311_interrupt_map0_t;typedef enum
{MSA311_INTERRUPT_ACTIVE_EN_X = 0x00, MSA311_INTERRUPT_ACTIVE_EN_Y = 0x01, MSA311_INTERRUPT_ACTIVE_EN_Z = 0x02, MSA311_INTERRUPT_D_TAP_EN = 0x04,MSA311_INTERRUPT_S_TAP_EN = 0x05,MSA311_INTERRUPT_ORIENT_EN = 0x06,
} msa311_interrupt_sw0_t;typedef enum
{MSA311_INTERRUPT_FREE_FALLEN = 0x03, MSA311_INTERRUPT_NEW_DATA_EN = 0x04,
} msa311_interrupt_sw1_t;typedef enum{MSA311_INT_S_TAP_MESSAGE = 0x00,MSA311_INT_D_TAP_MESSAGE = 0x01,}msa311_int_message_type;typedef enum
{MSA311_FREE_FALL_INT_STATE = 0x00,MSA311_ACTIVE_INT_STATE = 0x02,MSA311_D_TAP_INT_STATE = 0x04,MSA311_S_TAP_INT_STATE = 0x05,MSA311_ORIENT_INT_STATE = 0x06,}msa311_int_state_t;// golbal function
void Msa311_Init(void);
void handle_int_message(void);
#endif
这样设置好msa311的寄存器后,当我们敲击的时候,int脚会拉低。所以我们只需要连接mm32一个gpio,并且配成中断模式,就可以捕获对应的敲击事件了。
3、中断接收并处理数据
将msa311的Int脚连接至mm32 的PC8.
pc8适配中断代码如下:
void BOARD_InitPins(void)
{/* 调用GPIO的HAL库对象结构体声明GPIO对象 */GPIO_Init_Type gpio_init;//pc 8 for msa311 inter detectuint32_t prioritygroup = 0;RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_SYSCFG, true);/* 设置GPIO的模式 */gpio_init.PinMode = GPIO_PinMode_In_PullUp;gpio_init.Speed = GPIO_Speed_50MHz;/* 选择引脚初始化 */gpio_init.Pins = GPIO_PIN_8;GPIO_Init(GPIOC, &gpio_init);/* 将外部中断线设置为复用模式 */SYSCFG_SetExtIntMux(SYSCFG_EXTIPort_GPIOC, SYSCFG_EXTILine_8);/* 设置外部中断线的触发方式 */EXTI_SetTriggerIn(EXTI, EXTI_LINE_8, EXTI_TriggerIn_FallingEdge); /* 使能外部中断线 */EXTI_EnableLineInterrupt(EXTI, EXTI_LINE_8, true);prioritygroup = NVIC_GetPriorityGrouping();NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(prioritygroup, 0, 2));/* 使能对应的外部中断 */NVIC_EnableIRQ(EXTI9_5_IRQn);
}
对应的中断处理函数:
void EXTI9_5_IRQHandler(void)
{uint32_t flags = EXTI_GetLineStatus(EXTI);if ( 0u != ( flags & EXTI_LINE_8 ) ) /* Interrupts. */{handle_int_message();}EXTI_ClearLineStatus(EXTI, flags);
}
中断处理函数将事件处理交给handle_int_message()函数,此函数在msa311.c中定义。
void handle_int_message(void)
{uint8_t state;bool bRet;bRet = Msa311_ReadReg(MSA311_REG_MOTIONINT,&state);if (bRet == false){perror("Msa311_GetInterrupt1Enable read error\n");return;}if (state & (1 << MSA311_S_TAP_INT_STATE)){printf("this is s_tap \r\n");}else if (state & (1 << MSA311_D_TAP_INT_STATE)){printf("this is d_tap \r\n");}
}
在中断处理函数中,我们做个一件事,就是去读一下0x09寄存器的值,当第四位为1的时候,表示双击,第五位为1的时候,表示单击。
4、现象
单击模块时候打印 this is s_tap
双击模块时候打印 this is d_tap
5、代码
代码下载
相关文章:

MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件
MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件 1、功能描述 msa311可以识别单击、双击事件,类似手机上的点击返回,双击截屏功能。 单击,双击都能产生中断事件。 中断事件产生后,从对应的状态寄存器读…...
Maven聚合
在实际的开发过程中,我们所接触的项目一般都由多个模块组成。在构建项目时,如果每次都按模块一个一个地进行构建会十分得麻烦,Maven 的聚合功能很好的解决了这个问题。 聚合 使用 Maven 聚合功能对项目进行构建时,需要在该项目中…...

[架构之路-211]- 需求- 软架构前的需求理解:ADMEMS标准化、有序化、结构化、层次化需求矩阵 =》需求框架
目录 前言: 一、什么是ADMES: 首先,需求是分层次的: 其次,需求是有结构的,有维度的 再次,不同层次需求、不同维度需求之间可以相互转化(难点、经验积累) 最终,标准…...

基于前推回代法的连续潮流计算研究【IEEE33节点】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

【双向链表】
双向链表 带头双向循环链表的实现1. 函数的声明2. 函数的实现3. 主函数测试 带头双向循环链表的实现 今天我们来实现一下带头双向循环链表,顾名思义,带头就是有哨兵位,哨兵位不是链表的头,它是连接头节点的一个节点,方…...

POSTGRESQL NEON - Serverless 式的POSTGRESQL 数据库的独特技能 分支数据
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…...

数据分布——长尾分布的处理
前言 长尾分布在分类任务中会提到这个名,这是因为长尾分布这个现象问题会导致在训练过程中会出现出错率高的问题,影响了实验结果。 这里要说的是,长尾分布是一种现象,有的地方说是一种理论或定律,我感觉这样说不太确切࿰…...

集合导题、刷题、考试全套完整流程,专业强大的功能,提高刷题学习效率和企业的培训效率
土著刷题微信小程序v1.15,主要是迭代了考试模块的进阶功能,对考试模块进行了一次升级改造。 由于在v1.15开发期间,收到了违规内容整改的通告,为了遵守相关法律法规,让小程序能够平稳安全地运营下去,我们特此…...

【机器学习】采样方法
文章目录 采样方法11.1 简介11.2 常见采样方法11.2.1 均匀分布采样11.2.2 逆变换采样11.2.3 拒绝采样11.2.4 重要采样11.2.5 Metropolis方法11.2.6 Metropolis-Hasting 算法11.2.7 吉布斯采样 采样方法 11.1 简介 什么是采样 从一个分布中生成一批服从该分布的样本,…...

Seata TCC 模式理论学习、生产级使用示例搭建及注意事项 | Spring Cloud55
一、前言 通过以下系列章节: docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…...
一文详解:Vue3中使用Vue Router
目录 安装和配置Vue Router安装Vue Router配置Vue Router Vue Router的基本概念Vue Router 的配置项介绍routes中的配置项介绍 路由跳转使用 router-link组件使用router.push函数 路由传参动态路由嵌套路由命名路由路由守卫全局路由守卫路由独享守卫 路由懒加载使用import()方式…...

C++开发—远程控制
C开发—远程控制 一,准备二,安装版本控制工具1,安装gitforwindows2,安装乌龟git1,安装乌龟git应用2,安装乌龟git对应的语言包 3,设置Visual Studio的git插件4,创建git项目 三&#x…...
【Python基础】Python数据容器(集合)
文章目录 数据容器:set(集合)集合的定义集合的常用操作-修改(1)添加新元素(2)移除元素(3)从集合中随机取出元素(4)清空集合(5)取出 两个集合的差集(6)消除 两个集合的差集(7)两个集合 合并(8)统计集合元素数量len()(9)集合的遍历 集合的特点 …...

高通 Camera HAL3:集成camxoverridesettings.txt到整机版本
camxoverridesettings.txt 是高通提供给开发者临时进行CAMX、CHI-CDK功能调试的一种方式,通过配置各种变量值然后写入到该文件,能控制Log打印、参数配置、数据dump等多种功能 这个文件需要集成在设备目录的vendor/etc/camera/里 因为camxoverridesetti…...
PHP面试题大全
一 、PHP基础部分 1、PHP语言的一大优势是跨平台,什么是跨平台? PHP的运行环境最优搭配为ApacheMySQLPHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以…...

Linux发送接收邮件
目录 一、实验 1.linux用户发送给linux中的其它用户 2.linux用户发送给外网用户 一、实验 1.linux用户发送给linux中的其它用户 (1)使用命令 yum install -y sendmail 安装sendmail软件 (2)使用yum install -y mailx 安装 mail…...

SpringBoot-【回顾】
第一个SpringBoot程序 自动装配原理 Springboot的自动装配实际上就是为了从Spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给Spring容器来帮我们进行管理 启动器:以starter为标记 EnableAuto…...
Python模拟试卷2023(1)
模拟试卷(1) 一、简答题 (共8题,100分) 1、已知有列表lst[54,36,75,28,50],请完成一下操作: 1、在列表尾部插入元素42 2、在元素28前面插入66 3、删除并输出28 4、将列表按降序排序 5、清空整个列表 lst[54,3…...
常量接口 vs 常量类 vs 枚举区别
把常量定义在接口里与类里都能通过编译,那2者到底有什么区别呢? 那个更合理? 常量接口 public interface ConstInterfaceA {public static final String CONST_A "aa";public static final String CONST_C "cc"; } 存在…...

第二章 模态命题:必然、可能
第二章 模态命题:必然、可能 第一节 模态命题-句式转换-逻辑转换 题-模态命题-句式转换-逻辑转换:①不一定不可能;②不一定可能不未必。 1.唐代韩愈在《师说》中指出:“孔子曰:三人行,则必有我师。是故…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...