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

【S32K3 RTD LLD篇5】K344 ADC SW+HW trigger

【S32K3 RTD LLD篇5】K344 ADC SW+HW trigger

  • 一,文档简介
  • 二,ADC SW HW 触发
    • 2.1 软硬件平台
    • 2.2 SW+ADC 软件触发
    • 2.3 SW+BCTU+ADC 软件BCTU触发
    • 2.4 PIT+TRIGMUX+ADC 硬件PIT TRIGUMX触发
    • 2.5 EMIOS+BCTUHW+ADC硬件EMIOS BCTU触发
    • 2.6 EMIOS+BCTUHW LIST+ADC硬件EMIOS BCTU触发LIST采集

一,文档简介

S32K344的ADC是一款分辨率高达14位的SAR ADC,拥有丰富的软件以及硬件触发方式,支持多样的外部触发源,并且引入BCTU使得触发资源可以外联到多通道的EMIOS以及TRIGMUX,增加了更多的ADC触发源。本文主要讲解如下几种方式的ADC软硬件触发情况,并且配套给出代码。

在这里插入图片描述

图 1

主要分为5部分:
(1) SW+ADC: 软件触发,通过添加定时器PIT,定时调用软件触发ADC完成通道采样,并且通过UART printf打印出采集值。
(2) SW+BCTU+ADC: 软件触发, 通过添加定时器PIT,定时调用软件触发BTCU, 完成ADC通道采样,并且通过UART printf打印出采集值。
(3) PIT+TRIGMUX+ADC: 硬件触发, 通过TRIGMUX连接PIT到ADC,通过PIT硬件触发ADC通道采样,并且在采样转换完成后打印转换值。
(4) EMIOS+BCTUHW+ADC: 硬件触发,通过EMIOS定时触发BCTU完成对应ADC单通道采样,由于采样速率较高,所以只是定时打印BCTU采样值。
(5) EMIOS+BCTUHWLIST+ADC: 硬件触发,通过EMIOS定时触发BCTU完成ADC列表通道采样,由于采样速率较高,所以定时打印BCTU 采样到的列表通道值。

二,ADC SW HW 触发

2.1 软硬件平台

软件: RTD400 LLD,S32DS3.5
硬件:S32K3X4EVB-T172

2.2 SW+ADC 软件触发

实际上,原始的RTD400自带的ADC demo已经有了ADC 软件以及BCTU的软件触发,本文是在该功能的基础上添加了PIT定时软件触发,并且通过UART printf打印出来,让检查ADC的测试值通过串口打印变的更加方便。
本文软件触发ADC的框图结构如下:

在这里插入图片描述

图 2

S32K344EVB板载有一个电位器,接到了ADC1_S10, PTA11:
在这里插入图片描述

图 3

所以,本节软件触发主要用于采集ADC1_S10。 UART 打印端口使用的是板载仿真器自带的串口:LPUART6_RX PTA15, LPUART6_TX PTA16,波特率为115200.
对于本文软件触发demo,主要配置涉及如下模块:
(1)Pins:
在这里插入图片描述

图 4

ADC1_s10, PTA11是当前要测试板载电位器电压,可调。
PTA29:连接板载D13红灯,用于测试PIT定时器中断进入闪烁,作为PIT的呼吸灯使用。
PTA16: UART6_TX, 用于发送采集到的ADC值。
(2)clocks
用于配置系统时钟,需要关注UART6时钟源为40Mhz,ADC1时钟源为160Mhz,PIT0时钟源为40Mhz
(3)Peripherals
涉及外设模块Siul2_Port,Siul2_Dio, Pit, Lpuart_Uart, Adc_Sar_Ip, IntCtrl_Ip.
Siul2_Port: 添加4个引脚ADC PTA11 MSCR 11, RED LED PTA29 MSCR 29,UART6_RX PTA15 MSCR 15, UART6_RX PTA16 MSCR 16.
Siul2_Dio:添加模块主要是为了让相关的API函数进来,便于控制GPIO引脚。
Pit: 用于生成1S的定时,主要配置如下:
在这里插入图片描述

图 5

在这里插入图片描述

图6

Lpuart_Uart:
在这里插入图片描述

图7

Adc_Sar_Ip:
在这里插入图片描述

图8

在这里插入图片描述

图9

这里需要注意的是ADC calibration prescale,以及Adc prescaler vale,需要满足如下条件,这点可以在S32K3RM上找到:
在这里插入图片描述

图 10

由于ADC1的时钟源是160MHz, 所以配置校准分频为4分频,转换分频为2分频。
IntCtrl_Ip:
在这里插入图片描述

图 11

旨在打开PIT, LPUART6的中断,并且注册对应的handler.
CT配置完成,生成代码,下一步,移步main函数,添加代码如下:

void AdcEndOfChainNotif1(void)
{notif_triggered1 = TRUE;data1 = Adc_Sar_Ip_GetConvData(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, 34);/* Checks the measured ADC data conversion */// while (ADC_TOLERANCE(data, ADC_BANDGAP));
}
void Pit0ch0Notification(void)
{toggleLed = 1U;Siul2_Dio_Ip_TogglePins(LED_Q172_PORT, (1<<LED_Q172_PIN));
}
int main(void)
{StatusType status;uint8 Index;Clock_Ip_StatusType clockStatus;/* Initialize and configure drivers */clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);while (clockStatus != CLOCK_IP_SUCCESS){clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);}Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);/* set PIT 0 interrupt */IntCtrl_Ip_Init(&IntCtrlConfig_0);
IntCtrl_Ip_EnableIrq(PIT0_IRQn);status = (StatusType) Adc_Sar_Ip_Init(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, &AdcHwUnit_1_BOARD_InitPeripherals);while (status != E_OK);IntCtrl_Ip_InstallHandler(ADC1_IRQn, Adc_Sar_1_Isr, NULL_PTR);IntCtrl_Ip_EnableIrq(ADC1_IRQn);for(Index = 0; Index <= 5; Index++){status = (StatusType) Adc_Sar_Ip_DoCalibration(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE);if(status == E_OK){break;}
}Adc_Sar_Ip_EnableNotifications(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN | ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN);/* Initialize PIT instance 0 - Channel 0 */Pit_Ip_Init(PIT_INST_0, &PIT_0_InitConfig_PB_BOARD_InitPeripherals);/* Initialize channel 0 */Pit_Ip_InitChannel(PIT_INST_0, PIT_0_CH_0);/* Enable channel interrupt PIT_0 - CH_0 */Pit_Ip_EnableChannelInterrupt(PIT_INST_0, CH_0);/* Start channel CH_0 */Pit_Ip_StartChannel(PIT_INST_0, CH_0, PIT_PERIOD);Lpuart_Uart_Ip_Init(UART_LPUART_INTERNAL_CHANNEL, &Lpuart_Uart_Ip_xHwConfigPB_6_BOARD_INITPERIPHERALS);printf("S32K344 PIT TRIGMUX ADC demo RTD400.\r\n");while(1){
#if 1if( toggleLed == 1){toggleLed = 0;/* Start a SW triggered normal conversion on ADC_SAR */Adc_Sar_Ip_StartConversion(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_CONV_CHAIN_NORMAL);/* Wait for the notification to be triggered and read the data */while (notif_triggered1 != TRUE);notif_triggered1 = FALSE;printf("ADC1_s10 ch34 data = %d .\r\n", data1);}
#endif}
}

测试结果打印如下:
在这里插入图片描述

图 12

本节内容配套代码:S32K344_PIT_SW_ADC_RTD400.zip

2.3 SW+BCTU+ADC 软件BCTU触发

基于SW+ADC触发,添加BCTU,并且使用BCTU软件触发完成ADC采样。框图结构如下:
在这里插入图片描述

图 13

本节功能是使用BCTU软件触发ADC0采样,采样通道并没有真实的使用外部的引脚输入,而是采集ADC0 的bandgap的值。软件触发通过PIT 1S周期调用软件触发函数,完成后打印ADC采样转换值到UART。
CT工具中,主要修改点为peripherals, adc_sar_lp中添加ADC0,并且配置为BCTU触发。
在这里插入图片描述

图 14

在这里插入图片描述

图 15

这里可以看到,图14中 adc ctu mode为:trigger mode.
添加Bctu_Ip模块,并且配置如下:
在这里插入图片描述

图 16

对应选择的BCTU的通道为48,该通道对应内部的bandgap模块。
在这里插入图片描述

图 17

典型值是1.2V,所以参考电压为5V,对应的14位ADC的bandgap期望值为:
(2^14)*1.2/5=3932周围。
完成CT配置生成代码后,在main.c里面添加如下代码:

void AdcEndOfChainNotif(void)
{notif_triggered = TRUE;data = Adc_Sar_Ip_GetConvData(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_USED_CH);
}
void Pit0ch0Notification(void)
{toggleLed = 1U;Siul2_Dio_Ip_TogglePins(LED_Q172_PORT, (1<<LED_Q172_PIN));
}void BctuWatermarkNotif(void)
{uint8 idx;notif_triggered = TRUE;for (idx = 0u; idx < BCTU_FIFO_WATERMARK; idx++){data_bctu = Bctu_Ip_GetFifoData(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_USED_FIFO_IDX);}
}int main(void)
{StatusType status;uint8 Index;Clock_Ip_StatusType clockStatus;/* Initialize and configure drivers */clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);while (clockStatus != CLOCK_IP_SUCCESS){clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);}Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);Bctu_Ip_Init(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, &BctuHwUnit_0_BOARD_INITPERIPHERALS);status = (StatusType) Adc_Sar_Ip_Init(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, &AdcHwUnit_0_BOARD_InitPeripherals);
while (status != E_OK);/* set PIT 0 interrupt */IntCtrl_Ip_Init(&IntCtrlConfig_0);IntCtrl_Ip_EnableIrq(PIT0_IRQn);/* Install and enable interrupt handlers */IntCtrl_Ip_InstallHandler(ADC0_IRQn, Adc_Sar_0_Isr, NULL_PTR);IntCtrl_Ip_InstallHandler(BCTU_IRQn, Bctu_0_Isr, NULL_PTR);IntCtrl_Ip_EnableIrq(ADC0_IRQn);IntCtrl_Ip_EnableIrq(BCTU_IRQn);/* Call Calibration function multiple times, to mitigate instability of board source */for(Index = 0; Index <= 5; Index++){status = (StatusType) Adc_Sar_Ip_DoCalibration(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE);if(status == E_OK){break;}
}Adc_Sar_Ip_EnableNotifications(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN | ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN);/* Start a SW triggered conversion on BCTU using a single trigger */Bctu_Ip_SetGlobalTriggerEn(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, TRUE);
Bctu_Ip_EnableNotifications(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_IP_NOTIF_FIFO1);/* Initialize PIT instance 0 - Channel 0 */Pit_Ip_Init(PIT_INST_0, &PIT_0_InitConfig_PB_BOARD_InitPeripherals);/* Initialize channel 0 */Pit_Ip_InitChannel(PIT_INST_0, PIT_0_CH_0);/* Enable channel interrupt PIT_0 - CH_0 */Pit_Ip_EnableChannelInterrupt(PIT_INST_0, CH_0);/* Start channel CH_0 */Pit_Ip_StartChannel(PIT_INST_0, CH_0, PIT_PERIOD);Trgmux_Ip_Init(&Trgmux_Ip_xTrgmuxInitPB);//Lpuart_Uart_Ip_Init(UART_LPUART_INTERNAL_CHANNEL, &Lpuart_Uart_Ip_xHwConfigPB_6_BOARD_INITPERIPHERALS);printf("S32K344 PIT TRIGMUX ADC demo RTD400.\r\n");while(1){if( toggleLed == 1){toggleLed = 0;Bctu_Ip_SwTriggerConversion(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_USED_SINGLE_TRIG_IDX);while (notif_triggered != TRUE);notif_triggered = FALSE;printf("ADC0_bandgap ch48 data_bctu = %d .\r\n", data_bctu);}}
}

测结果如下:
在这里插入图片描述

图18

和典型期望值接近,说明已经成功运行。
配套代码:S32K344_PIT_TRIGMUX_BCTUSW_ADC_printf_RTD400.zip

2.4 PIT+TRIGMUX+ADC 硬件PIT TRIGUMX触发

本节为硬件触发,使用PIT结合TRIGMUX直接触发ADC1 通道34即ADC1_S10采样,触发结构框图如下:
在这里插入图片描述

图19

同样在之前代码的基础上,需要在CT的peripherals中额外添加模块Trgmux_Ip,其余配置不变。
在这里插入图片描述

图 20

这里选择了Trigmux的输入为PIT0_CH0, 输出为ADC1.
代码也简单很多,在main里面添加如下代码:

Trgmux_Ip_Init(&Trgmux_Ip_xTrgmuxInitPB);//while(1){if(notif_triggered1 == TRUE){notif_triggered1 = FALSE;printf("ADC1_s10 ch34 data = %d .\r\n", data1);}}

While(1)中,可以看到,已经没有软件触发的调用,直接判别ADC1转换完成的标志,然后打印数据,测试结果如下:
在这里插入图片描述

图 21

可以看到,随着外部电位器的改变,采样得到的ADC1_S10的值也在改变。
本节代码:S32K344_PIT_TRIGMUX_ADC_printf_RTD400.zip

2.5 EMIOS+BCTUHW+ADC硬件EMIOS BCTU触发

本节框图结构如下:

在这里插入图片描述

图 22

使用eMIOS0_CH0,生成10Khz的时钟,去触发BCTU完成ADC0_48通道,即bandgap的采样。
在CT工具中,添加Emios_Mcal_Ip,配置如下:
在这里插入图片描述

图 23

BCTU配置改成使能HW triggering,配置如下:

在这里插入图片描述

图24

Main代码相关代码如下:

Emios_Mcl_Ip_Init(EMIOS_INST0, &Emios_Mcl_Ip_0_Config_BOARD_INITPERIPHERALS);while(1)
{if( toggleLed == 1){toggleLed = 0;printf("ADC0_bandgap ch48 data_bctu = %d .\r\n", data_bctu);}
}

由于采样率是按照10Khz的频率去触发,频率较快,这里打印还是按照1s打印,打印结果如下:

在这里插入图片描述

图 25

可以看到,得到的结果也是一个可以变动的bandgap值。
本节代码:S32K344_PIT_TRIGMUX_BCTUHW_EMIOS_ADC_printf_RTD400.zip

2.6 EMIOS+BCTUHW LIST+ADC硬件EMIOS BCTU触发LIST采集

本节和上面的EMIOS BCTU硬件触发类似,只是在BCTU中配置使用LIST的形式,可以一次触发转换多个通道。主要修改点为BCTU模块:

在这里插入图片描述

图 26

添加对应的main代码如下:

#define BCTU_FIFO_WATERMARK             3U
void BctuWatermarkNotif(void)
{uint8 idx;notif_triggered = TRUE;for (idx = 0u; idx < BCTU_FIFO_WATERMARK; idx++){data_bctu[idx] = Bctu_Ip_GetFifoData(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_USED_FIFO_IDX);}
}while(1){if( toggleLed == 1){toggleLed = 0;printf("ADC0_bandgap    ch48 data_bctu = %d .\r\n", data_bctu[0]);printf("ADC0_vrefl       ch54 data_bctu = %d .\r\n", data_bctu[1]);printf("ADC0_vrefh       ch55 data_bctu = %d .\r\n", data_bctu[2]);}}

测试结果如下:
在这里插入图片描述

图 27

可以看到,结果和采集的bandgap,VREFL,VREFH还是吻合的,说明代码功能正常运行。
本节代码:
S32K344_PIT_TRIGMUX_BCTUHWLIST_EMIOS_ADC_printf_RTD400.zip
代码链接:
https://community.nxp.com/t5/S32K-Knowledge-Base/RTD400-K344-ADC-SW-HW-trigger/ta-p/1966179

相关文章:

【S32K3 RTD LLD篇5】K344 ADC SW+HW trigger

【S32K3 RTD LLD篇5】K344 ADC SWHW trigger 一&#xff0c;文档简介二&#xff0c;ADC SW HW 触发2.1 软硬件平台2.2 SWADC 软件触发2.3 SWBCTUADC 软件BCTU触发2.4 PITTRIGMUXADC 硬件PIT TRIGUMX触发2.5 EMIOSBCTUHWADC硬件EMIOS BCTU触发2.6 EMIOSBCTUHW LISTADC硬件EMIOS …...

TransFormer 视频笔记

TransFormer BasicsAttention单头注意力 single head attentionQ&#xff1a; query 查寻矩阵 128*12288K key matrix 128*12288SoftMax 归一 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/19e3cf1ea28442eca60d5fc1303921f4.png)Value matrix 12288*12288 MLP Bas…...

前端的混合全栈之路Meteor篇(三):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统

Meteor 3.0 是一个功能强大的全栈 JavaScript 框架&#xff0c;特别适合实时应用程序的开发。它的核心机制之一就包括发布-订阅&#xff08;Publish-Subscribe&#xff09;模型&#xff0c;它允许服务器端发布数据&#xff0c;客户端订阅并实时更新。本文将介绍如何在 Meteor 3…...

自动驾驶系列—颠覆未来驾驶:深入解析自动驾驶线控转向系统技术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

Webstorm 中对 Node.js 后端项目进行断点调试

首先&#xff0c;肯定需要有一个启动服务器的命令脚本。 然后&#xff0c;写一个 debug 的配置&#xff1a; 然后&#xff0c;debug 模式 启动项目和 启动调试服务&#xff1a; 最后&#xff0c;发送请求&#xff0c;即可调试&#xff1a; 这几个关键按钮含义&#xff1a; 重启…...

VUE前后端分离毕业设计题目项目有哪些,VUE程序开发常见毕业论文设计推荐

目录 0 为什么选择Vue.js 1 Vue.js 的主要特点 2 前后端分离毕业设计项目推荐 3 后端推荐 4 总结 0 为什么选择Vue.js 使用Vue.js开发计算机毕业设计是一个很好的选择&#xff0c;因为它不仅具有现代前端框架的所有优点&#xff0c;还能让你专注于构建高性能、高可用性的W…...

一、Spring Boot集成Spring Security之自动装配

Spring Boot集成Spring Security之自动装配介绍 一、实现功能及软件版本说明二、创建Spring Boot项目三、查看自动装配配置类四、自动装配配置类之SecurityAutoConfiguration1、SecurityAutoConfiguration部分源码2、主要作用3、SpringBootWebSecurityConfiguration3.1、Spring…...

计数相关的题 Python 力扣

2284. 最多单词数的发件人 给你一个聊天记录&#xff0c;共包含 n 条信息。给你两个字符串数组 messages 和 senders &#xff0c;其中 messages[i] 是 senders[i] 发出的一条 信息 。 一条 信息 是若干用单个空格连接的 单词 &#xff0c;信息开头和结尾不会有多余空格。发件…...

Express内置的中间件(express.json和express.urlencoded)格式的请求体数据

目录 Express内置的中间件 express.json 中间件的使用 express.urlencoded 中间件的使用 express.urlencoded([options]) 解析req.body的兼容写法 Express内置的中间件 自 Express 4.16.0 版本开始&#xff0c;Express 内置了 3 个常用的中间件&#xff0c;极大的提高了 …...

cmakelist加载Qt模块

Qt编程中&#xff0c;cmakelist会自动添加Core&#xff0c;Gui&#xff0c;Widgets模块&#xff0c;有时需要添加新的Qt的模块。在命令find_package中搜索要新增的模块&#xff0c;在命令target_link_libraries中添加要新增的模块。 比如要使用QUiLoader类&#xff0c;要增加对…...

8-2.Android 任务之 CountDownTimer 编码模板(开启计时器、取消计时器)

一、CountDownTimer 1、概述 CountDownTimer 是 Android 中一个用于执行定时操作的类 CountDownTimer 主要应用于在指定时间段内完成某项任务&#xff0c;或者每隔一段时间触发某项任务 2、使用步骤 创建 CountDownTimer&#xff1a;创建 CountDownTimer 就是创建它的匿名…...

Servlet的生命周期及用户提交表单页面的实现(实验报告)

一、实验目的、要求 1. 掌握Servlet的定义&#xff0c;即Servlet是运行在服务器端的Java程序&#xff0c;用于扩展服务器的功能。 2. 学习和掌握在开发环境中搭建Servlet应用所需的工具&#xff0c;如Tomcat服务器、IDEA等。 二、实验内容 根据本章所学知识&#xff0c;实验…...

【Router】路由功能之IP过滤(IP Filter)功能(基于端口)介绍及实现

IP过滤(IP Filter) IP Filter是一种通过对网络数据包中的 IP 地址进行分析和筛选,以实现对网络流量的控制和管理的技术。 IP过滤(IP Filter)作用 安全防护 可以阻止来自特定 IP 地址或 IP 地址范围的恶意攻击、非法访问等,增强网络的安全性。 流量管理 根据不同的 IP …...

数据结构_2.2、顺序表插入删除查找

1、线性表的顺序存储表示定义&#xff1a; 线性表&#xff1a;是具有相同数据类型的n &#xff08;n≥0&#xff09;个数据元素的有限序列 顺序表&#xff1a;用顺序存储的方式实现线性表 顺序存储&#xff1a;把逻辑上相邻的元素存储在物理 位置上也相邻的存储单元中&#…...

嵌入式C语言自我修养:编译链接

源文件生成可执行文件的过程&#xff1f; 源文件经过预处理、编译、汇编、链接生成一个可执行的目标文件。 编译器驱动程序&#xff0c;包括预处理器、编译器、汇编器和链接器。Linux用户可以调用GCC驱动程序来完成整个编译流程。 使用GCC驱动程序将示例程序从ASCII码源文件转换…...

Mac制作Linux操作系统启动盘

前期准备 一个 Mac 电脑 一个 U 盘&#xff08;8GB 以上&#xff09; 下载好 Linux 系统镜像&#xff08;iso 文件&#xff09; 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘&#xff0c;打开终端输入下面的命令查看 U 盘是否已经 m…...

PHP语言发展历程

PHP是一种开源的服务器端脚本语言&#xff0c;主要用于Web开发&#xff0c;最初由Rasmus Lerdorf在1994年创建。PHP的发展历程如下&#xff1a; PHP的起源&#xff1a;1994年&#xff0c;Rasmus Lerdorf创建了PHP的第一个版本&#xff0c;最初是一套用于跟踪他个人简历访问的C…...

Notepad++ 之 AndroidLogger插件

背景 最近一段时间在分析Android log 定位问题&#xff0c;Notepad 之前用的比较少&#xff0c;现在看log觉得确实好用&#xff0c;美中不足的是 看Android log的时候不像 logcat -v color 可以区分不同等级的颜色&#xff0c;于是调研了一下&#xff0c;发现大部分都是使用An…...

开源2+1链动模式AI智能名片O2O商城小程序源码:线下店立体连接的超强助力器

摘要&#xff1a;本文将为您揭示线下店立体连接的重大意义&#xff0c;您知道吗&#xff1f;线上越火&#xff0c;线下就得越深入经营。现代门店可不再只是卖东西的地儿&#xff0c;还得连接KOC呢&#xff01;咱们来看看门店要做的那些超重要的事儿&#xff0c;还有开源21链动模…...

我为什么决定关闭ChatGPT的记忆功能?

你好&#xff0c;我是三桥君 几个月前&#xff0c;ChatGPT宣布即将推出一项名为“记忆功能”的新特性&#xff0c;英文名叫memory。 这个功能听起来相当吸引人&#xff0c;宣传口号是让GPT更加了解用户&#xff0c;仿佛是要为我们每个人量身打造一个专属的AI助手。 在记忆功…...

如何使用ssm实现中学生课后服务的信息管理与推荐+vue

TOC ssm766中学生课后服务的信息管理与推荐vue 第一章 绪论 1.1 选题背景 目前整个社会发展的速度&#xff0c;严重依赖于互联网&#xff0c;如果没有了互联网的存在&#xff0c;市场可能会一蹶不振&#xff0c;严重影响经济的发展水平&#xff0c;影响人们的生活质量。计算…...

【分别为微服务云原生】9分钟ActiveMQ延时消息队列:定时任务的革命与Quartz的较量

ActiveMQ延时消息队列&#xff1a;定时任务的革命与Quartz的较量 摘要&#xff1a; 在现代的消息驱动架构中&#xff0c;ActiveMQ的延迟消息队列功能为定时任务提供了一种新的解决方案。本文将详细介绍ActiveMQ延迟消息队列的功能、应用场景&#xff0c;并与Quartz定时任务进行…...

泛型编程--模板【C++提升】(特化、类属、参数包的展开、static、模板机制、重载......你想知道的全都有)

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; C系列语法知识_Stark、的博客-CSDN博客 其它专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 C系列项目实战_Stark、的博客-CSDN博客 座右铭&#xff1a;梦…...

安卓使用memtester进行内存压力测试

memteser简介 memtester 是一个用于测试内存可靠性的工具。 它可以对计算机的内存进行压力测试&#xff0c;以检测内存中的错误&#xff0c;例如位翻转、随机存取错误等。memtester 可以在不同的操作系统上运行&#xff0c;并且可以针对不同大小的内存进行测试。 下载源码 m…...

Dave Cheney: Go语言之禅

本篇内容是根据2020年3月份The Zen of Go音频录制内容的整理与翻译, Dave Cheney 讲述了 Go 之禅&#xff08;编写简单、可读、可维护的 Go 代码的十个工程价值&#xff09;。是什么让 Go 代码变得优秀&#xff1f;编写 Go 代码时&#xff0c;我们应该牢记哪些指导原则&#x…...

SpringMVC源码-AbstractUrlHandlerMapping处理器映射器将实现Controller接口的方式定义的路径存储进去

DispatcherServlet的initStrategies方法用来初始化SpringMVC的九大内置组件 initStrategies protected void initStrategies(ApplicationContext context) {// 初始化 MultipartResolver:主要用来处理文件上传.如果定义过当前类型的bean对象&#xff0c;那么直接获取&#xff0…...

满填充透明背景二维码生成

前几天项目上线的时候发现一个问题&#xff1a;通过Hutool工具包生成的二维码在内容较少时无法填满(Margin 已设置为 0)给定大小的图片。因此导致前端在显示二维码时样式异常。 从图片中我们可以看到&#xff0c;相同大小的图片&#xff0c;留白内容是不一样的。其中上半部分…...

Python | Leetcode Python题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if not points:return 0points.sort(keylambda balloon: balloon[1])pos points[0][1]ans 1for balloon in points:if balloon[0] > pos:pos balloo…...

代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作删除二叉搜索树中的节点修剪二叉搜索树

代码随想录 | Day26 | 二叉树&#xff1a;二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树 主要学习内容&#xff1a; 二叉搜索树的插入删除操作 701.二叉搜索树中的插入操作 701. 二叉搜索树中的插入操作 - 力扣&#xff08;LeetCode&…...

使用Apifox创建接口文档,部署第一个简单的基于Vue+Axios的前端项目

前言 在当今软件开发的过程中&#xff0c;接口文档的创建至关重要&#xff0c;它不仅能够帮助开发人员更好地理解系统架构&#xff0c;还能确保前后端开发的有效协同。Apifox作为一款集API文档管理、接口调试、Mock数据模拟为一体的工具&#xff0c;能够大幅度提高开发效率。在…...