GPT对话代码库——HAL库下 USART 的配置及问题(STM32G431CBT6)

目录

1,问:

1,答:

示例代码

正确的HAL库初始化方式

自定义初始化方式(不推荐)

总结

2,问:

2,答:

代码详细解释

初始部分

主初始化部分

初始化调用

FIFO阈值设置和FIFO模式禁用

结尾部分

特定代码的作用

1. huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;

2. huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;

3. huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

总结

3,问:

3,答:

HAL_UART_MspInit 函数

HAL_UART_MspDeInit 函数

总结


提问模型:GPT-4o-Free

提问时间:2024.07.01

1,问:

为什么一定要在HAL_UART_MspInit中配置GPIO引脚,不能自己创建一个函数吗

1,答:

在STM32 HAL库的框架下,HAL_UART_MspInit函数是专门用于配置UART外设的相关资源的,包括GPIO引脚、时钟和中断。这是一个约定俗成的机制,旨在确保外设的初始化过程清晰、有序且易于维护。虽然你可以创建自己的函数来配置这些资源,但在HAL_UART_MspInit中配置GPIO引脚有几个重要原因:

  1. HAL库的设计规范

    • HAL库在初始化UART外设时,会自动调用相应的MspInit函数,比如HAL_UART_MspInit。这是库设计的一部分,确保所有外设的初始化步骤都集中管理,不会遗漏任何必要的配置。
  2. 代码的可维护性和一致性

    • 使用HAL库提供的MspInit函数,可以保持代码的一致性,使得所有外设的初始化过程都遵循同样的模式,方便阅读和维护。
    • 开发团队或后续开发者可以快速理解和修改代码,而不需要查找自定义的初始化函数。
  3. 防止遗漏关键步骤

    • HAL_UART_MspInit不仅用于配置GPIO引脚,还用于启用时钟、配置中断等。如果在其他地方进行这些配置,可能会遗漏某些步骤,导致外设无法正常工作。
  4. 分离硬件相关配置和业务逻辑

    • 将硬件相关的配置(如GPIO、时钟、中断)集中在MspInit函数中,可以使业务逻辑与硬件配置分离,增强代码的模块化和可移植性。
  5. 自动调用机制

    • 当调用HAL_UART_Init时,HAL库会自动调用HAL_UART_MspInit。如果配置散落在其他自定义函数中,这种自动调用机制将失效,必须手动确保所有初始化步骤都已执行,增加了出错的可能性。

示例代码

正确的HAL库初始化方式
void HAL_UART_MspInit(UART_HandleTypeDef* huart) {GPIO_InitTypeDef GPIO_InitStruct = {0};if(huart->Instance == USART2) {__HAL_RCC_USART2_CLK_ENABLE();  // 使能USART2时钟__HAL_RCC_GPIOA_CLK_ENABLE();  // 使能GPIOA时钟/**USART2 GPIO ConfigurationPA2     ------> USART2_TXPA3     ------> USART2_RX*/GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_USART2;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// USART2中断配置(如果需要)HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART2_IRQn);}
}
自定义初始化方式(不推荐)

虽然你可以创建一个自定义函数,但这不符合HAL库的最佳实践:

void My_UART_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_USART2_CLK_ENABLE();  // 使能USART2时钟__HAL_RCC_GPIOA_CLK_ENABLE();  // 使能GPIOA时钟/**USART2 GPIO ConfigurationPA2     ------> USART2_TXPA3     ------> USART2_RX*/GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_USART2;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// USART2中断配置(如果需要)HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART2_IRQn);
}// 然后在初始化UART时手动调用这个函数
void USART2_Init(void) {huart2.Instance = USART2;huart2.Init.BaudRate = 9600;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;My_UART_Init();  // 手动调用自定义的初始化函数if (HAL_UART_Init(&huart2) != HAL_OK) {// 初始化错误处理Error_Handler();}
}

总结

虽然你可以自己创建一个函数来配置GPIO引脚,但遵循HAL库的规范使用HAL_UART_MspInit进行配置,可以提高代码的可维护性、一致性和可靠性,避免遗漏重要的配置步骤。这种方法确保了代码的模块化和可读性,尤其在团队开发和长期维护中具有明显的优势。

2,问:

void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */

  /* USER CODE END USART1_Init 2 */

}
详细解释这段代码
并且说明这几句的作用
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

2,答:

这段代码是用来初始化STM32微控制器上的USART1外设的。它使用了HAL库提供的API来配置USART1的各种参数。下面是对这段代码的详细解释,以及对指定几句的作用说明。

代码详细解释

初始部分
void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */

这些部分是用户代码的插入点,可以在这些地方添加用户定义的代码,通常用于初始化前的预处理和初始化后的后处理。

主初始化部分
  huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

这些代码设置了USART1的各种初始化参数:

  • huart1.Instance = USART1;:指定要初始化的USART外设实例为USART1。
  • huart1.Init.BaudRate = 115200;:设置波特率为115200。
  • huart1.Init.WordLength = UART_WORDLENGTH_8B;:设置数据字长度为8位。
  • huart1.Init.StopBits = UART_STOPBITS_1;:设置停止位为1位。
  • huart1.Init.Parity = UART_PARITY_NONE;:设置无奇偶校验。
  • huart1.Init.Mode = UART_MODE_TX_RX;:设置工作模式为收发模式。
  • huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;:设置无硬件流控制。
  • huart1.Init.OverSampling = UART_OVERSAMPLING_16;:设置过采样为16倍。
  • huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;:禁用单比特采样。
  • huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;:设置时钟预分频器为1。
  • huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;:不初始化高级特性。

 

初始化调用
  if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}

调用HAL库的HAL_UART_Init函数来初始化USART1。如果初始化失败,调用Error_Handler处理错误。

FIFO阈值设置和FIFO模式禁用
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK){Error_Handler();}

这些代码进一步配置USART1的FIFO设置:

  • HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8):设置发送FIFO的阈值为1/8。
  • HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8):设置接收FIFO的阈值为1/8。
  • HAL_UARTEx_DisableFifoMode(&huart1):禁用FIFO模式。

 

结尾部分
  /* USER CODE BEGIN USART1_Init 2 *//* USER CODE END USART1_Init 2 */
}

这些部分是用户代码的插入点,可以在这些地方添加用户定义的代码,通常用于初始化后的后处理。

特定代码的作用

1. huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;

这一行代码禁用单比特采样模式。单比特采样模式用于在低速率下减少误码率,通过多次采样决定一个比特的值。禁用它表示系统在正常的单次采样模式下工作。

2. huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;

这一行代码设置时钟预分频器为1。这意味着输入时钟直接用于UART,不进行任何分频。预分频器可以用来调整UART时钟以匹配不同的波特率要求。

3. huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

这一行代码表示不初始化任何高级特性。UART的高级特性可能包括自动波特率检测、数据反转、MSB/LSB优先级选择等。这行代码禁用这些特性,保持UART的基本配置。

 

总结

这段代码配置了STM32的USART1外设,设置了波特率、数据长度、停止位、奇偶校验、工作模式、硬件流控制、过采样率、FIFO设置等参数。通过调用HAL_UART_Init等函数,确保USART1能够按照指定配置正常工作。

3,问:

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  if(uartHandle->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */

  /** Initializes the peripherals clocks
  */
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
    PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      Error_Handler();
    }

    /* USART1 clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{

  if(uartHandle->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspDeInit 0 */

  /* USER CODE END USART1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_USART1_CLK_DISABLE();

    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

    /* USART1 interrupt Deinit */
    HAL_NVIC_DisableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspDeInit 1 */

  /* USER CODE END USART1_MspDeInit 1 */
  }
}
详细解释这段代码

 

3,答:

这段代码包含了两个函数:HAL_UART_MspInit 和 HAL_UART_MspDeInit,分别用于初始化和反初始化USART1的相关硬件资源。这些函数通常在使用HAL库进行外设初始化和反初始化时被自动调用。下面是对这段代码的详细解释。

HAL_UART_MspInit 函数

HAL_UART_MspInit函数用于配置USART1的相关硬件资源,包括时钟、GPIO引脚和中断。

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//** Initializes the peripherals clocks*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
  • 时钟配置
    • 设置外设时钟的选择。PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1 表示选择USART1的外设时钟。
    • 设置USART1的时钟源为PCLK2。PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2
    • 调用HAL_RCCEx_PeriphCLKConfig函数应用时钟配置。如果配置失败,调用Error_Handler处理错误。
/* USART1 clock enable */ 
__HAL_RCC_USART1_CLK_ENABLE();
  • 使能USART1时钟:调用__HAL_RCC_USART1_CLK_ENABLE函数使能USART1外设的时钟。
    __HAL_RCC_GPIOA_CLK_ENABLE();/**USART1 GPIO ConfigurationPA9     ------> USART1_TXPA10     ------> USART1_RX*/GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  • 使能GPIOA时钟:调用__HAL_RCC_GPIOA_CLK_ENABLE函数使能GPIOA端口的时钟。
  • 配置GPIO引脚
    • 设置GPIO引脚9和10为USART1的TX和RX功能。
    • 设置GPIO模式为复用推挽输出(GPIO_MODE_AF_PP)。
    • 设置引脚不上拉(GPIO_NOPULL)。
    • 设置引脚速度为低速(GPIO_SPEED_FREQ_LOW)。
    • 设置引脚的复用功能为USART1(GPIO_AF7_USART1)。
    • 调用HAL_GPIO_Init函数应用GPIO配置。
    /* USART1 interrupt Init */HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);
  • USART1中断配置
    • 设置USART1中断的优先级为0。
    • 启用USART1中断。
  /* USER CODE BEGIN USART1_MspInit 1 *//* USER CODE END USART1_MspInit 1 */}
}
  • 用户代码插入点:这些部分是用户代码的插入点,可以在这些地方添加自定义代码,以便在初始化过程中执行额外的操作。

HAL_UART_MspDeInit 函数

HAL_UART_MspDeInit函数用于反初始化USART1的相关硬件资源,包括时钟、GPIO引脚和中断。

void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspDeInit 0 *//* USER CODE END USART1_MspDeInit 0 */
  • 条件判断:检查传入的uartHandle实例是否为USART1。
    /* Peripheral clock disable */__HAL_RCC_USART1_CLK_DISABLE();
  • 关闭USART1时钟:调用__HAL_RCC_USART1_CLK_DISABLE函数关闭USART1外设的时钟。
    /**USART1 GPIO ConfigurationPA9     ------> USART1_TXPA10     ------> USART1_RX*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
  • 反初始化GPIO引脚:调用HAL_GPIO_DeInit函数反初始化GPIO引脚9和10,将其配置恢复到复位状态。
    /* USART1 interrupt Deinit */HAL_NVIC_DisableIRQ(USART1_IRQn);
  • 禁用USART1中断:调用HAL_NVIC_DisableIRQ函数禁用USART1中断。
  /* USER CODE BEGIN USART1_MspDeInit 1 *//* USER CODE END USART1_MspDeInit 1 */}
}
  • 用户代码插入点:这些部分是用户代码的插入点,可以在这些地方添加自定义代码,以便在反初始化过程中执行额外的操作。

总结

  • HAL_UART_MspInit函数用于初始化USART1的相关硬件资源,包括时钟、GPIO引脚和中断。
  • HAL_UART_MspDeInit函数用于反初始化USART1的相关硬件资源,将其配置恢复到复位状态。
  • 使用这些函数可以确保外设的硬件资源在初始化和反初始化过程中得到正确配置和释放,从而保证系统的正常运行和资源管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT学习积累——如何提高Qt遍历list的效率

目录 引出Qt遍历list提高效率显示函数的调用使用&与不使用&除法的一个坑 总结自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重载带参数的按钮触发信号触发信号拓展 lambda表达式返回值mutable修饰案例 引出 QT学习积累——如何提高Qt遍历list…

python 操作网页

使用selenium库获取网页元素的属性值是一个常见的需求。以下是一个Python代码示例,展示了如何使用selenium来获取一个链接的href属性以及一个输入框的value属性。 首先,请确保您已经安装了selenium库,并且配置了WebDriver(如ChromeDriver)以驱动浏览器。 pythonfrom sele…

如何避免Java中的内存泄漏?

如何避免Java中的内存泄漏? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java开发中,内存泄漏(Memory Leak&#xff0…

CSF视频文件格式转换WMV格式(2024年可用)

如果大家看过一些高校教学讲解视频的话,很可能见过这样一个难得的格式,".csf ",非常漂亮 。 用暴风影音都可以打开观看,会自动下载解码。 但是一旦我们想要利用或者上传视频的时候就麻烦了,一般网站不认这…

STM32重定向printf到串口(重写fputc不生效)

使用STM32开发,想用printf把输出打印到串口,需要重定向printf函数。 网上一搜全都是重写fpuc的,但这只针对使用了MicroLIB的情况,如果你使用STM32CubeMX配置了CMake或者Makefile项目,这种方法是根本不可行的&#xff0…

为什么PS5运行游戏的效果往往比号称更强大的Xbox Series X更好?

在第九代游戏机即将进入第四个年头之际,有一个问题仍未得到解答:索尼的 PS5 游戏机的性能如何经常超越纸面性能更强大的微软 Xbox X 系列? 几个明显的例子包括《生化危机 4》、《使命召唤:黑色行动:冷战》和新一代更新…

【支撑文档】系统安全保证措施(word原件)

软件安全保证措施word 软件所有全套资料获取进主页或者本文末个人名片直接。

跨平台营销的智能协同:Kompas.ai如何整合多渠道策略

引言 在数字化营销的今天,消费者的注意力分散在多个平台上。品牌要想有效地吸引和保持消费者的关注,就必须采取跨平台营销策略。Kompas.ai,作为一款智能营销工具,能够帮助品牌实现这一目标。 跨平台营销的重要性 跨平台营销能够…

智慧园区大数据云平台建设方案(Word原件)

第一章 项目建设背景及现状 第二章 园区创新发展趋势 第三章 工业园区大数据存在的问题 第四章 智慧工业园区大数据建设目的 第五章 智慧园区总体构架 第六章 系统核心组件 第七章 智慧工业园区大数据平台规划设计 获取方式:本文末个人名片直接获取。 软件资料清单…

【报错】安装clang-14 的时候,报错E: 无法定位软件包 clang-14

1 报错 安装clang-14,命令如下: sudo apt-get install clang-14 报错为E: 无法定位软件包 clang-14 2 解决方法 使用其他的安装方法,命令如下: wget https://apt.llvm.org/llvm.sh # 添加权限chmod +x llvm.shsudo ./llvm.sh 14 all # 卸载第3步安装过程中安装无用的…

mysql 获取枚举的随机值

mysql 获取枚举的随机值 1.需求描述2.使用到的函数elt函数语法示例 RAND() 函数FLOOR()函数 3.解决方案手写生成:少量数据从表中生成:多数据 4.实战 1.需求描述 在MySQL中,您可以使用ENUM类型定义列,并且可以从中选择随机值。但是…

超融合服务器挂载硬盘--linux系统

项目中需要增加服务器的硬盘容量,通过超融合挂载了硬盘后,还需要添加到指定的路径下,这里记录一下操作步骤。 一:通过管理界面挂载硬盘 这一步都是界面操作,登录超融合控制云台后,找到对应的服务器&#…

uniapp中实现跳转到外部链接(也就是a标签的功能)

uniapp中实现跳转到外部链接(也就是a标签的功能) 项目中需要做到跳转到外部链接,网上找了很多都不是很符合自己的要求,需要编译成app后是跳转到游览器打开链接,编译成web是在新窗口打开链接。实现的代码如下&#xff1…

矩阵、混剪、大盘,3大功能升级优化!助力企业高效管理!

在数字化转型的浪潮中,企业对于工具与技术的需求愈发强烈。 为满足市场需求,本月【云略】为各企业上线了便捷功能,赋能企业经营决策和业务增长。 矩阵管理 √【矩阵号管理】抖音支持设置城市IP 内容管理 √【混剪任务】支持关联智能发布计…

PDF文档如何统计字数,统计PDF文档字数的方法有哪些?

在平时使用pdf阅读或者是处理文档的时候,常常需要统计文档的字数。pdf在查看文字时其实很简单。 PDF文档是一种常见的电子文档格式,如果需要对PDF文档中的字数进行统计,可以使用以下方法: Adobe Acrobat DC:Adobe Ac…

AI大模型,爆发了

随着ChatGPT用户增速放缓,AI创业公司马太效应加剧,第一轮AI投资热潮逐渐褪去,AI大模型进入“冷静期”。擅长后发制人的腾讯,姗姗来迟,推出了混元大模型,为这一轮AI热潮画上了句号。 AI大模型,开…

Windows安装adb服务/离线安装adb服务

1、问题概述? Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具,主要是 adb 和 fastboot。 最近在从事手机app自动化测试,使用到了abd这个服务器,通过adb这个服务,我们可以识别加载Android系统,并执行相对应的操作如:查询…

OpenHarmony开发实战:GPIO控制器接口

功能简介 GPIO(General-purpose input/output)即通用型输入输出。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个或多个寄存器与之关联,通过读写寄存器完成对GPIO管脚的操作。 GPIO接口定义了操作GP…

Langchain-Chatchat本地部署记录,三分钟学会!

1.前言: 最近AI爆发式的火,忆往昔尤记得16,17那会移动互联网是特别火热的,也造富了一批公司和个人,出来了很多精妙的app应用。现在轮到AI发力了,想想自己也应该参与到这场时代的浪潮之中,所以就找了开源的…

【微服务网关——https与http2代理实现】

1.https与http2代理 1.1 重新认识https与http2 https是http安全版本http2是一种传输协议两者并没有本质联系 1.1.1 https与http的区别 HTTP(超文本传输协议)和 HTTPS(安全超文本传输协议)是用于在网络上交换数据的两种协议。H…