32单片机从入门到精通之软件编程——中断处理(九)

永远不要放弃追逐你的梦想,即使道路坎坷险阻。不要让任何人或任何事物阻止你前进。相信自己的能力,坚持努力奋斗,你一定能够实现自己的目标。在困难面前,不要气馁,而是要保持积极乐观的心态,勇敢地面对挑战。坚信每一次失败都是一次宝贵的经验,每一次挫折都是一次锻炼。每一步都是通向成功的里程碑,每一次努力都是自我成长的过程。向前冲吧,不论风雨还是阳光,只要你保持热情和毅力,你一定会看到成功的曙光。相信自己,你就能做到!

目录

上一张试卷讲解

一、选择题(每题2分,共10分)

二、简答题(每题10分,共30分)

三、编程题(每题20分,共40分)

四、分析题(每题15分,共30分)

五、应用设计题(每题15分,共15分)

中断处理:配置NVIC与编写中断服务例程(ISR)

1. 配置NVIC

步骤1:使用STM32CubeMX配置NVIC

步骤2:手动配置NVIC(如果需要更细粒度控制)

2. 编写中断服务例程(ISR)

3. 详细讲解知识点和代码案例

配置NVIC (MX_NVIC_Init())

编写中断服务例程 (TIM2_IRQHandler())

启动定时器中断 (HAL_TIM_Base_Start_IT())

主函数 (main())

4. 代码注释解释

试卷

一、选择题(每题2分,共10分)

二、简答题(每题10分,共30分)

三、编程题(每题20分,共40分)

四、分析题(每题15分,共30分)

五、应用设计题(每题15分,共15分)


上一张试卷讲解

一、选择题(每题2分,共10分)
  1. 下列哪一项不是ST-Link的主要用途?

    • A) 在线调试
    • B) 烧录程序
    • C) 直接访问硬件寄存器
    • D) USB转串口适配 正确答案:C) 直接访问硬件寄存器
  2. 关于ST-Link V3相比V2的优势,以下说法正确的是:

    • A) 更低的数据传输速率
    • B) 减少I/O引脚数量
    • C) 支持更少类型的内核
    • D) 增强了调试能力 正确答案:D) 增强了调试能力
  3. SWD接口相比于JTAG接口的主要优点是什么?

    • A) 需要更多信号线
    • B) 占用较少引脚资源
    • C) 不适用于ARM Cortex-M内核MCU
    • D) 功能更加全面 正确答案:B) 占用较少引脚资源
  4. 如果需要同时调试多个核心或设备链路,应该优先选择哪种接口?

    • A) SWD
    • B) JTAG
    • C) UART
    • D) SPI 正确答案:B) JTAG
  5. 在STM32CubeMX中生成初始化代码时,默认使用的库是哪一个?

    • A) LL库
    • B) HAL库
    • C) Standard Peripheral Library
    • D) 自定义库 正确答案:B) HAL库
二、简答题(每题10分,共30分)
  1. 解释为什么对于大多数STM32应用来说,ST-Link V3搭配SWD接口是一个理想的选择,并列出至少两个理由。

     

    对于大多数STM32应用而言,ST-Link V3搭配SWD接口是理想选择的理由包括:

    • 更高的数据传输速率:ST-Link V3提供了更快的传输速度,提高了调试效率,尤其是在处理大数据量或频繁读写内存的情况下。
    • 节省引脚资源:SWD接口仅需两根信号线(SWCLK和SWDIO),减少了对微控制器引脚的需求,这对于小型封装或资源受限的应用尤为重要。
  2. 描述如何在STM32CubeMX中配置项目以确保使用SWD接口进行调试。

     

    要确保在STM32CubeMX中使用SWD接口进行调试,可以按照以下步骤操作:

    • 打开“Pinout & Configuration”标签页。
    • 在左侧找到并点击“Project Manager”。
    • 在“Settings”选项卡下,找到“Debug”设置。
    • 将“Interface”选项设置为“SWD”。
    • 完成其他必要的外设配置后,点击“GENERATE CODE”按钮生成代码。
  3. 举例说明一个场景,在这个场景中你会选择JTAG而不是SWD接口来进行调试,并解释原因。

     

    如果是在一个多核处理器或多设备链路上工作,比如开发一款复杂的嵌入式系统,其中包含多个STM32芯片或其它支持JTAG的器件,那么我会选择JTAG接口。因为JTAG可以在一条链路上连接多个器件,允许同时调试多个核心或设备,这是SWD接口所不具备的功能。

三、编程题(每题20分,共40分)
  1. 编写一段C代码,使用HAL库配置并启动一个定时器,使其每隔1秒触发一次中断。请包括必要的初始化步骤,并添加适当的注释。
#include "main.h"
#include "stm32f4xx_hal.h"TIM_HandleTypeDef htim2;// 初始化系统时钟
void SystemClock_Config(void);// GPIO初始化函数
static void MX_GPIO_Init(void);// 定时器初始化函数
static void MX_TIM2_Init(void);// 中断服务例程 (ISR)
void TIM2_IRQHandler(void);int main(void)
{// 初始化HAL库HAL_Init();// 配置系统时钟SystemClock_Config();// 初始化GPIO和其他外设MX_GPIO_Init();MX_TIM2_Init();// 启用NVIC中的TIM2中断MX_NVIC_Init();// 开启定时器更新中断HAL_TIM_Base_Start_IT(&htim2);// 主循环等待中断发生while (1) {}
}// 配置NVIC
void MX_NVIC_Init(void)
{// 设置TIM2中断优先级为主优先级5,子优先级0HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0);// 启用TIM2中断HAL_NVIC_EnableIRQ(TIM2_IRQn);
}// 定时器初始化函数
static void MX_TIM2_Init(void)
{TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};// 配置定时器实例htim2.Instance = TIM2;htim2.Init.Prescaler = 8399; // 假设系统时钟为84MHz,设置预分频值为8400-1htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 9999; // 每10000个计数周期溢出,即1秒htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){Error_Handler();}
}// 中断服务例程 (ISR)
void TIM2_IRQHandler(void)
{// 确保这是正确的中断源,并且确实发生了更新中断if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET &&__HAL_TIM_GET_IT_SOURCE(&htim2, TIM_IT_UPDATE) != RESET){// 清除更新中断标志,防止重复触发__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);// 响应中断事件的代码HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 切换LED状态}
}// 错误处理函数
void Error_Handler(void)
{while (1){// 进入死循环}
}
  1. 编写一段C代码,使用LL库实现GPIO引脚的配置为推挽输出模式,并使LED连接到该引脚上闪烁。要求代码适用于STM32系列微控制器,并附上详细注释。
#include "stm32f4xx_ll_bus.h"
#include "stm32f4xx_ll_gpio.h"
#include "stm32f4xx_ll_rcc.h"
#include "stm32f4xx_ll_system.h"
#include "stm32f4xx_ll_utils.h"// 初始化系统时钟
void SystemClock_Config(void);int main(void)
{// 初始化系统时钟SystemClock_Config();// 启用GPIOA时钟LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);// 配置PA5引脚为推挽输出模式LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_OUTPUT);LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_5, LL_GPIO_SPEED_FREQ_LOW);LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_5, LL_GPIO_OUTPUT_PUSHPULL);LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_5, LL_GPIO_PULL_NO);// LED闪烁主循环while (1){// 切换LED状态LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);// 延迟500msLL_mDelay(500);}
}// 初始化系统时钟(具体配置根据您的需求调整)
void SystemClock_Config(void)
{// 此处省略具体时钟配置代码,因为这取决于具体的STM32型号和需求
}
四、分析题(每题15分,共30分)
  1. 比较JTAG和SWD接口在实际应用中的优缺点,并说明在什么情况下应该选择其中一个而不是另一个。
  • JTAG的优点
    • 支持多设备链路调试,适合复杂系统或多个核心的调试。
    • 提供更多的功能,如边界扫描测试等。
  • JTAG的缺点
    • 需要更多的引脚资源(通常为4或5个信号线)。
    • 硬件成本较高,且布线复杂度增加。
  • SWD的优点
    • 只需两根信号线(SWCLK和SWDIO),节省引脚资源。
    • 简化了PCB布局设计,降低了硬件成本。
  • SWD的缺点
    • 不支持多设备链路调试。
    • 功能相对JTAG较少。
  • 选择建议
    • 如果您的应用场景较为简单,或者您希望减少引脚占用,那么SWD接口将是更好的选择。
    • 如果您正在开发一个多核或需要同时调试多个设备的系统,则应考虑使用JTAG接口。
  1. 深入探讨在项目初期选择ST-Link V2还是V3时应考虑的因素,并给出针对不同项目类型的推荐。

在项目初期选择ST-Link V2还是V3时,应考虑以下几个因素:

  • 性能需求:如果您需要更高的数据传输速率和更低的延迟,那么ST-Link V3是更好的选择。
  • 成本控制:如果预算有限,而性能需求不高,可以选择ST-Link V2。
  • 未来扩展性:如果您预计未来可能会有更复杂的需求,例如支持更多类型的内核或额外的功能,那么ST-Link V3将提供更大的灵活性。
  • 团队技能水平:对于新手开发者来说,ST-Link V2可能更容易上手;但对于有经验的开发者,ST-Link V3提供了更多的可能性。

推荐

  • 对于快速原型开发或小型项目,ST-Link V2已经足够满足需求,而且成本较低。
  • 对于高性能要求的应用,如工业控制、通信设备等领域,ST-Link V3因其高效性和扩展性成为首选。
  • 对于长期维护项目,考虑到未来的维护和升级,ST-Link V3提供的更好可移植性和更高代码质量可能是更好的选择。
五、应用设计题(每题15分,共15分)
  1. 设计一个简单的温度监控系统,该系统使用STM32微控制器、温度传感器以及LCD显示器。请详细描述你将如何根据系统的性能需求选择合适的调试接口(JTAG或SWD),并说明选择的理由。此外,请概述如何利用所选接口的功能来优化开发流程和系统性能。

设计思路

  • 硬件选择:选用带有ADC模块的STM32微控制器来读取温度传感器的模拟信号,并通过SPI/I2C接口连接LCD显示器显示测量结果。
  • 软件架构
    • 库的选择:考虑到这是一个相对简单的应用,且需要快速开发和良好的用户体验,我们选择了HAL库。这是因为HAL库提供了易于使用的API,可以大大缩短开发时间,同时也保证了足够的性能来满足日常监控的需求。
    • 初始化配置:使用STM32CubeMX工具生成初始化代码,自动配置时钟、ADC、SPI/I2C等外设。
    • 数据采集与处理:利用HAL库提供的ADC驱动程序定期采样温度传感器的数据,并通过SPI/I2C库发送给LCD显示器。
    • 用户界面:编写简单的菜单系统供用户查看当前温度值或其他相关信息。
    • 优化措施
      • 使用DMA传输方式来提高ADC采样的速度和稳定性。
      • 如果LCD支持,采用双缓冲技术来减少屏幕刷新时的闪烁现象。
      • 实现低功耗模式,在没有新的传感器数据到来之前让MCU进入休眠状态以节省电量。

调试接口选择

  • 选择理由:对于这样一个相对简单的单片机应用,SWD接口是理想的选择。它只需两根信号线,减少了引脚占用,并且在大多数情况下性能已经足够。除非未来计划扩展到多核或多设备链路调试,否则SWD接口能够满足所有调试需求。
  • 优化开发流程
    • 简化硬件设计:由于只需要两根信号线,PCB布局更加简单,降低了制造成本。
    • 加快调试速度:ST-Link V3搭配SWD接口提供了较快的数据传输速率,使得调试过程更为流畅。
    • 便于故障排除:通过SWD接口可以直接访问内部状态信息,帮助快速定位问题。

综上所述,通过对调试接口的合理选择,不仅可以加速开发进度,还能保持较高的代码可读性和维护性,从而有效提升系统的整体性能。

中断处理:配置NVIC与编写中断服务例程(ISR)

在STM32微控制器中,中断处理是通过嵌套向量中断控制器(NVIC)来实现的。NVIC允许您配置每个中断的优先级和子优先级,并定义相应的中断服务例程(ISR)。以下是详细的步骤说明、代码示例及注释,帮助您配置NVIC并编写ISR。

1. 配置NVIC
步骤1:使用STM32CubeMX配置NVIC
  1. 打开STM32CubeMX。
  2. 在“Pinout & Configuration”标签页中,找到需要启用中断的外设(例如定时器TIM2、外部中断线等)。
  3. 在对应的外设配置窗口中,勾选“Enable Interrupt”选项以启用该外设的中断功能。
  4. 如果需要,可以在“NVIC Settings”中调整中断优先级和子优先级。
步骤2:手动配置NVIC(如果需要更细粒度控制)

如果您需要更细粒度地控制NVIC设置,可以手动编写代码进行配置。以下是一个简单的例子,展示了如何配置定时器TIM2的中断优先级:

#include "stm32f4xx_hal.h"// 初始化NVIC函数
void MX_NVIC_Init(void)
{// 配置TIM2中断优先级// 主优先级为5,子优先级为0HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0);// 启用TIM2中断HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
  • HAL_NVIC_SetPriority() 函数用于设置中断的主优先级和子优先级。STM32的优先级分为两部分:主优先级(Preemption Priority)和子优先级(Subpriority)。主优先级决定了哪个中断可以抢占另一个正在执行的中断;子优先级则用于确定当两个中断具有相同主优先级时谁先被处理。
  • HAL_NVIC_EnableIRQ() 函数用于启用特定的中断源。这一步骤告诉NVIC开始监听指定的中断事件。
2. 编写中断服务例程(ISR)

为了响应中断事件,您需要定义相应的中断服务例程(ISR)。这些函数通常由编译器自动生成,但您可以根据需要修改它们。下面是一个定时器TIM2中断服务例程的例子:

// 定义LED引脚
#define LED_PIN GPIO_PIN_12
#define LED_GPIO_PORT GPIOD// 定时器句柄声明
extern TIM_HandleTypeDef htim2;// 中断服务例程(ISR):定时器TIM2更新中断
void TIM2_IRQHandler(void)
{// 确保这是正确的中断源,并且确实发生了更新中断if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET &&__HAL_TIM_GET_IT_SOURCE(&htim2, TIM_IT_UPDATE) != RESET){// 清除更新中断标志,防止重复触发__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);// 响应中断事件的代码// 这里我们切换LED状态HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN); // 切换LED状态}
}// 主函数入口
int main(void)
{// 初始化HAL库,准备使用HAL库中的APIHAL_Init();// 配置系统时钟,确保MCU运行在正确的频率下SystemClock_Config();// 初始化所有已配置的外设,包括GPIO、定时器等MX_GPIO_Init();MX_TIM2_Init();MX_NVIC_Init(); // 初始化NVIC// 开启定时器更新中断HAL_TIM_Base_Start_IT(&htim2);// 主循环等待中断发生while (1) {}
}// 定时器初始化函数(详细内容由STM32CubeMX生成)
static void MX_TIM2_Init(void)
{TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};// 初始化定时器实例htim2.Instance = TIM2;htim2.Init.Prescaler = 8399; // 设置预分频值,假设系统时钟为84MHzhtim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 9999; // 每10000个计数周期溢出,即1秒htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 初始化定时器if (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}// 配置定时器时钟源sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){Error_Handler();}// 配置定时器主模式配置sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){Error_Handler();}
}// 错误处理函数
void Error_Handler(void)
{// 错误处理逻辑while (1){// 进入死循环}
}
3. 详细讲解知识点和代码案例
配置NVIC (MX_NVIC_Init())
  • HAL_NVIC_SetPriority():
    • 设置中断的主优先级和子优先级。STM32的优先级分为两部分:主优先级(Preemption Priority)和子优先级(Subpriority)。主优先级决定了哪个中断可以抢占另一个正在执行的中断;子优先级则用于确定当两个中断具有相同主优先级时谁先被处理。
  • HAL_NVIC_EnableIRQ():
    • 启用特定的中断源。这一步骤告诉NVIC开始监听指定的中断事件。
编写中断服务例程 (TIM2_IRQHandler())
  • 检查中断源:
    • 使用__HAL_TIM_GET_FLAG() 和 __HAL_TIM_GET_IT_SOURCE() 来确认是否确实是定时器更新中断。
  • 清除中断标志:
    • 使用__HAL_TIM_CLEAR_IT()清除中断标志位,防止重复触发。
  • 响应中断事件:
    • 在此例程中,我们切换LED的状态,以实现LED闪烁的效果。
启动定时器中断 (HAL_TIM_Base_Start_IT())
  • 启动定时器并开启其更新中断:
    • 每当定时器计数达到设定的最大值(Period)时,就会触发一次中断。
主函数 (main())
  • 初始化HAL库 (HAL_Init())
    • 初始化HAL库,设置全局变量并准备使用HAL库中的API。
  • 配置系统时钟 (SystemClock_Config())
    • 配置系统的时钟树,确保微控制器以正确的工作频率运行。
  • 初始化外设 (MX_GPIO_Init()MX_TIM2_Init()MX_NVIC_Init())
    • 初始化所有已配置的外设,包括GPIO、定时器等。
  • 启动定时器中断 (HAL_TIM_Base_Start_IT())
    • 开启定时器更新中断。
  • 主循环 (while (1))
    • 主循环等待中断发生。
4. 代码注释解释
  • #define LED_PIN GPIO_PIN_12 和 #define LED_GPIO_PORT GPIOD:
    • 定义了LED连接的GPIO引脚和端口。
  • extern TIM_HandleTypeDef htim2;:
    • 声明定时器句柄,以便在ISR中使用。
  • HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0); 和 HAL_NVIC_EnableIRQ(TIM2_IRQn);:
    • 分别设置TIM2中断的优先级和启用TIM2中断。
  • if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET && __HAL_TIM_GET_IT_SOURCE(&htim2, TIM_IT_UPDATE) != RESET):
    • 检查是否确实发生了定时器更新中断。
  • __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);:
    • 清除定时器更新中断标志,防止重复触发。
  • HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);:
    • 切换LED的状态,即开/关LED。
  • HAL_Init();:
    • 初始化HAL库,准备使用HAL库中的API。
  • SystemClock_Config();:
    • 配置系统的时钟树,确保微控制器以正确的工作频率运行。
  • MX_GPIO_Init();:
    • 初始化GPIO引脚。
  • MX_TIM2_Init();:
    • 初始化定时器TIM2。
  • MX_NVIC_Init();:
    • 初始化NVIC。
  • HAL_TIM_Base_Start_IT(&htim2);:
    • 开启定时器更新中断。
  • while (1) {}:
    • 主循环等待中断发生。

通过上述步骤,您可以配置NVIC并编写有效的中断服务例程,从而实现对各种事件的快速响应。这种方法不仅提高了程序的实时性,还简化了复杂任务的管理。

试卷

一、选择题(每题2分,共10分)
  1. 关于STM32的嵌套向量中断控制器(NVIC),下列哪项描述是正确的?

    • A) NVIC仅支持单一优先级设置。
    • B) NVIC允许配置每个中断的主优先级和子优先级。
    • C) NVIC不能用于配置外部中断线。
    • D) NVIC只能通过手动编程配置,无法通过STM32CubeMX配置。
  2. 以下哪个函数用于设置STM32的中断优先级?

    • A) HAL_NVIC_SetPriority()
    • B) HAL_NVIC_EnableIRQ()
    • C) __HAL_TIM_GET_FLAG()
    • D) HAL_GPIO_TogglePin()
  3. 在STM32中,使用SWD接口相比于JTAG接口的主要优点是什么?

    • A) SWD接口需要更多的信号线。
    • B) SWD接口占用较少引脚资源。
    • C) SWD接口不适用于ARM Cortex-M内核MCU。
    • D) SWD接口功能更加全面。
  4. 如果需要同时调试多个核心或设备链路,应该优先选择哪种接口?

    • A) SWD
    • B) JTAG
    • C) UART
    • D) SPI
  5. 在STM32CubeMX中生成初始化代码时,默认使用的库是哪一个?

    • A) LL库
    • B) HAL库
    • C) Standard Peripheral Library
    • D) 自定义库
二、简答题(每题10分,共30分)
  1. 解释为什么对于大多数STM32应用来说,ST-Link V3搭配SWD接口是一个理想的选择,并列出至少两个理由。

  2. 描述如何在STM32CubeMX中配置项目以确保使用SWD接口进行调试。

  3. 举例说明一个场景,在这个场景中你会选择JTAG而不是SWD接口来进行调试,并解释原因。

三、编程题(每题20分,共40分)
  1. 编写一段C代码,使用HAL库配置并启动一个定时器,使其每隔1秒触发一次中断。请包括必要的初始化步骤,并添加适当的注释。

  2. 编写一段C代码,使用LL库实现GPIO引脚的配置为推挽输出模式,并使LED连接到该引脚上闪烁。要求代码适用于STM32系列微控制器,并附上详细注释。

四、分析题(每题15分,共30分)
  1. 比较JTAG和SWD接口在实际应用中的优缺点,并说明在什么情况下应该选择其中一个而不是另一个。

  2. 深入探讨在项目初期选择ST-Link V2还是V3时应考虑的因素,并给出针对不同项目类型的推荐。

五、应用设计题(每题15分,共15分)
  1. 设计一个简单的温度监控系统,该系统使用STM32微控制器、温度传感器以及LCD显示器。请详细描述你将如何根据系统的性能需求选择合适的调试接口(JTAG或SWD),并说明选择的理由。此外,请概述如何利用所选接口的功能来优化开发流程和系统性能。

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

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

相关文章

Fabric环境部署-Git和Node安装

一.安装Git(v2.43.0) Git 是一个开源的分布式版本管理系统(也是全球最大的开源软件存储服务器),用于敏捷高效地处理任何或小或大的项目。搭建区块链需要使用Git,因为区块链的开发和部署需要使用版本控制工…

springCloud 脚手架项目功能模块:Java分布式锁

文章目录 引言分布式锁产生的原因:集群常用的分布式锁分布式锁的三种实现方式I ZooKeeper 简介zookeeper本质上是一个分布式的小文件存储系zookeeper特性:全局数据一致性ZooKeeper的应用场景分布式锁(临时节点)II 基于ZooKeeper 实现一个排他锁创建锁获取锁释放锁Apache Zo…

stm32入门元件介绍

stm32入门元件介绍 文章目录 stm32入门元件介绍入门套件总览套件介绍面包板面包板跳线/飞线杜邦线STM32最小系统板STLINKOLED显示屏LED按键电位器蜂鸣器光敏/热敏电阻传感器/对射式/反射式红外传感器旋转编码器USB转串口MPU6050陀螺仪加速度计W25Q64 Flash闪存TB6612FNG电机驱动…

C语言:调试的概念和调试器的选择

所谓调试(Dubug),就是跟踪程序的运行过程,从而发现程序的逻辑错误(思路错误),或者隐藏的缺陷(Bug)。 在调试的过程中,我们可以监控程序的每一个细节&#xff…

Python深度学习GRU、LSTM 、BiLSTM-CNN神经网络空气质量指数AQI时间序列预测及机器学习分析|数据分享...

全文链接:https://tecdat.cn/?p38742 分析师:Zhixiong Weng 人们每时每刻都离不开氧,并通过吸入空气而获得氧。一个成年人每天需要吸入空气达6500升以获得足够的氧气,因此,被污染了的空气对人体健康有直接的影响&…

Flink源码编译与运行

1 准备 准备好Java 8环境和编译器(如IDEA)。 下载源码: 官网:https://flink.apache.org/downloads/。GitHub:https://github.com/apache/flink。 2 编译 在IDEA终端,使用下面命令之一编译源码&#xff…

Elasticsearch:Lucene 2024 年回顾

作者:来自 Elastic Chris Hegarty 2024 年对于 Apache Lucene 来说又是重要的一年。在本篇博文中,我们将探讨主要亮点。 Apache Lucene 在 2024 年表现出色,发布了许多版本,包括三年来的首次重大更新,其中包含令人兴奋…

(四)基于STM32通过Event Recoder实现时间测量功能

目录 1. 了解Event Recorder 2. 硬件和软件准备 硬件需求 软件需求 3. 配置STM32工程 使用STM32CubeMX初始化项目 配置Event Recorder 4. 实现时间记录功能 初始化Event Recorder 时间间隔计算 配置Debug选项 测量结果查看 5总结 在嵌入式系统开发中,精…

Java 内存溢出(OOM)问题的排查与解决

在 Java 开发中,内存溢出(OutOfMemoryError,简称 OOM)是一个常见且棘手的问题。相比于数组越界、空指针等业务异常,OOM 问题通常更难定位和解决。本文将通过一次线上内存溢出问题的排查过程,分享从问题表现…

Python、R用深度学习神经网络组合预测优化能源消费总量时间序列预测及ARIMA、xgboost对比...

全文链接:https://tecdat.cn/?p38726 分析师:Qingxia Wang 在能源领域,精准预测能源消费总量对制定合理能源战略至关重要。当前,能源消费预测分析主要运用单一模型(如灰色预测法、时间序列分析法等)和组合…

【LLM-Agent】Building effective agents和典型workflows

note Anthropic的工程经验: 大道至简,尽量维护系统的简洁;尽量让过程更加透明(因为你依赖的是LLM的决策,如果只看输出不看过程,很容易陷入难以debug的情况);对LLM需要调用的工具&am…

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

一、引言 通过FFmpeg命令: ./ffmpeg -i XXX.ps 可以判断出某个文件是否为PS文件: 所以FFmpeg是怎样判断出某个文件是否为PS文件呢?它内部其实是通过mpegps_probe函数来判断的。从《FFmpeg源码:av_probe_input_format3函数和AVI…

CSS——5. 外部样式

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>方法3&#xff1a;外部样式</title><link rel"stylesheet" href"a.css" /><link rel"stylesheet" href"b.css"/&g…

lenovo联想IdeaPad 15sIML 2020款(81WB)笔记本电脑原装出厂OEM预装系统Windows10镜像下载

适用机型 &#xff1a;【81WB】 链接&#xff1a;https://pan.baidu.com/s/1SF9uWaNdCKPkwKgsCWb18g?pwdh6qe 提取码&#xff1a;h6qe 联想原厂WIN系统自带所有驱动、带Recovery恢复重置、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想…

WPS表格技巧01-项目管理中的基本功能-计划和每日记录的对应

前言&#xff1a; 在项目管理中&#xff0c;一般就是用些项目管理工具来管理这个任务和 task&#xff0c;但是就是要学这些工具很麻烦&#xff0c;比较好的方法&#xff0c;通用的方法就是用 Excel 表格去做&#xff08;这非常适合松散的团队组织&#xff09;&#xff0c;然后…

《前端web开发-CSS3基础-1》

文章目录 《前端web开发-CSS3基础》1.CSS引入方式2.选择器-标签和类3.选择器-id和通配符选择器4.画盒子5.字体修饰属性6.字体大小、粗细和倾斜6.1字体大小6.2 字体粗细6.3字体倾斜 7.行高8.字体族9.font复合属性10.缩进、对齐和修饰线10.1 文本缩进10.2 文本和图片对齐10.3 文本…

Mac M2基于MySQL 8.4.3搭建(伪)主从集群

前置准备工作 安装MySQL 8.4.3 参考博主之前的文档&#xff0c;在本地Mac安装好MySQL&#xff1a;Mac M2 Pro安装MySQL 8.4.3安装目录&#xff1a;/usr/local/mysql&#xff0c;安装好的MySQL都处于运行状态&#xff0c;需要先停止MySQL服务最快的方式&#xff1a;系统设置 …

网络IP协议

IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;是TCP/IP协议族中重要的协议&#xff0c;主要负责将数据包发送给目标主机。IP相当于OSI&#xff08;图1&#xff09;的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…

密钥管理系统在数据安全解决方案中的重要性

密钥管理系统在数据安全解决方案中占据着举足轻重的地位&#xff0c;其重要性体现在以下几个方面&#xff1a;一、保障数据机密性 密钥管理系统通过生成、存储和管理加密密钥&#xff0c;确保了数据的机密性。这些密钥用于加密和解密数据&#xff0c;只有授权用户才能访问和使…

关于PINN进一步的探讨

pinn 是有监督、无监督、半监督&#xff1f; PINN&#xff08;Physics-Informed Neural Networks&#xff0c;物理信息神经网络&#xff09;通常被归类为一种有监督学习的方法。在PINN中&#xff0c;神经网络的训练过程不仅依赖于数据点&#xff08;例如实验观测数据&#xff0…