MSP430F5529库函数——模数转换模块(ADC12)软件触发

news2025/7/8 8:48:34

需提前观看:MSP430F5529库函数学习——串口

 

目录

代码

ADC初始化部分

引脚复位

ADC12_A_init()

函数声明

baseAddress

sampleHoldSignalSourceSelect

clockSourceSelec

clockSourceDivider

ADC12_A_enable()

ADC12_A_setupSamplingTimer()

ADC12_A_configureMemory()

memoryBufferControlIndex

 inputSourceSelect

positiveRefVoltageSourceSelect和negativeRefVoltageSourceSelect

endOfSequence

电压信号读取部分

ADC12_A_startConversion()

函数声明

baseAddress

startingMemoryBufferIndex

conversionSequenceModeSelect

ADC12_A_isBusy()

ADC12_A_getResults()

return


我这里的代码意思是利用P6.0口作为ADC采集,利用软件触发的方式进行采集信号。每过1S采集一次ADC信号。并将ADC的值转换为电压值发送给上位机。

代码

#include "driverlib.h"
#include <string.h>
#include <stdarg.h>
#include <stdio.h>

#define MCLK_IN_HZ      1000000
#define delay_us(x)     __delay_cycles((MCLK_IN_HZ/1000000*(x)))
#define delay_ms(x)     __delay_cycles((MCLK_IN_HZ/1000*(x)))

void setupADC(void);
unsigned long readADC(void);

void UART_printf(uint16_t baseAddress, const char *format,...);
void Usart1_Init();

//--------------------------------  m a i n  -----------------------------------
int main(void) 
{

    WDT_A_hold(WDT_A_BASE);
    Usart1_Init();
    setupADC();

    while(1)
    {
        delay_ms(1000);
        UART_printf(USCI_A1_BASE,"Result = %d mV\n", readADC());
    }
}
//-----------------------------  s e t u p A D C  -------------------------------
void setupADC(void){

    #define ADCpin         GPIO_PORT_P6,GPIO_PIN0

    GPIO_setAsPeripheralModuleFunctionOutputPin(ADCpin);     // 复位P6.0

    //Initialize the ADC12_A Module
    /*
     * ADC12_A模块的基址
     * 软件触发
     * 使用MODOSC 5MHZ数字振荡器作为时钟源
     * 一分频
     */
    ADC12_A_init(ADC12_A_BASE,ADC12_A_SAMPLEHOLDSOURCE_SC, ADC12_A_CLOCKSOURCE_ADC12OSC, ADC12_A_CLOCKDIVIDER_1);  //软件触发,内部振荡器MODCLK作为时钟

    ADC12_A_enable(ADC12_A_BASE);   //启用ADC12_A模块
    //设置并启用采样定时器脉冲,这里是使用的软件触发的形式,所以选择失能
    ADC12_A_setupSamplingTimer(ADC12_A_BASE,ADC12_A_CYCLEHOLD_16_CYCLES,ADC12_A_CYCLEHOLD_16_CYCLES,ADC12_A_MULTIPLESAMPLESDISABLE);

    ADC12_A_configureMemoryParam param = {0};
    param.memoryBufferControlIndex = ADC12_A_MEMORY_0;           //将内存缓冲配置为MEMORY_0
    param.inputSourceSelect = ADC12_A_INPUT_A0;                  //将输入A0映射到内存缓冲区0,因为P6.0引脚对应A0
    param.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_AVCC; //正电压为AVcc
    param.negativeRefVoltageSourceSelect = ADC12_A_VREFNEG_AVSS; //负电压为AVss
    param.endOfSequence = ADC12_A_NOTENDOFSEQUENCE;              //单通道转换

    ADC12_A_configureMemory(ADC12_A_BASE,&param);   //
}
//-----------------------------  r e a d A D C  --------------------------------
unsigned long readADC(void){

    //开始从MEMORY_0中进行单通道连续转换
    ADC12_A_startConversion(ADC12_A_BASE,ADC12_A_MEMORY_0,ADC12_A_SINGLECHANNEL);

    while(ADC12_A_isBusy(ADC12_A_BASE) == ADC12_A_BUSY){
        // 等待转换完成
    }
    //读取ADC转换之后寄存器的值
    long result = ADC12_A_getResults(ADC12_A_BASE, ADC12_A_MEMORY_0);
    //将其转化为单位为mv的电压值
    return (3220 * result) / 4096;                     // 3320是测量的Vss

}



void UART_printf(uint16_t baseAddress, const char *format,...)
{
    uint32_t length;
    va_list args;
    uint32_t i;
    char TxBuffer[128] = {0};

    va_start(args, format);
    length = vsnprintf((char*)TxBuffer, sizeof(TxBuffer)+1, (char*)format, args);
    va_end(args);

    for(i = 0; i < length; i++)
        USCI_A_UART_transmitData(baseAddress, TxBuffer[i]);
}

//9600
void Usart1_Init()
{
    //P4.4=UCA1TXD      P4.5=UCA1RXD
    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P4, GPIO_PIN5+GPIO_PIN4);

    USCI_A_UART_initParam param1 = {0};
    param1.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;
    param1.clockPrescalar = 6;
    param1.firstModReg = 13;
    param1.secondModReg = 0;
    param1.parity = USCI_A_UART_NO_PARITY;   //无校验位
    param1.msborLsbFirst = USCI_A_UART_LSB_FIRST;  //低位先行
    param1.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;  //1停止位
    param1.uartMode = USCI_A_UART_MODE;
    param1.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;

    if (STATUS_FAIL == USCI_A_UART_init(USCI_A1_BASE, &param1)){
       return;
    }
    //Enable UART module for operation
    USCI_A_UART_enable(USCI_A1_BASE);

    //Enable Receive Interrupt
    USCI_A_UART_clearInterrupt(USCI_A1_BASE,USCI_A_UART_RECEIVE_INTERRUPT);
    USCI_A_UART_enableInterrupt(USCI_A1_BASE,USCI_A_UART_RECEIVE_INTERRUPT);
}

ADC初始化部分

引脚复位

首先我们复位P6.0,为什么复位P6.0。因为ADC具有12个外部采集功能的引脚,如下。

 

ADC12_A_init()

我们这里采用软件触发的方式进行ADC采集。软件触发的意思是,需要我们在写程序的时候,写入一个ADC开始采集的程序,他才会采集电压信号。ADC采集的时钟源是使用MODOSC 5MHZ数字振荡器。不进行分频 

ADC12_A_init(ADC12_A_BASE,ADC12_A_SAMPLEHOLDSOURCE_SC, ADC12_A_CLOCKSOURCE_ADC12OSC, ADC12_A_CLOCKDIVIDER_1);  //软件触发,内部振荡器MODCLK作为时钟

函数声明

函数声明如下,这里返回的是一个布尔值。如果ADC初始化成功了返回STATUS_SUCCESS(也就是1),如果ADC初始化失败了返回0。我们没有进行接收他的数值,一般不需要接收,因为ADC初始化失败的可能性很小。

bool ADC12_A_init (uint16_t baseAddress,uint16_t sampleHoldSignalSourceSelect, uint8_t clockSourceSelect,uint16_t clockSourceDivider)

baseAddress

ADC12只有一个基地址

ADC12_A_BASE

sampleHoldSignalSourceSelect

选择触发信号ADC进行电压采集有四种触发方式,参数如下

#define ADC12_A_SAMPLEHOLDSOURCE_SC                                (ADC12SHS_0)//软件触发
#define ADC12_A_SAMPLEHOLDSOURCE_1                                 (ADC12SHS_1)//定时器1触发
#define ADC12_A_SAMPLEHOLDSOURCE_2                                 (ADC12SHS_2)//定时器2触发
#define ADC12_A_SAMPLEHOLDSOURCE_3                                 (ADC12SHS_3)//定时器3触发

第一种是ADC12SC触发,也就是软件触发。

二三四种是利用定时器触发ADC采集,定时器触发的好处是,我们不需要占用CPU,让他自己每隔一段时间主动触发ADC采集。但是缺点是,不够灵活,他不能做到我们想采集电压就采集,不想采集就不采集。

至于我们想知道这个ADC12SHSx的定时器采集是哪几个定时器,不同芯片情况不同我们需要看引脚功能数据表,按Ctrl+F搜索ADC12SHSx即可出现如下(注意,我这里只提供MSP430F5529的,其他型号的自己去找)。

clockSourceSelec

这个是选择ADC的时钟源,一般选择内部震荡器

#define ADC12_A_CLOCKSOURCE_ADC12OSC                              (ADC12SSEL_0)//内部振荡器
#define ADC12_A_CLOCKSOURCE_ACLK                                  (ADC12SSEL_1)
#define ADC12_A_CLOCKSOURCE_MCLK                                  (ADC12SSEL_2)
#define ADC12_A_CLOCKSOURCE_SMCLK                                 (ADC12SSEL_3)

clockSourceDivider

选择分频次数,一般选择不分频。

#define ADC12_A_CLOCKDIVIDER_1                                     (ADC12DIV_0)
#define ADC12_A_CLOCKDIVIDER_2                                     (ADC12DIV_1)
#define ADC12_A_CLOCKDIVIDER_3                                     (ADC12DIV_2)
#define ADC12_A_CLOCKDIVIDER_4                                     (ADC12DIV_3)
#define ADC12_A_CLOCKDIVIDER_5                                     (ADC12DIV_4)
#define ADC12_A_CLOCKDIVIDER_6                                     (ADC12DIV_5)
#define ADC12_A_CLOCKDIVIDER_7                                     (ADC12DIV_6)
#define ADC12_A_CLOCKDIVIDER_8                                     (ADC12DIV_7)
#define ADC12_A_CLOCKDIVIDER_12                        (ADC12DIV_2 + ADC12PDIV)
#define ADC12_A_CLOCKDIVIDER_16                        (ADC12DIV_3 + ADC12PDIV)
#define ADC12_A_CLOCKDIVIDER_20                        (ADC12DIV_4 + ADC12PDIV)
#define ADC12_A_CLOCKDIVIDER_24                        (ADC12DIV_5 + ADC12PDIV)
#define ADC12_A_CLOCKDIVIDER_28                        (ADC12DIV_6 + ADC12PDIV)
#define ADC12_A_CLOCKDIVIDER_32                        (ADC12DIV_7 + ADC12PDIV)

ADC12_A_enable()

这个是用于启动ADC的,只需要传入ADC12_A_BASE就可以启动ADC12_A模块了。

ADC12_A_setupSamplingTimer()

这个跟定时器触发有关,所以不讲,只要记得第四个参数选择ADC12_A_MULTIPLESAMPLESDISABLE即可。因为我们是软件触发

ADC12_A_configureMemory()

这个需要传入ADC的基地址和结构体,基地址还是相同的。只讲结构体

    ADC12_A_configureMemoryParam param = {0};
    param.memoryBufferControlIndex = ADC12_A_MEMORY_0;           //将内存缓冲配置为MEMORY_0
    param.inputSourceSelect = ADC12_A_INPUT_A0;                  //将输入A0映射到内存缓冲区0,因为P6.0引脚对应A0
    param.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_AVCC; //正电压为AVcc
    param.negativeRefVoltageSourceSelect = ADC12_A_VREFNEG_AVSS; //负电压为AVss
    param.endOfSequence = ADC12_A_NOTENDOFSEQUENCE;              //单通道转换

memoryBufferControlIndex

这个是负责配置我们ADC采集之后的数值存入哪里。如果是单通道随便选择一个就可以了,建议选择通道ADC12_A_MEMORY_0

#define ADC12_A_MEMORY_0                                                  (0x0)
#define ADC12_A_MEMORY_1                                                  (0x1)
#define ADC12_A_MEMORY_2                                                  (0x2)
#define ADC12_A_MEMORY_3                                                  (0x3)
#define ADC12_A_MEMORY_4                                                  (0x4)
#define ADC12_A_MEMORY_5                                                  (0x5)
#define ADC12_A_MEMORY_6                                                  (0x6)
#define ADC12_A_MEMORY_7                                                  (0x7)
#define ADC12_A_MEMORY_8                                                  (0x8)
#define ADC12_A_MEMORY_9                                                  (0x9)
#define ADC12_A_MEMORY_10                                                 (0xA)
#define ADC12_A_MEMORY_11                                                 (0xB)
#define ADC12_A_MEMORY_12                                                 (0xC)
#define ADC12_A_MEMORY_13                                                 (0xD)
#define ADC12_A_MEMORY_14                                                 (0xE)
#define ADC12_A_MEMORY_15                                                 (0xF)

 inputSourceSelect

这个是选择我们采集的电压通道口,上面说了ADC只有12个外部信号采集口。因为我们上面复位的是P6.0所以这里是选择ADC12_A_INPUT_A0。

 可选参数如下

#define ADC12_A_INPUT_A0                                          (ADC12INCH_0)
#define ADC12_A_INPUT_A1                                          (ADC12INCH_1)
#define ADC12_A_INPUT_A2                                          (ADC12INCH_2)
#define ADC12_A_INPUT_A3                                          (ADC12INCH_3)
#define ADC12_A_INPUT_A4                                          (ADC12INCH_4)
#define ADC12_A_INPUT_A5                                          (ADC12INCH_5)
#define ADC12_A_INPUT_A6                                          (ADC12INCH_6)
#define ADC12_A_INPUT_A7                                          (ADC12INCH_7)
#define ADC12_A_INPUT_A8                                          (ADC12INCH_8)
#define ADC12_A_INPUT_A9                                          (ADC12INCH_9)
#define ADC12_A_INPUT_TEMPSENSOR                                 (ADC12INCH_10)
#define ADC12_A_INPUT_BATTERYMONITOR                             (ADC12INCH_11)
#define ADC12_A_INPUT_A12                                        (ADC12INCH_12)
#define ADC12_A_INPUT_A13                                        (ADC12INCH_13)
#define ADC12_A_INPUT_A14                                        (ADC12INCH_14)
#define ADC12_A_INPUT_A15                                        (ADC12INCH_15)

positiveRefVoltageSourceSelect和negativeRefVoltageSourceSelect

 这两个是选择参考电压的,可以是内部电压为参考电压,也可以是外部的。本人只会内部的,所以只讲内部电压作为参考电压。直接如下即可

    param.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_AVCC; //正电压为AVcc,为3320mV
    param.negativeRefVoltageSourceSelect = ADC12_A_VREFNEG_AVSS; //负电压为AVss,为0mV

endOfSequence

这个ADC采集可以是序列通道采集和单通道采集。我这里选择的是单通道采集,序列通道采集。序列通道采集就是很多个通道一起采集信号。我这里只讲单通道采集

#define ADC12_A_NOTENDOFSEQUENCE                                  (!(ADC12EOS))//单通道采集
#define ADC12_A_ENDOFSEQUENCE                                        (ADC12EOS)//多通道采集

电压信号读取部分

ADC12_A_startConversion()

这里是开启ADC采集的。

函数声明

void ADC12_A_startConversion (uint16_t baseAddress, uint16_t startingMemoryBufferIndex, uint8_t conversionSequenceModeSelect)

baseAddress

同上

startingMemoryBufferIndex

设置需要开始转换的信号。因为我们之前将ADC采集的信号存入MEMORY_0,所以这里选择ADC12_A_MEMORY_0。可选参数如下

#define ADC12_A_MEMORY_0                                                  (0x0)
#define ADC12_A_MEMORY_1                                                  (0x1)
#define ADC12_A_MEMORY_2                                                  (0x2)
#define ADC12_A_MEMORY_3                                                  (0x3)
#define ADC12_A_MEMORY_4                                                  (0x4)
#define ADC12_A_MEMORY_5                                                  (0x5)
#define ADC12_A_MEMORY_6                                                  (0x6)
#define ADC12_A_MEMORY_7                                                  (0x7)
#define ADC12_A_MEMORY_8                                                  (0x8)
#define ADC12_A_MEMORY_9                                                  (0x9)
#define ADC12_A_MEMORY_10                                                 (0xA)
#define ADC12_A_MEMORY_11                                                 (0xB)
#define ADC12_A_MEMORY_12                                                 (0xC)
#define ADC12_A_MEMORY_13                                                 (0xD)
#define ADC12_A_MEMORY_14                                                 (0xE)
#define ADC12_A_MEMORY_15                                                 (0xF)

conversionSequenceModeSelect

这个是选择ADC开启的模式。有四种模式,如下。

说白了就是一个多通道和单通道,多通道可以多个通道一起进行ADC电压信号采集,比如P6.0和P6.1同时进行ADC电压采集,而单通道只有一个引脚进行ADC电压信号采集。

然后单次采样和多次采样的区别是,如果我们选择的单次采样,那么每次进行ADC采样都需要一次触发。但是如果是多次采样,那么我们只需要一次触发,那么他就会持续采样转换,如果此次电压转换之后的信号不马上读取,会被下一次转换之后的信号覆盖。因为我们这里选择的软件触发,我们我个人建议选择单次采样,这样我们的电压采样转换的信号就不会被覆盖,同时可以降低功耗。

#define ADC12_A_SINGLECHANNEL                               (ADC12CONSEQ_0)//单通道单次采样
#define ADC12_A_SEQOFCHANNELS                               (ADC12CONSEQ_1)//多通道单次采样
#define ADC12_A_REPEATED_SINGLECHANNEL                      (ADC12CONSEQ_2)//单通道循环采样
#define ADC12_A_REPEATED_SEQOFCHANNELS                      (ADC12CONSEQ_3)//多通道循环采样

ADC12_A_isBusy()

我们电压信号采集之后,需要给他一个时间等待将电压信号转换为数字信号(01这种)。当还在转换过程的时候,他会返回ADC12_A_BUSY。所以我们需要持续调用这个函数,等待转换结束。

ADC12_A_getResults()

获取当前ADC采样之后的值,因为我们上面选择是将转换信号存入MEMORY_0,所以这里选择ADC12_A_MEMORY_0。

return

我们最后需要返回一个值。因为我们上面选择的参考电压为AVcc和AVss。所以电压范围为0-3320mV。因为我们这个ADC是一个12位的,所以寄存器中的存储最大值是2^{12}=4096。当采集到的电压为0V时候,寄存器为0。当采集到电压为3320mV的时候,寄存器的值为4095。所以我们返回值为(3220 * result) / 4096;,至于为什么是4096,因为我们是从0开始计算。

串口配置

注意,这部分我就提醒一下。我们是需要进行浮点数据打印的,所以我们看MSP430F5529库函数学习——串口的时候,需要按照浮点数据打印这一部分配置!

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

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

相关文章

有关javascript中事件对象e

一、简单认识e 事件对象e&#xff0c;是event的简称。当一个事件被触发时候&#xff0c;这个事件的有关数据都会被存储在一个事件对象e里面&#xff0c;这个对象e有许多固定方法提供给我们查看里面各种数据。 二、关于e对象的常用属性介绍 1. e.eventPhase查看事件触发所处的阶…

MySQL索引原理笔记

注意&#xff1a;本博客为个人学习记录&#xff0c;不保证正确性&#xff0c;仅供参考指正 MySQL索引原理以及SQL优化 文章目录MySQL索引原理以及SQL优化索引与约束覆盖索引最左匹配规则索引下推&#xff08;面试重点&#xff09;索引存储索引失效如何解决sql比较慢的问题索引…

【JavaWeb】JSP(172-190)

172.Jsp-什么是jsp&#xff0c;以及它有什么作用 jsp 的全换是 java server pages。Java 的服务器页面。 jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据。 因为 Servlet 程序回传 html 页面数据是一件非常繁锁的事情。开发成本和维护成本都极高。 Servlet 回传 htm…

大白话讲解MySQL 索引,页分裂,行溢出,事务

目录 一、索引 索引是什么&#xff0c;页分裂 页的结构 mysql怎么查询数据 二、页合并 三、行溢出 四、事务 事务四大特性 1、原子性 2、一致性 3、隔离性 4、持久性 事务隔离级别 隔离级别导致的问题 隔离级别与锁的关系 锁与快照读、当前读的关系 RR快照读与…

网页信息采集-网页数据采集方法

随着社会不停的发展。人们也是越来越离不开互联网&#xff0c;今天小编就给大家盘点一下免费的网页信息采集&#xff0c;只需要点几下鼠标就能轻松爬取数据&#xff0c;不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四&#xff01; 企业人员 通过爬取动…

[附源码]计算机毕业设计JAVA创意众筹网站

[附源码]计算机毕业设计JAVA创意众筹网站 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

JavaScript历史上的今天是星期几

前言 &#x1f44f;这个案例有很多点是我之前不知道的&#xff08;因为是小白&#xff09;&#xff0c;所以很值得学习&#xff0c; ✍编程不是打字机&#xff0c;⭐争取明白每个细节&#xff0c;并努力做的更好 步骤 1.html布局&#xff0c;一个下拉菜单&#xff08;如图&…

独家巨献!阿里专家兼Github贡献者业“大师级Dubbo实战笔记”入门到成神

Apache Dubbo是一款RPC服务开发框架&#xff0c;那何为RPC呢&#xff1f;全称为Remote Procedure Call&#xff0c;翻译过来就是远程过程调用。 使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo 提供的丰富服务治理特性&#xff0c;可…

ZYNQ使用AXI4-HP接口总线读取DDR中的数据

一、前言 最近笔者在做项目的时候需要使用zynq中的AXI4-HP总线在PL端读取DDR中的数据这种功能&#xff0c;但是网上很多历程对于这方面只是创建了一个官方提供的IP核用于测试&#xff0c;并且每次写入和读取的长度为4K字节。所以为了满足我自己的项目需求&#xff0c;笔者将官…

电脑桌面图标不见了怎么回事?正确的找回图标的2个方案

最近遇到很多用户朋友说自己的电脑桌面图标不见了&#xff0c;觉得很奇怪。用户以为是系统原因造成的。电脑桌面图标不见了怎么回事&#xff1f;图标删除了怎么办&#xff1f;这篇文章就给大家分享如何找回电脑桌面消失的图标&#xff0c;一起来看看吧&#xff01; 一、找回电脑…

DTPA PEG 异硫氰酸荧光素,DTPA PEG FITC,FITC-PEG-DTPA

产品名称&#xff1a;DTPA PEG 异硫氰酸荧光素 英文名称&#xff1a;DTPA PEG FITC&#xff0c;FITC-PEG-DTPA CAS&#xff1a;668-000-2 产地&#xff1a;西安 规格&#xff1a;1mg 5mg 10mg 纯度&#xff1a;99% 厂家&#xff1a;西安齐岳生物科技有限公司 用途&#…

arthas的监控java性能

目录1 arthas简介2 arthas下载3 arthas的使用3.1 arthas启动3.2 常用命令3.2.1 dashboard3.2.2 thread3.2.3 jad3.2.4 watch3.2.5 getstatic3.2.6 heapdump3.2.6.1 dump到指定的文件3.2.6.2 dump live 对象3.2.6.3 dump 到临时文件3.2.7 jvm3.2.8 logger3.2.9 mbean3.2.9.1 列出…

Baklib|我的企业是不是需要一个维基页面呢?

你很可能已经听说过维基百科。事实上&#xff0c;我们大多数人几乎每天都在使用维基百科来获取有关历史事件、名人或世界各地的有用信息。但是你知道公司也可以创建和维护他们自己的wiki页面吗? 随着时间的推移&#xff0c;公司会积累大量的信息。如果没有一个好的方法来存储…

Java:为什么要更新Java应用程序?

27年来&#xff0c;Java一直是企业软件开发中最流行的编程语言之一。世界上无数的系统都是使用这种广为人知的语言构建的。 传统的Java应用程序是独一无二的。它们的包中包含了运行应用程序所需的一切&#xff0c;但整体性使得开发人员在进行更改时很难保持敏捷。开发人员必须从…

项目实战——实现注册与登录模块(结尾)

目录 一、整体框架 二、前端页面授权 三、实现注册页面 四、实现登录状态的持久化 一、整体框架 二、前端页面授权 当我们登录网站的时候&#xff0c;如果没有登录&#xff0c;强制让用户重定向到 登录界面 在 router 目录下的 index.js 文件下实现。 router -> index.js…

DIVFusion:首个耦合互促低光增强图像融合的框架

DIVFusion:首个耦合互促低光增强&图像融合的框架DIVFusion:首个耦合互促低光增强&图像融合的框架写在前面问题引入Motivation主要贡献网络架构实验验证融合性能目标检测性能消融实验结论写在最后DIVFusion:首个耦合互促低光增强&图像融合的框架 论文&#xff1a;h…

攻防世界Running

Running 题目描述&#xff1a;无 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87016663 一个可执行文件&#xff0c;执行后显示error&#xff0c;尝试binwalk文件分离。 命令&#xff1a;binwalk -e run.exe浏览分离出来的文件。 末尾发现一个run.ex…

mannose-CHO|甘露糖-醛基|甘露糖-聚乙二醇-醛基|醛基-PEG-甘露糖

mannose-CHO|甘露糖-醛基|甘露糖-聚乙二醇-醛基|醛基-PEG-甘露糖 羰基中的一个共价键跟氢原子相连而组成的一价原子团&#xff0c;叫做醛基&#xff0c;醛基结构简式是-CHO&#xff0c;醛基是亲水基团&#xff0c;因此有醛基的有机物&#xff08;如乙醛等&#xff09;有一定的…

APS高级排产软件在快消品行业的应用

快消行业是指消费频率高、使用时限短、拥有广泛的消费群体、对于消费的便利性要求很高的商品销售行业。快消行业的销售渠道种类多而复杂&#xff0c;传统业态和新兴业态等多种渠道并存。快消行业集中度逐步上升&#xff0c;竞争度加大。 随着快速消费品市场的复苏&#xff0c;经…

CNN学习笔记

目录 如何理解卷积层和池化层&#xff1f; 机器视角&#xff1a;长文揭秘图像处理和卷积神经网络架构 卷积神经网络 - 基础知识 激活函数的作用是什么&#xff1f; 激活函数&#xff08;加入非线性因素&#xff09; 提高模型鲁棒性&#xff08;抗干扰能力&#xff09;&#…