当前位置: 首页 > news >正文

小华HC32F448串口使用

目录

1. 串口GPIO配置

2. 串口波特率配置

3. 串口接收超时配置

4. 串口中断注册

5. 串口初始化

6. 串口数据接收处理

7. DMA接收配置和处理


1. 串口GPIO配置

端口号和Pin脚号跟STM32没什么区别。

串口复用功能跟STM32大不一样。

如下图,选自HC32F448 表 2-1 引脚功能表。

1)每个管脚都有对应的管脚名称、中断号,以及功能号

2)调试口默认为TRACE/JTAG功能号,若要使能普通GPIO功能则要关闭调试功能

3)非调试口默认功能号为Func0,即普通GPIO功能。Func2到Func11为定时器或时钟功能,Func12为EXMC/TIMA功能

4)Func32~63为通用复用功能-分为两组,对于同一组的IO,可以配置为UART/I2C/SPI/CAN 4组功能,且Rx/Tx可以互换。而不是像STM32那样,每个IO的复用功能是固定的,对应通讯线必须一一选对。

如下,硬件选择了PB0和PA7作为串口通讯脚,可以在FG1任意选择一个可用串口使用。

#define USART_RX_PORT                   (GPIO_PORT_B)   /* PB0: USART2_RX */
#define USART_RX_PIN                    (GPIO_PIN_00)
#define USART_RX_GPIO_FUNC              (GPIO_FUNC_37)
#define USART_TX_PORT                   (GPIO_PORT_A)   /* PA7: USART2_TX */
#define USART_TX_PIN                    (GPIO_PIN_07)
#define USART_TX_GPIO_FUNC              (GPIO_FUNC_36)static void UartGpioConfig(void)
{GPIO_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_GPIO_FUNC);GPIO_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_GPIO_FUNC);
}

2. 串口波特率配置

static void UartBaudConfig(void)
{USART_FCG_ENABLE();stc_usart_uart_init_t stcUartInit;(void)USART_UART_StructInit(&stcUartInit);stcUartInit.u32ClockDiv = USART_CLK_DIV64;stcUartInit.u32CKOutput = USART_CK_OUTPUT_ENABLE;stcUartInit.u32Baudrate = USART_BAUDRATE;stcUartInit.u32OverSampleBit = USART_OVER_SAMPLE_8BIT;USART_UART_Init(USART_UNIT, &stcUartInit, NULL);
}

3. 串口接收超时配置

小华HC32F4串口支持的中断与STM32大有不同:

1)HC32 接收数据寄存器满中断,在收到1个字节时就会触发。等同于STM32的RXNE。名字不同

2)HC32 TIMEOUT中断,等同于STM32的空闲中断 IDLE 。HC32通过关联定时器直接配置超时时间,比STM32更加简便。

定时器Timer0被专门用来做串口的计时器,板子用的串口2,所以定时器要配置Timer0_1 B 。

//串口接收超时设置·关联定时器
#define USART_TIMEOUT_BITS              (5000U)
#define TMR0_UNIT                       (CM_TMR0_1)
#define TMR0_CH                         (TMR0_CH_B)
#define TMR0_FCG_ENABLE()               (FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR0_1, ENABLE))/** TMR0_Config()* 配置串口接收超时
*/
static void TMR0_Config(void)
{uint16_t u16Div;uint16_t u16Delay;uint16_t u16CompareValue;stc_tmr0_init_t stcTmr0Init;TMR0_FCG_ENABLE();/* Initialize TMR0 base function. */stcTmr0Init.u32ClockSrc = TMR0_CLK_SRC_XTAL32;stcTmr0Init.u32ClockDiv = TMR0_CLK_DIV8;stcTmr0Init.u32Func     = TMR0_FUNC_CMP;if (TMR0_CLK_DIV1 == stcTmr0Init.u32ClockDiv) {u16Delay = 7U;} else if (TMR0_CLK_DIV2 == stcTmr0Init.u32ClockDiv) {u16Delay = 5U;} else if ((TMR0_CLK_DIV4 == stcTmr0Init.u32ClockDiv) || \(TMR0_CLK_DIV8 == stcTmr0Init.u32ClockDiv) || \(TMR0_CLK_DIV16 == stcTmr0Init.u32ClockDiv)) {u16Delay = 3U;} else {u16Delay = 2U;}u16Div = (uint16_t)1U << (stcTmr0Init.u32ClockDiv >> TMR0_BCONR_CKDIVA_POS);u16CompareValue = ((USART_TIMEOUT_BITS + u16Div - 1U) / u16Div) - u16Delay;stcTmr0Init.u16CompareValue = u16CompareValue;(void)TMR0_Init(TMR0_UNIT, TMR0_CH, &stcTmr0Init);TMR0_HWStartCondCmd(TMR0_UNIT, TMR0_CH, ENABLE);TMR0_HWClearCondCmd(TMR0_UNIT, TMR0_CH, ENABLE);
}

4. 串口中断注册

#define USART_RX_ERR_IRQn               (INT005_IRQn)
#define USART_RX_ERR_INT_SRC            (INT_SRC_USART2_EI)
#define USART_RX_FULL_IRQn              (INT006_IRQn)
#define USART_RX_FULL_INT_SRC           (INT_SRC_USART2_RI)
#define USART1_RX_TIMEOUT_IRQn          (INT007_IRQn)
#define USART1_RX_TIMEOUT_INT_SRC       (INT_SRC_USART2_RTO)static void USART_RxFull_IrqCallback(void);
static void USART_RxError_IrqCallback(void);
static void USART_RxTimeout_IrqCallback(void);static void RegisterIrq(void)
{stc_irq_signin_config_t stcIrqSigninConfig;/* Register RX full IRQ handler. */stcIrqSigninConfig.enIRQn = USART_RX_FULL_IRQn;stcIrqSigninConfig.enIntSrc = USART_RX_FULL_INT_SRC;stcIrqSigninConfig.pfnCallback = &USART_RxFull_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSigninConfig);NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);NVIC_SetPriority(stcIrqSigninConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);/* Register RX error IRQ handler. */stcIrqSigninConfig.enIRQn = USART_RX_ERR_IRQn;stcIrqSigninConfig.enIntSrc = USART_RX_ERR_INT_SRC;stcIrqSigninConfig.pfnCallback = &USART_RxError_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSigninConfig);NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);NVIC_SetPriority(stcIrqSigninConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);/* Register RX timeout IRQ handler. */stcIrqSigninConfig.enIRQn = USART1_RX_TIMEOUT_IRQn;stcIrqSigninConfig.enIntSrc = USART1_RX_TIMEOUT_INT_SRC;stcIrqSigninConfig.pfnCallback = &USART_RxTimeout_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSigninConfig);NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);NVIC_SetPriority(stcIrqSigninConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);
}

5. 串口初始化

LL_PERIPH_WE() 为打开相应寄存器的写使能

LL_PERIPH_WP() 为关闭相应寄存器的写使能

void UART_Init(void)
{LL_PERIPH_WE(LL_PERIPH_ALL);UartGpioConfig();UartBaudConfig();TMR0_Config();RegisterIrq();LL_PERIPH_WP(LL_PERIPH_ALL);USART_FuncCmd(USART_UNIT, ( USART_TX | USART_RX | USART_INT_RX | USART_RX_TIMEOUT | USART_INT_RX_TIMEOUT), ENABLE);
}

6. 串口数据接收处理

USART_RxFull_IrqCallback 中断 只负责接收和缓存单字节数据,以及递增数据长度 (通过读数据清除标志位)

USART_RxTimeout_IrqCallback 中断 处理超时中断(超时中断触发后必须要关闭定时器,和清除标志位)

USART_RxError_IrqCallback 中断 处理异常错误

static void USART_RxFull_IrqCallback(void)
{uint8_t u8Data = (uint8_t)USART_ReadData(USART_UNIT);if(gps_len < RX_FRAME_LEN_MAX)gps_buf[gps_len++] = u8Data;
}static void USART_RxError_IrqCallback(void)
{(void)USART_ReadData(USART_UNIT);USART_ClearStatus(USART_UNIT, (USART_FLAG_PARITY_ERR | USART_FLAG_FRAME_ERR | USART_FLAG_OVERRUN));
}static void USART_RxTimeout_IrqCallback(void)
{TMR0_Stop(TMR0_UNIT, TMR0_CH);USART_ClearStatus(USART_UNIT, USART_FLAG_RX_TIMEOUT);GpsRxCallBack(gps_buf, gps_len);gps_len = 0;
}

对于GPS、Wifi这类不频繁的数据交互,用到超时中断和接收寄存器满就可以处理数据了。

对于4G/蓝牙等有持续大量数据交互的模块,就需要用到DMA了。

7. 串口数据发送

static int32_t UartSendByte(CM_USART_TypeDef *UART, uint8_t ch)
{uint32_t u32TxEmpty = 0UL;__IO uint32_t u32TmpCount = 0UL;uint32_t u32Timeout = HCLK_VALUE/USART_BAUDRATE;int32_t i32Ret = LL_ERR_INVD_PARAM;/* Wait TX data register empty */while ((u32TmpCount <= u32Timeout) && (0UL == u32TxEmpty)) {u32TxEmpty = READ_REG32_BIT(UART->SR, USART_SR_TXE);u32TmpCount++;}if (0UL != u32TxEmpty) {WRITE_REG16(UART->TDR, ch);i32Ret = LL_OK;} else {i32Ret = LL_ERR_TIMEOUT;}return i32Ret;
}

8. DMA接收配置和处理

DMA配置方式与STM32基本相同:

1)设置DMA源地址和源地址增长类型,设置目的地址和目的地址增长类型

DMA接收属于串口数据寄存器到内存,即源地址固定,目的地址递增

DMA发送属于内存到串口数据寄存器,即源地址递增,目的地址固定

2)设置位宽、传输大小、传输块数


所不同的是,HC32有一个可配置的自动运行系统AOS。

可以配置AOS源和AOS目标.

AOS源可以是DMA传输完成、UART接收数据、定时器上溢和下溢、event电平变化等等。

AOS目标可以是DMA传输、定时器计数、ADC模数转换、event事件等等

如下是DMA初始化配置的参考代码,配置了串口DMA接收和串口DMA发送:

//DMA单元
#define RX_DMA_UNIT                     (CM_DMA1)
//DMA通道号·通道号越小优先级越高
#define RX_DMA_CH                       (DMA_CH0)
//DMA单元时钟
#define RX_DMA_FCG_ENABLE()             (FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA1, ENABLE))
//AOS系统的目标·触发DMA1通道0传输
#define RX_DMA_TRIG_SEL                 (AOS_DMA1_0)
//AOS系统的触发源·接收数据寄存器满中断
#define RX_DMA_TRIG_EVT_SRC             (EVT_SRC_USART1_RI)
//AOS系统的目标·DMA完成中断
#define RX_DMA_RECONF_TRIG_SEL          (AOS_DMA_RC)
//AOS系统的触发源·AOS_STRG中断源
#define RX_DMA_RECONF_TRIG_EVT_SRC      (EVT_SRC_AOS_STRG)
//DMA传输完成中断·通道号1
#define RX_DMA_TC_INT                   (DMA_INT_TC_CH0)
//DMA传输完成标志·通道号2
#define RX_DMA_TC_FLAG                  (DMA_FLAG_TC_CH0)
//DMA传输完成中断号
#define RX_DMA_TC_IRQn                  (INT000_IRQn)
//DMA传输完成中断源
#define RX_DMA_TC_INT_SRC               (INT_SRC_DMA1_TC0)//串口DMA发送配置
#define TX_DMA_UNIT                     (CM_DMA2)
#define TX_DMA_CH                       (DMA_CH0)
#define TX_DMA_FCG_ENABLE()             (FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA2, ENABLE))
#define TX_DMA_TRIG_SEL                 (AOS_DMA2_0)
#define TX_DMA_TRIG_EVT_SRC             (EVT_SRC_USART1_TI)
#define TX_DMA_TC_INT                   (DMA_INT_TC_CH0)
#define TX_DMA_TC_FLAG                  (DMA_FLAG_TC_CH0)
#define TX_DMA_TC_IRQn                  (INT001_IRQn)
#define TX_DMA_TC_INT_SRC               (INT_SRC_DMA2_TC0)/******************************************************************************** Local variable definitions ('static')******************************************************************************/
static __IO en_flag_status_t m_enTxEnd = SET;
static uint8_t m_4gRxBuf[RX_FRAME_LEN_MAX];
static uint8_t *m_auTxBuf = NULL;/******************************************************************************** Local function definitions ('static')******************************************************************************/
static void RX_DMA_TC_IrqCallback(void);
static void TX_DMA_TC_IrqCallback(void);/** DMA_Config()* 配置串口DMA接收和DMA发送
*/
static int32_t DMA_Config(void)
{int32_t i32Ret;stc_dma_init_t stcDmaInit;stc_dma_llp_init_t stcDmaLlpInit;stc_irq_signin_config_t stcIrqSignConfig;static stc_dma_llp_descriptor_t stcLlpDesc;//使能DMA和FCG时钟RX_DMA_FCG_ENABLE();TX_DMA_FCG_ENABLE();FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);/* USART_RX_DMA */(void)DMA_StructInit(&stcDmaInit);stcDmaInit.u32IntEn = DMA_INT_ENABLE;//DMA interrupt enablestcDmaInit.u32BlockSize = 1UL;//DMA block sizestcDmaInit.u32TransCount = ARRAY_SZ(m_4gRxBuf);//DMAbuf大小stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;//DMAbuf位宽stcDmaInit.u32DestAddr = (uint32_t)m_4gRxBuf;//DMAbuf地址stcDmaInit.u32SrcAddr = (uint32_t)(&USART_UNIT->RDR);//由外设到内存的 外设地址 -> 串口数据寄存器stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_FIX;//由外设到内存的 源地址模式 固定stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_INC;//由外设到内存的 目标地址模式 自动递增i32Ret = DMA_Init(RX_DMA_UNIT, RX_DMA_CH, &stcDmaInit);if (LL_OK == i32Ret) {(void)DMA_LlpStructInit(&stcDmaLlpInit);stcDmaLlpInit.u32State = DMA_LLP_ENABLE;stcDmaLlpInit.u32Mode  = DMA_LLP_WAIT;stcDmaLlpInit.u32Addr  = (uint32_t)&stcLlpDesc;(void)DMA_LlpInit(RX_DMA_UNIT, RX_DMA_CH, &stcDmaLlpInit);//初始化DMA链表指针stcLlpDesc.SARx   = stcDmaInit.u32SrcAddr;stcLlpDesc.DARx   = stcDmaInit.u32DestAddr;stcLlpDesc.DTCTLx = (stcDmaInit.u32TransCount << DMA_DTCTL_CNT_POS) | (stcDmaInit.u32BlockSize << DMA_DTCTL_BLKSIZE_POS);;stcLlpDesc.LLPx   = (uint32_t)&stcLlpDesc;stcLlpDesc.CHCTLx = stcDmaInit.u32SrcAddrInc | stcDmaInit.u32DestAddrInc | stcDmaInit.u32DataWidth |  \stcDmaInit.u32IntEn      | stcDmaLlpInit.u32State    | stcDmaLlpInit.u32Mode;DMA_ReconfigLlpCmd(RX_DMA_UNIT, RX_DMA_CH, ENABLE);DMA_ReconfigCmd(RX_DMA_UNIT, ENABLE);AOS_SetTriggerEventSrc(RX_DMA_RECONF_TRIG_SEL, RX_DMA_RECONF_TRIG_EVT_SRC);stcIrqSignConfig.enIntSrc = RX_DMA_TC_INT_SRC;stcIrqSignConfig.enIRQn  = RX_DMA_TC_IRQn;stcIrqSignConfig.pfnCallback = &RX_DMA_TC_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSignConfig);NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);AOS_SetTriggerEventSrc(RX_DMA_TRIG_SEL, RX_DMA_TRIG_EVT_SRC);DMA_Cmd(RX_DMA_UNIT, ENABLE);DMA_TransCompleteIntCmd(RX_DMA_UNIT, RX_DMA_TC_INT, ENABLE);(void)DMA_ChCmd(RX_DMA_UNIT, RX_DMA_CH, ENABLE);}(void)DMA_StructInit(&stcDmaInit);stcDmaInit.u32IntEn = DMA_INT_ENABLE;stcDmaInit.u32BlockSize = 1UL;stcDmaInit.u32TransCount = ARRAY_SZ(m_4gRxBuf);stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;stcDmaInit.u32DestAddr = (uint32_t)(&USART_UNIT->TDR);stcDmaInit.u32SrcAddr = (uint32_t)m_4gRxBuf;stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;i32Ret = DMA_Init(TX_DMA_UNIT, TX_DMA_CH, &stcDmaInit);if (LL_OK == i32Ret){stcIrqSignConfig.enIntSrc = TX_DMA_TC_INT_SRC;stcIrqSignConfig.enIRQn  = TX_DMA_TC_IRQn;stcIrqSignConfig.pfnCallback = &TX_DMA_TC_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSignConfig);NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);AOS_SetTriggerEventSrc(TX_DMA_TRIG_SEL, TX_DMA_TRIG_EVT_SRC);DMA_Cmd(TX_DMA_UNIT, ENABLE);DMA_TransCompleteIntCmd(TX_DMA_UNIT, TX_DMA_TC_INT, ENABLE);}return i32Ret;
}

如下是DMA接收处理代码:

1)USART_RxTimeout_IrqCallback

重启AOS系统

关闭串口超时定时器,清除串口超时标志位。

处理DMA接收数据。

2)RX_DMA_TC_IrqCallback

即接收完成中断

硬件上需要清除中断标志位

3)USART_TxComplete_IrqCallback

即串口发送完成中断

硬件上需要清除标志位,一般要失能发送中断

//串口接收超时中断
static void USART_RxTimeout_IrqCallback(void)
{uint16_t unLen = RX_FRAME_LEN_MAX - (uint16_t)DMA_GetTransCount(RX_DMA_UNIT, RX_DMA_CH);AOS_SW_Trigger();TMR0_Stop(TMR0_UNIT, TMR0_CH);USART_ClearStatus(USART_UNIT, USART_FLAG_RX_TIMEOUT);if(unLen != 0 && unLen != RX_FRAME_LEN_MAX)DtuRxCallBack(m_4gRxBuf, unLen);
}//串口DMA接收·传输完成中断
static void RX_DMA_TC_IrqCallback(void)
{DtuRxCallBack(m_4gRxBuf, RX_FRAME_LEN_MAX);DMA_ClearTransCompleteStatus(RX_DMA_UNIT, RX_DMA_TC_FLAG);
}//串口发送完成中断
static void USART_TxComplete_IrqCallback(void)
{m_enTxEnd = SET;DtuTxCallBack(m_auTxBuf);USART_FuncCmd(USART_UNIT, (USART_TX | USART_INT_TX_CPLT), DISABLE);USART_ClearStatus(USART_UNIT, USART_FLAG_TX_CPLT);
}//串口接收错误中断
static void USART_RxError_IrqCallback(void)
{(void)USART_ReadData(USART_UNIT);USART_ClearStatus(USART_UNIT, (USART_FLAG_PARITY_ERR | USART_FLAG_FRAME_ERR | USART_FLAG_OVERRUN));
}//串口DMA发送·传输完成中断
static void TX_DMA_TC_IrqCallback(void)
{USART_FuncCmd(USART_UNIT, USART_INT_TX_CPLT, ENABLE);DMA_ClearTransCompleteStatus(TX_DMA_UNIT, TX_DMA_TC_FLAG);
}

9. DMA发送

//串口DMA发送
void DtuDMASend(uint8_t *pBuf, uint16_t u16TxLen)
{
#if 0 //串口发送数据打印printf("Tx: ");for(uint16_t i = 0; i < u16TxLen; i++){printf("%02X",pBuf[i]);}printf("\r\n");
#endif//等待上一包发完while(m_enTxEnd == RESET);m_enTxEnd = RESET;m_auTxBuf = pBuf;//启动DMA传输DMA_SetSrcAddr(TX_DMA_UNIT, TX_DMA_CH, (uint32_t)pBuf);DMA_SetTransCount(TX_DMA_UNIT, TX_DMA_CH, u16TxLen);(void)DMA_ChCmd(TX_DMA_UNIT, TX_DMA_CH, ENABLE);USART_FuncCmd(USART_UNIT, USART_TX, ENABLE);
}

相关文章:

小华HC32F448串口使用

目录 1. 串口GPIO配置 2. 串口波特率配置 3. 串口接收超时配置 4. 串口中断注册 5. 串口初始化 6. 串口数据接收处理 7. DMA接收配置和处理 1. 串口GPIO配置 端口号和Pin脚号跟STM32没什么区别。 串口复用功能跟STM32大不一样。 如下图&#xff0c;选自HC32F448 表 2…...

Redis实现简易消息队列的三种方式

Redis实现简易消息队列的三种方式 消息队列简介 消息队列是一种用于在计算机系统中传递和处理数据的重要工具。如果你完全不了解消息队列&#xff0c;不用担心&#xff0c;我将尽力以简单明了的方式来解释它。 首先&#xff0c;想象一下你正在玩一个游戏&#xff0c;而游戏中…...

基于SpringBoot的在线小说阅读平台系统

基于SpringBoot的在线小说阅读平台系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 个人中心 登录界面 管理员界面 摘要 基于Spring Boot的在线小说阅读…...

VMware Workstation 与 Hyper-V 不兼容。请先从系统中移除 Hyper-V 角色

引用地址...

uniapp h5 MD5加密

文章目录 1.当使用 CryptoJS 进行 MD5 加密时&#xff0c;你需要先引入 CryptoJS 库并确保它已经正确安装。下面是一个更详细的示例代码&#xff1a;2.然后&#xff0c;在需要使用 MD5 加密的地方&#xff0c;引入 CryptoJS 代码库&#xff1a;3.接下来&#xff0c;我们定义一个…...

2023_Spark_实验十八:安装FinalShell

下载安装包 链接&#xff1a;https://pan.baidu.com/s/14cOJDcezzuwUYowPsOA-sg?pwd6htc 提取码&#xff1a;6htc 下载文件名称&#xff1a;FinalShell.zip 二、安装 三、启动FinalShell 四、连接远程 linux 服务器 先确保linux系统已经开启&#xff0c;不然连接不上 左边…...

文件服务器管理服务器怎么设置

文件服务器是一种提供文件存储和共享服务的服务器&#xff0c;它可以方便企业内部的员工共享文件&#xff0c;提高工作效率。为了更好地管理和维护文件服务器&#xff0c;需要对其进行合理的设置。下面小编将介绍文件服务器管理服务器的基本设置方法。 一、选择合适的操作系统 …...

LeetCode每日一题——Single Number

文章目录 一、题目二、题解 一、题目 136. Single Number Given a non-empty array of integers nums, every element appears twice except for one. Find that single one. You must implement a solution with a linear runtime complexity and use only constant extra …...

有什么手机软件能分离人声和音乐?

很多人在制作混剪视频&#xff0c;需要二次创作的时候&#xff0c;就经常会把人声分离、背景音乐伴奏提取出来&#xff0c;然后重新加入自己的创意跟想法。下面就一起来看看如何用手机软件分离人声和音乐的吧&#xff01; 音分轨 一款可以分离人声和背景音乐的手机软件&#x…...

私人服务器可以干嘛

目录 搭建个人网站或博客&#xff1a; 远程桌面&#xff1a; 作为网盘储存&#xff1a; 作为测试和学习环境&#xff1a; 推广产品&#xff1a; 游戏私服(注意,仅限于个人自己单机玩)&#xff1a; 个人服务器可以用于多种用途&#xff0c;以下是一些常见的用途&#xff1a;…...

【EI会议征稿】第三届高性能计算与通信工程国际学术会议(HPCCE 2023)

第三届高性能计算与通信工程国际学术会议(HPCCE 2023) 第三届高性能计算与通信工程国际学术会议&#xff08;HPCCE 2023&#xff09;将于2023年12月22-24日在长沙召开。HPCCE 2023将围绕“高性能计算与通信工程”的最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、…...

项目管理,如何做到流程标准化?

在PMP管理学习规范化、标准化和流程化的背景下&#xff0c;我们在日常工作中会遇到各种大小不一的工作项目。为了能够确保项目按时高质量地完成&#xff0c;项目管理变得至关重要。项目管理可以简单地解释为&#xff0c;在给定的时间和资源限制下&#xff0c;通过协调有限资源&…...

windows编译ollvm笔记

准备工作 1.找到Android SDK目录配置好cmake环境变量 E:\AndroidSDK\cmake\3.18.1&#xff08;E:\AndroidSDK为 Android SDK目录地址&#xff09;。 下载llvm-mingw编译环境(gcc编译器的windows版本&#xff0c;即可以在windows平台上使用gcc编译器)&#xff0c;下载地址&…...

问:TCP/IP协议栈在内核态的好还是用户态的好

“TCP/IP协议栈到底是内核态的好还是用户态的好&#xff1f;” 问题的根源在于&#xff0c;干嘛非要这么刻意地去区分什么内核态和用户态。 引子 为了不让本文成为干巴巴的说教&#xff0c;在文章开头&#xff0c;我以一个实例分析开始。 最近一段时间&#xff0c;我几乎每…...

JavaScript-Vue基础语法-创建-组件-路由

文章目录 1.创建vue项目1.1.自定义创建项目1.2.项目结构解析1.3.主要文件1.4.其它 2.项目运行3.Vue组件概念3.1.组件基础概念3.2.单文件组件三要素3.3.组件注册3.4.组件通信 4.Vue路由概念4.1.简单使用4.2.路由参数4.3.嵌套路由4.4.路由导航4.5.代码导航4.6.路由守卫 5.总结 HT…...

前端开发中的 TypeScript 泛型:深入解析

前端开发中的 TypeScript 泛型&#xff1a;深入解析 TypeScript&#xff08;简称 TS&#xff09;是一种由微软开发的强类型超集 JavaScript 语言&#xff0c;它为前端开发者提供了更严格的类型检查和更强大的工具支持。其中&#xff0c;泛型是 TypeScript 中的一个强大概念&am…...

06-spring的beanFactoryPostProcessor的执行

文章目录 1. 接口BeanFactoryPostProcessor1.1 英文说明及要点2. BeanDefinitionRegistryPostProcessor3. 执行逻辑4. 几个重要实现类1. 接口BeanFactoryPostProcessor 1.1 英文说明及要点 Factory hook that allows for custom modification of an application context’s b…...

想要精通算法和SQL的成长之路 - 分割数组的最大值

想要精通算法和SQL的成长之路 - 分割数组的最大值 前言一. 分割数组的最大值1.1 二分法 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 分割数组的最大值 原题链接 首先面对这个题目&#xff0c;我们可以捕获几个关键词&#xff1a; 非负整数。非空连续子数组。 那么我…...

【深度学习】【Opencv】【GPU】python/C++调用onnx模型【基础】

【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】前言Python版本OpenCVWindows平台安装OpenCVopencv调用onnx模型 C版本…...

Oracle update 关联更新优化方法

关联更新顾名思义就是指&#xff0c;更新的数据从关联的表中获取并update到目标表。并且该SQL将会是一个天然的嵌套循环。有两种优化思路解决&#xff1a; 1、PLSQL 根据rowid更新 是否需要加order by rowid的考量&#xff1a; 如果buffer cache足够大&#xff0c;能够放得下要…...

USB协议学习(一)帧格式以及协议抓取

USB协议学习&#xff08;一&#xff09;帧格式以及协议抓取 笔者来聊聊MPU的理解 这里写自定义目录标题 USB协议学习&#xff08;一&#xff09;帧格式以及协议抓取MPU的概念以及作用MPU的配置新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式…...

前端工程化知识系列(8)

目录 71.你有经验使用TypeScript或Flow等类型检查工具来提高前端代码的可维护性和质量吗&#xff1f;72. 如何处理前端应用的搜索引擎优化&#xff08;SEO&#xff09;问题&#xff0c;特别是在单页面应用&#xff08;SPA&#xff09;中&#xff1f;73. 你了解渐进式Web应用&am…...

UnrealEngine iOS 打包 —— 签名证书(cer、p12)生成

官方文档 docs.unrealengine.com/5.3/zh-CN/setting-up-ios-tvos-and-ipados-provisioning-profiles-and-signing-certificates-for-unreal-engine-projects 打开 ProjectSettings -> Platforms -> iOS 可以看到签名证书配置 需要拓展名为 .cer 和 .p12 的一对证书和密钥…...

【广州华锐互动】VR高层火灾应急疏散演练提供一种无风险的逃生体验

在科技进步的今天&#xff0c;我们已经能够利用虚拟现实&#xff08;VR&#xff09;技术来模拟各种紧急情况&#xff0c;其中就包括高楼火灾逃生。VR高层火灾应急疏散演练系统是一种新兴的技术&#xff0c;它使用虚拟现实环境来模拟高楼火灾的实际情况&#xff0c;为人们提供一…...

定档通知2024中国(上海)国际品牌叉车展览会

时 间&#xff1a;2024年7月24&#xff5e;26日 地 点&#xff1a;上海国家会展中心 ◆ 》》》展会概况&#xff1a; 叉车在“搬运设备”中扮演着非常重要的角色&#xff0c;是机械化装卸、堆垛和短距离运输的高效设备。近年来&#xff0c;在“节能环保&#xff0c…...

Ubuntu编译安装colmap遇到的几个问题以及解决

总体安装过程已经很明白了&#xff0c;写的人很多了&#xff0c;我就不赘述了&#xff0c;可以参考这里或者其他博客。我主要记录几个我遇到的问题以及解决方法。 1、cmake报错&#xff1a;No CMAKE_CUDA_COMPILER could be found. 这个原因是没找到cuda和nvcc目录&#xff0…...

【Qt上位机】打开本地表格文件并获取其中全部数据

前言 其实本文所实现的功能并非博主要实现的全部功能&#xff0c;只是全部功能中的一小部分&#xff0c;这里只是为了记录一下实现方法&#xff0c;防止后续忘记&#xff0c;仅供参考。 文章目录 一、实现效果二、UI设计三、程序设计3.1 选择本地表格文件3.2 获取表格总行列数3…...

香港服务器选纯国际线路上网稳定吗?

​  关于香港服务器的线路&#xff0c;我们平时接触较多的分三大类&#xff0c;即纯国际线路、回国专线和香港本地线路。三者价格上存有差距&#xff0c;原因体现在线路和网络质量上&#xff0c;当然这些会关系到服务器的速度和稳定性。譬如&#xff0c;有些用户在选择了纯国…...

USB PD3.1

目前我们大多数Type-C接口仍然采用的是PD3.0快充协议&#xff0c;按当前用户的使用场景来看功率也完全够用&#xff0c;那么PD3.1快充协议是什么&#xff1f;USB PD3.1到底有没有必要&#xff1f; 不妨我们先了解一下PD3.1: 5月25日&#xff0c;USB-IF协会推出了USB Type-C线…...

unity面试八股文 - 基础篇

委托是什么? event 关键字有什么用&#xff1f; 委托&#xff1a; 委托是一种特殊类型的对象&#xff0c;它包含了对一个方法的引用。简单来说&#xff0c;委托就像是一个安全的函数指针。它允许我们创建可在运行时动态更改其引用方法的变量&#xff0c;并且可以指向类中定义…...

wordpress hack 主题/郑州seo管理

这是一份精美的PPT模板设计&#xff0c;采用马卡龙配色&#xff0c;整体简约&#xff0c;并且带上了粉红的小女风&#xff0c;一份设计精美的PPT模板&#xff0c;可以让你在汇报演讲时脱颖而出&#xff0c; 模板格式&#xff1a;pptx格式&#xff08;可随意下载编辑&#xff0…...

网站做可信认证多少钱/国家高新技术企业查询

进程原语和线程原语是啥意思本文向您展示如何将WebSphere ESB StockQuote样本&#xff08;IBM Integration Designer随附&#xff09;中的资源转换为IBM Integration Bus资源。 StockQuote示例使用带有SOAP / JMS Web服务绑定的导出。 由StockQuote中介流记录输入的JMS消息&…...

汕头政务发布/网站怎么优化

如今&#xff0c;使用Android等技术以及许多智能手机应用程序&#xff0c;计算机应用程序变得更加复杂&#xff0c;前端越复杂&#xff0c;后端就越复杂。 因此&#xff0c;了解数据库测试、有效地验证数据库&#xff0c;以确保数据库的安全性和质量就显得尤为重要。 在本文中…...

注册网页需要多少钱/seo就业前景

燕十八-PHP公益培训-YY直播-001-开学典礼.wmv燕十八-PHP公益培训-YY直播-002-变量概念及命名规范.wmv燕十八-PHP公益培训-YY直播-003-变量类型.wmv燕十八-PHP公益培训-YY直播-004-动态变量及变量类型检测.wmv燕十八-PHP公益培训-YY直播-005-传值赋值与引用赋值.wmv燕十八-PHP公…...

勉费申请做网站/关键词搜索神器

关于Spring中基于xml文件配置bean的详细总结&#xff08;spring 4.1.0&#xff09; 一、Spring中的依赖注入方式介绍 依赖注入有三种方式 属性注入构造方法注入工厂方法注入&#xff08;很少使用&#xff0c;不推荐&#xff0c;本文不再介绍&#xff09;属性注入 通过 setter…...

商城网站建设哪家好/百度seo关键词排名推荐

文章目录散点图matplotlib绘制散点图seaborn绘制散点图pyecharts绘制散点图源码地址本文可以学习到以下内容&#xff1a;matplotlib 中文乱码解决办法seaborn 中文乱码解决办法seaborn 库csv数据下载地址用matplotlib、seaborn、pyecharts绘制散点图 散点图 小凡在做数据分析的…...