小华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大不一样。 如下图,选自HC32F448 表 2…...

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

基于SpringBoot的在线小说阅读平台系统
基于SpringBoot的在线小说阅读平台系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 个人中心 登录界面 管理员界面 摘要 基于Spring Boot的在线小说阅读…...
uniapp h5 MD5加密
文章目录 1.当使用 CryptoJS 进行 MD5 加密时,你需要先引入 CryptoJS 库并确保它已经正确安装。下面是一个更详细的示例代码:2.然后,在需要使用 MD5 加密的地方,引入 CryptoJS 代码库:3.接下来,我们定义一个…...

2023_Spark_实验十八:安装FinalShell
下载安装包 链接:https://pan.baidu.com/s/14cOJDcezzuwUYowPsOA-sg?pwd6htc 提取码:6htc 下载文件名称:FinalShell.zip 二、安装 三、启动FinalShell 四、连接远程 linux 服务器 先确保linux系统已经开启,不然连接不上 左边…...
文件服务器管理服务器怎么设置
文件服务器是一种提供文件存储和共享服务的服务器,它可以方便企业内部的员工共享文件,提高工作效率。为了更好地管理和维护文件服务器,需要对其进行合理的设置。下面小编将介绍文件服务器管理服务器的基本设置方法。 一、选择合适的操作系统 …...
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 …...

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

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

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

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

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

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

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 泛型:深入解析 TypeScript(简称 TS)是一种由微软开发的强类型超集 JavaScript 语言,它为前端开发者提供了更严格的类型检查和更强大的工具支持。其中,泛型是 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的成长之路 - 系列导航 一. 分割数组的最大值 原题链接 首先面对这个题目,我们可以捕获几个关键词: 非负整数。非空连续子数组。 那么我…...

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

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

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...