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.唐代韩愈在《师说》中指出:“孔子曰:三人行,则必有我师。是故…...
Selenium 必了解—如何测试REST API
目录 前言: Web UI测试存在的问题: REST API测试: 依赖包 程序示例: 1-获取联系人 2-GET Request: 3-POST Request: 4- 编辑请求 5- 删除请求 前言: Selenium WebDriver 可以用于测试 Web 应用的…...
pytorch安装老版本
比如1.7.1, cuda 10.1 pip install torch1.7.1cu101 -f https://download.pytorch.org/whl/torch_stable.html官网查看有哪些可以装的: https://download.pytorch.org/whl/torch_stable.html...
怎么自学电脑编程
首要之首:不要急于选择一种语言 新手们有一个常见的错误就是犹豫于判断哪种编程语言是做好的、最该先学的。 我们有很多的选择,但你不能说那种语言最好。 我们应该理解:说到底,什么语言并不重要。 重要的是理解数据结构、控制逻辑…...
【华为OD统一考试B卷 | 100分】斗地主之顺子(C++ Java JavaScript Python)
文章目录 题目描述输入描述输出描述用例C++JavajavaScriptpython题目描述 在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。 其中顺子的出牌规则为:由至少5张由小到大连续递增的扑…...
案例39:基于Java办公自动化管理系统开题报告设计
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
基于山景BP10128音频处理器高通滤波器算法设计
+ hezkz17进数字音频答疑 山景BP10128音频处理器是一款高性能的数字信号处理器,专门用于音频信号的处理和增强。它采用先进的数字信号处理技术和算法,能够对音频信号进行实时处理,并且具有高效、稳定、可靠等特点。 该处理器具有以下主要功能: 均衡器:支持低音、中音、…...
docker搭建本地私有仓库
一、搭建本地私有仓库 有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似。 使用私有仓库有许多优点: 1)节省网络带宽,针对于每个镜像…...
Asp.net某店POS积分管理系统-清除履历表、日志表、月购买额(源代码+论文)
大型百货店作为日常生活中不可缺少的一部分,给人们的生活提供了很大的方便。而为这样一个庞大而复杂的购物平台,提供一套完备的管理系统支持是很必要的。在现代销售行业中,会员制、积分管理、代金消费的概念已经越来越普及。为了吸引更多消费者,加大销售企业的竞争力。就需…...
Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差(C#)
Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差(C#) Baumer工业相机Baumer工业相机BGAPI SDK和图像时间戳的技术背景Baumer工业相机使用BGAPISDK控制相机数据流的方式1.引用合适的类文件2.使用BGAPISDK获取时间戳的…...
python:消除已安装库在import导入时出现红线问题
问题 在pycharm中,对于已经安装的库文件,在进行import导入时出现红线,不影响运行, 简单有效的消除红线的方法。 解决办法 在工程目录中的程序可以采用Mark directory - Source Root方法。 对于安装的第三方库文件环境不在本工程…...
wordpress定时发布插件/如何优化seo
每逢双11,无论智慧物流、自营物流,还是第三方物流,菜鸟、苏宁、四通一达纷纷招兵买马。随着今年双11的临近,种种迹象显示,今年快递行业双11备战提前触发。“高薪急聘、包吃住”,一些招聘网站中,…...
北京顺义做网站/互联网运营培训课程
我编写了几个程序,我编写了一些程序,但知道我编写了一个Chat messenger.当我编译服务器或客户端时,我总是从javac得到错误. “错误:找不到符号”.并且错误是在其他类的构造函数中应该如何构造那里.例:Chat.java:11 error: cannot find symbolFrame frm …...
中企动力做的网站后台如何登陆/百度软件中心下载
1.前言 上个Shiro Demo基础搭建是基于官方的快速入门版本,没有集成其他框架,只是简单的通过Main方法来执行Shiro工作流程,并测试一下比较核心的函数;但在企业开发中一般都会集成Spring,因为被Spring管理后很多事情都交…...
网站用什么软件做/东莞seo优化排名
TCP/IP协议入门 1. 简介 Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/因特网互联协议。它是网络通信的一套协议集合。 先来看一下OSI和TCP/IP模型: 应用层 就是应用软件使用的协议,如邮箱使用的POP3,S…...
网站开发怎样验收/b站推广网站入口
为什么没办法在 Windows 7 下加快 Windows 7 中文件复制/传输功能呢?可以用 robocopy 实现多线程文件复制实现。 经常进行文件管理操作的朋友们,提到复制/粘贴操作,想必很多人还会回想起当初 Vista 奇慢的复制速度,不满意于 Windo…...
长春建站网站/网络营销企业有哪些
1、表单事件: submit事件 reset事件 click事件 change事件 focus事件(不冒泡) (IE和ES5支持冒泡的focusin) blur事件(不冒泡) (IE和ES5支持冒泡的focusout) input事件&am…...