LLC数字控制TMS320F28034,3-DSP的timer定时器配置介绍

news2024/9/22 17:38:09

***配套代码工程***

LLC数字控制TMS320F28034,3-DSP的timer定时器配置介绍

  • LLC数字控制TMS320F28034,3-DSP的timer定时器配置介绍
  • 1 TMS320F28034
    • 1.1 系统时钟大小
    • 1.2 TMS320F28034 芯片系统时钟源介绍
  • 2 时钟库函数说明示例
  • 3 TMS320F28034手写定时器功能
  • 4 定时器运用
  • 5 工程代码
  • 6 定时器中断总结


***配套代码工程***

LLC数字控制TMS320F28034,3-DSP的timer定时器配置介绍

***配套代码工程***

1 TMS320F28034

1.1 系统时钟大小

TMS320F28034 的系统时钟即为其主频。根据第一节手册的介绍,该系统时钟的最大值为 60MHz。在实际工程应用中,为了防止系统在满频时出现不稳定的运行状况,通常会将时钟频率降低一些,例如配置为 56MHz 或 40MHz。当然,具体的配置需要根据各功能模块的需求,合理地设定主频大小。
在某些数字高速控制 PWM 的情况下,主频使用会比较高;
在某些高速通讯的情况下,主频使用也会比较高;
在需要系统快速响应的功能设计时,主频使用同样会比较高。

1.2 TMS320F28034 芯片系统时钟源介绍

在这里插入图片描述

TMS320F28034 是德州仪器(TI)生产的一款高性能数字信号处理器(DSP)。它具有多种时钟源,可以灵活地配置系统时钟,以满足不同应用场景的需求。
系统时钟源
TMS320F28034 提供了多个时钟源供用户选择,包括:

  1. 内部振荡器(Internal Oscillator)
    内部低频振荡器 (INTOSC1 和 INTOSC2):
    芯片内置两个低频振荡器,通常工作在 10MHz 左右。它们可以作为系统时钟的备用或低功耗模式下的时钟源。
  2. 外部晶振(External Crystal Oscillator)
    外部晶振:
    支持外部晶振输入,可以通过外部晶体或振荡器产生高精度的时钟信号。常用频率有 20MHz、25MHz 等。
  3. 外部时钟输入(External Clock Input)
    外部时钟输入 (XCLKIN):
    可以直接从外部输入时钟信号,灵活性较高,适用于对时钟源有特殊要求的应用场景。
  4. 零等待状态片上振荡器(Zero Wait-State On-Chip Oscillator)
    零等待状态片上振荡器:
    提供高性能的时钟源,适用于需要快速响应和高性能的应用。
    时钟配置
    为了满足不同应用的需求,TMS320F28034 提供了灵活的时钟配置选项:
    锁相环 (PLL):
    TMS320F28034 集成了一个锁相环 (PLL),可以将输入时钟频率倍增,以生成高频系统时钟。PLL 的倍频系数可以编程配置,以满足不同的频率需求。
    时钟分频器 (Clock Dividers):
    时钟分频器可以将高频系统时钟分频,生成适合不同模块使用的时钟信号。这使得系统能够在不同的功能模块之间合理分配时钟资源。
    应用场景
    高性能控制应用:
    在需要高性能和快速响应的控制应用中,可以使用外部晶振加锁相环的组合,生成高频系统时钟,以满足性能需求。
    低功耗应用:
    在低功耗应用中,可以使用内部振荡器或外部低频时钟源,减少功耗。
    灵活配置:
    根据具体应用需求,灵活配置系统时钟源和时钟频率,以实现最佳的系统性能和功耗平衡。
    以上是 TMS320F28034 芯片系统时钟源的简要介绍。通过合理配置时钟源和时钟频率,可以充分发挥该芯片的性能,满足各种应用场景的需求。

2 时钟库函数说明示例

TMS320F28034 芯片官方时钟库函数说明
TMS320F28034 是德州仪器(TI)生产的一款高性能数字信号处理器(DSP),用于嵌入式控制应用。TI 提供了丰富的库函数,以简化开发过程。以下是一些常用的与时钟配置相关的官方库函数说明。
库函数

  1. InitSysCtrl
    功能:初始化系统控制寄存器,包括启用时钟、配置PLL、设置系统时钟频率等。
    使用示例:
InitSysCtrl();
  1. InitPll
    功能:配置并启用锁相环 (PLL)。
    参数:
pllMult: PLL 的倍频系数。
clkDiv: 系统时钟分频系数。

使用示例:

InitPll(10, 2);  // 设置 PLL 倍频系数为 10,系统时钟分频系数为 2
  1. SetVCLK
    功能:设置外设时钟 (VCLK) 的分频系数。
    参数:
div: VCLK 的分频系数。

使用示例:

SetVCLK(2);  // 设置 VCLK 分频系数为 2
  1. InitPeripheralClocks
    功能:初始化外设时钟,启用所需的外设时钟。
    使用示例:
InitPeripheralClocks();
  1. DisablePeripheralClocks
    功能:禁用特定外设的时钟,以节省功耗。
    参数:
peripheral: 需要禁用时钟的外设。

使用示例:

DisablePeripheralClocks(SYSCTL_PERIPH_CLK_SPIA);  // 禁用 SPI A 的时钟
  1. EnablePeripheralClocks
    功能:启用特定外设的时钟。
    参数:
peripheral: 需要启用时钟的外设。

使用示例:

EnablePeripheralClocks(SYSCTL_PERIPH_CLK_SPIA);  // 启用 SPI A 的时钟
  1. SysClkOutConfig
    功能:配置系统时钟输出到外部引脚。
    参数:
clkOutDiv: 系统时钟输出的分频系数。

使用示例:

SysClkOutConfig(2);  // 设置系统时钟输出的分频系数为 2

示例代码
以下是一个完整的示例代码,展示如何使用上述库函数来配置系统时钟:

#include "F2803x_Device.h"
#include "F2803x_Examples.h"

void main(void)
{
    // 初始化系统控制
    InitSysCtrl();

    // 配置并启用 PLL
    InitPll(10, 2);  // 设置 PLL 倍频系数为 10,系统时钟分频系数为 2

    // 初始化外设时钟
    InitPeripheralClocks();

    // 启用特定外设时钟
    EnablePeripheralClocks(SYSCTL_PERIPH_CLK_SPIA);

    // 配置系统时钟输出到外部引脚
    SysClkOutConfig(2);  // 设置系统时钟输出的分频系数为 2

    while (1)
    {
        // 主循环
    }
}

通过使用这些库函数,开发者可以方便地配置 TMS320F28034 的时钟系统,以满足各种应用需求。详细的函数说明和更多使用示例可以参考 TI 官方提供的文档和示例代码。

3 TMS320F28034手写定时器功能

我们通过定时器配置,实现在主频60M情况下的两个定时器溢出中断功能,定时市场分别为20us和1ms定时器。
(1)首先我们选择内部时钟振荡器
(2)配置分频倍频系数

// Defines
//
//#define DSP28_DIVSEL   0      // Enable /4 for SYSCLKOUT
//#define DSP28_DIVSEL   1      // Disable /4 for SYSCKOUT
#define DSP28_DIVSEL   2      // Enable /2 for SYSCLKOUT
//#define DSP28_DIVSEL   3      // Enable /1 for SYSCLKOUT

#define DSP28_PLLCR   12    //Uncomment for 60 MHz devs [60 MHz=(10MHz * 12)/2]
//#define DSP28_PLLCR   11
//#define DSP28_PLLCR   10
//#define DSP28_PLLCR    9
//#define DSP28_PLLCR    8  //Uncomment for 40 MHz devs [40 MHz=(10MHz * 8)/2]
//#define DSP28_PLLCR    7
//#define DSP28_PLLCR    6
//#define DSP28_PLLCR    5
//#define DSP28_PLLCR    4
//#define DSP28_PLLCR    3
//#define DSP28_PLLCR    2
//#define DSP28_PLLCR    1
//#define DSP28_PLLCR    0  // PLL is bypassed in this mode
//

(3)定时器配置和中断配置

void FunTimerInit(void)
{
    EALLOW;  // This is needed to write to EALLOW protected registers
    //打开对应定时器时钟
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1;

    // CPU 定时器 0
    // 寄存器地址指针和各自计时器初始化:
    CpuTimer0.RegsAddr = &CpuTimer0Regs;
    // 定时器周期寄存器最大值初始化:
    CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
    // 预分频寄存器初始化为1 (SYSCLKOUT):
    CpuTimer0Regs.TPR.all  = 0;
    CpuTimer0Regs.TPRH.all = 0;
    // 确保定时器0停止:
    CpuTimer0Regs.TCR.bit.TSS = 1;
    // 重加载计数器周期值:
    CpuTimer0Regs.TCR.bit.TRB = 1;
    // 复位中断计时器:
    CpuTimer0.InterruptCount = 0;

    // CPU 定时器 1
    // 寄存器地址指针和各自计时器初始化:
    CpuTimer1.RegsAddr = &CpuTimer1Regs;
    // 定时器周期寄存器最大值初始化:
    CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;
    // 预分频寄存器初始化为1 (SYSCLKOUT):
    CpuTimer1Regs.TPR.all  = 0;
    CpuTimer1Regs.TPRH.all = 0;
    // 确保定时器1停止:
    CpuTimer1Regs.TCR.bit.TSS = 1;
    // 重加载计数器周期值:
    CpuTimer1Regs.TCR.bit.TRB = 1;
    // 复位中断计时器:
    CpuTimer1.InterruptCount = 0;

    //定时器时长配置
    //60:代表主频60M,
    //20:代表20us,
    //1000:代表1ms
    ConfigCpuTimer(&CpuTimer0,60,20);
    ConfigCpuTimer(&CpuTimer1,60,1000);
    StartCpuTimer0();
    StartCpuTimer1();

    PieVectTable.TINT0 = &CpuTimer0Isr;//往中断矢量表中填写定时器0一个指针
    PieVectTable.TINT1 = &CpuTimer1Isr;//往中断矢量表中填写定时器1一个指针


    //打开PIE组对应中断
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能第一组7通道定时器0
    IER |= M_INT1;  // Enable CPU INT
    IER |= M_INT13; //根据中断向量表使能定时器1

    EDIS;   // This is needed to disable write to EALLOW protected registers
}

//定时器中断0的中断服务函数
interrupt void CpuTimer0Isr(void)
{
    //============================================================
    CpuTimer0Regs.TCR.bit.TIF  = 1; //清除外设级中断标志位
    PieCtrlRegs.PIEACK.bit.ACK1= 1; //清除PIE级中断应答
}


//定时器中断0的中断服务函数
interrupt void CpuTimer1Isr(void)
{
    //============================================================
    CpuTimer1Regs.TCR.bit.TIF  = 1; //清除外设级中断标志位
    PieCtrlRegs.PIEACK.bit.ACK1= 1; //清除PIE级中断应答
}

4 定时器运用

(1)使用定时器0实现板子一个灯的1S闪烁功能

//定时器中断0的中断服务函数==20us
static unsigned int  timercnt= 0;
interrupt void CpuTimer0Isr(void)
{
    timercnt++;
    //1S时长
    if(timercnt>50000)
    {
        timercnt = 0;
        //指示灯的引脚状态进行反转
        LEDRTOGGLE();
        LEDYTOGGLE();

    }
    //============================================================
    CpuTimer0Regs.TCR.bit.TIF  = 1; //清除外设级中断标志位
    PieCtrlRegs.PIEACK.bit.ACK1= 1; //清除PIE级中断应答
}

(2)使用定时器1实现精准的毫秒级计时函数

//delay_ms时间函数
static unsigned char delay_flag = 0;
static unsigned int delay_cnt = 0;
void delay_ms(unsigned int timer)
{
    delay_flag = 1;
    delay_cnt = 0;
    while(delay_cnt<timer)
    {
        ;
    }
    delay_flag = 0;
    delay_cnt = 0;
}

在定时器1中进行计时

//时间计数的代码程序
    if(delay_flag)
    {
        delay_cnt++if(delay_cnt>65500)
        {
            delay_cnt = 65500;
        }
        else
        {
            ;
        }
    }
    else
    {
        delay_cnt = 0;
    }

5 工程代码

在这里插入图片描述

/*

  • includes.h
  • Created on: 2024年7月29日
  •  Author:
    

*/

#ifndef APP_INCLUDES_H_
#define APP_INCLUDES_H_

#include "Flash2803x_API_Library.h"
#include "Flash2803x_API_Config.h"

#include "DSP28x_Project.h"
#include "DSP2803x_DefaultISR.h"
#include "DSP2803x_Adc.h"

#include "Flash2803x_API_Config.h"
#include "string.h"

#include "sys_gpio.h"
#include "sys_timer.h"

//------------------------------------------
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);



extern void Init_system(void);
extern void Init_system_end(void);


#endif /* APP_INCLUDES_H_ */

//Main.c文件中

#include "includes.h"


/********************************************************
* 函数名称:Init_system
* 功 能:   系统初始化
* 入口参数:
* 出口参数:
* 修 改:
********************************************************/
void Init_system(void)
{
    InitSysCtrl();

    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    EALLOW;
    Flash_CPUScaleFactor = SCALE_FACTOR;
    Flash_CallbackPtr=NULL;
    EDIS;

    MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart);

    InitFlash();
}
/********************************************************
* 函数名称:void Init_system_end(void)
* 功 能:   系统初始化结束
* 入口参数:
* 出口参数:
* 修 改:
********************************************************/
void Init_system_end(void)
{
    EALLOW;  // This is needed to write to EALLOW protected registers
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
    EDIS;    // This is needed to disable write to EALLOW protected registers
    //================================================================================
    EINT;
    ERTM;

}

/********************************************************
函数名称:main
函数功能:主程序
入口参数:
出口参数:
修    改:
********************************************************/
void main(void)
{
    Init_system();

    FunTimerInit();

    FunGpioInit();

    Init_system_end();
//
    while(1)
    {
        //计时200ms
        delay_ms(200);
        //指示灯的引脚状态进行反转
        LEDGTOGGLE();
    }
}

/*

  • sys_gpio.c
  • Created on: 2024年7月30日
  •  Author:
    

*/

#include "includes.h"


void FunGpioInit(void)
{
    GpioDataRegs.GPADAT.all = 0ul;
    GpioDataRegs.GPBDAT.all = 0ul;

    //GPIO初始化
    //开始寄存器配置前执行指令
    EALLOW;
    // GPIOA DATA数据全清0
    GpioDataRegs.GPADAT.all = 0ul;
    // GPIOB DATA数据全清0
    GpioDataRegs.GPBDAT.all = 0ul;
    //LED G
    GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;
    GpioCtrlRegs.GPADIR.bit.GPIO24=1;
    //LED Y
    GpioCtrlRegs.GPAMUX2.bit.GPIO21=0;
    GpioCtrlRegs.GPADIR.bit.GPIO21=1;
    //LED R
    GpioCtrlRegs.GPAMUX2.bit.GPIO20=0;
    GpioCtrlRegs.GPADIR.bit.GPIO20=1;

    // GPIO0 <-> EPWM1A == 0:GPIO功能 1:PWM功能
    GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;
    // GPIO1 <-> EPWM1B == 0:GPIO功能 1:PWM功能
    GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
    // GPIO0 <-> EPWM1A == 0:输出功能 1:输入功能
    GpioCtrlRegs.GPADIR.bit.GPIO0=1;
    // GPIO1 <-> EPWM1B == 0:输出功能 1:输入功能
    GpioCtrlRegs.GPADIR.bit.GPIO1=1;
    // GPIO0 <-> EPWM1A == 1:输出0
    GpioDataRegs.GPACLEAR.bit.GPIO0=1;
    // GPIO1 <-> EPWM1B == 1:输出0
    GpioDataRegs.GPACLEAR.bit.GPIO1=1;

    // COMP_OUT GPIO42 <-> OPP_COMP1_OUT
    GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3;
    // AI02<-> COPM1+ ==2:比较器功能
    GpioCtrlRegs.AIOMUX1.bit.AIO2 = 2;
    // GPIO15 <-> TZ1
    GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 1;

    //寄存器配置结束后执行指令
    EDIS;
}

/*

  • sys_gpio.h
  • Created on: 2024年7月30日
  •  Author:
    

*/

#ifndef APP_SYS_GPIO_H_
#define APP_SYS_GPIO_H_

//===========================================================================


#define LEDRGPIO        GPIO20
#define LEDRMUX         GpioCtrlRegs.GPAMUX2.bit.LEDRGPIO
#define LEDRDIR         GpioCtrlRegs.GPADIR.bit.LEDRGPIO
#define LEDRTOGGLE()    GpioDataRegs.GPATOGGLE.bit.LEDRGPIO = 1
#define LEDRON()        GpioDataRegs.GPASET.bit.LEDRGPIO =1
#define LEDRLOW()       GpioDataRegs.GPACLEAR.bit.LEDRGPIO =1


#define LEDYGPIO        GPIO21
#define LEDYMUX         GpioCtrlRegs.GPAMUX2.bit.LEDYGPIO
#define LEDYDIR         GpioCtrlRegs.GPADIR.bit.LEDYGPIO
#define LEDYTOGGLE()    GpioDataRegs.GPATOGGLE.bit.LEDYGPIO = 1
#define LEDYON()        GpioDataRegs.GPASET.bit.LEDYGPIO =1
#define LEDYLOW()       GpioDataRegs.GPACLEAR.bit.LEDYGPIO =1


#define LEDGGPIO        GPIO24
#define LEDGMUX         GpioCtrlRegs.GPAMUX2.bit.LEDGGPIO
#define LEDGDIR         GpioCtrlRegs.GPADIR.bit.LEDGGPIO
#define LEDGTOGGLE()    GpioDataRegs.GPATOGGLE.bit.LEDGGPIO = 1
#define LEDGON()        GpioDataRegs.GPASET.bit.LEDGGPIO =1
#define LEDGLOW()       GpioDataRegs.GPACLEAR.bit.LEDGGPIO =1


extern void FunGpioInit(void);

#endif /* APP_SYS_GPIO_H_ */

/*

  • sys_timer.c
  • Created on: 2024年8月1日
  •  Author:
    

*/

#include "includes.h"


void FunTimerInit(void)
{
    EALLOW;  // This is needed to write to EALLOW protected registers
    //打开对应定时器时钟
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1;

    // CPU 定时器 0
    // 寄存器地址指针和各自计时器初始化:
    CpuTimer0.RegsAddr = &CpuTimer0Regs;
    // 定时器周期寄存器最大值初始化:
    CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
    // 预分频寄存器初始化为1 (SYSCLKOUT):
    CpuTimer0Regs.TPR.all  = 0;
    CpuTimer0Regs.TPRH.all = 0;
    // 确保定时器0停止:
    CpuTimer0Regs.TCR.bit.TSS = 1;
    // 重加载计数器周期值:
    CpuTimer0Regs.TCR.bit.TRB = 1;
    // 复位中断计时器:
    CpuTimer0.InterruptCount = 0;

    // CPU 定时器 1
    // 寄存器地址指针和各自计时器初始化:
    CpuTimer1.RegsAddr = &CpuTimer1Regs;
    // 定时器周期寄存器最大值初始化:
    CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;
    // 预分频寄存器初始化为1 (SYSCLKOUT):
    CpuTimer1Regs.TPR.all  = 0;
    CpuTimer1Regs.TPRH.all = 0;
    // 确保定时器1停止:
    CpuTimer1Regs.TCR.bit.TSS = 1;
    // 重加载计数器周期值:
    CpuTimer1Regs.TCR.bit.TRB = 1;
    // 复位中断计时器:
    CpuTimer1.InterruptCount = 0;

    //定时器时长配置
    //60:代表主频60M,
    //20:代表20us,
    //1000:代表1ms
    ConfigCpuTimer(&CpuTimer0,60,20);
    ConfigCpuTimer(&CpuTimer1,60,1000);
    StartCpuTimer0();
    StartCpuTimer1();

    PieVectTable.TINT0 = &CpuTimer0Isr;//往中断矢量表中填写定时器0一个指针
    PieVectTable.TINT1 = &CpuTimer1Isr;//往中断矢量表中填写定时器1一个指针


    //打开PIE组对应中断
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能第一组7通道定时器0
    IER |= M_INT1;  // Enable CPU INT
    IER |= M_INT13; //根据中断向量表使能定时器1

    EDIS;   // This is needed to disable write to EALLOW protected registers
}

//delay_ms时间函数
static unsigned char delay_flag = 0;
static unsigned int delay_cnt = 0;
void delay_ms(unsigned int timer)
{
    delay_flag = 1;
    delay_cnt = 0;
    while(delay_cnt<timer)
    {
        ;
    }
    delay_flag = 0;
    delay_cnt = 0;
}


//定时器中断0的中断服务函数==20us
static unsigned int  timercnt= 0;
interrupt void CpuTimer0Isr(void)
{
    timercnt++;
    //1S时长
    if(timercnt>50000)
    {
        timercnt = 0;
        //指示灯的引脚状态进行反转
        LEDRTOGGLE();
        LEDYTOGGLE();

    }
    //============================================================
    CpuTimer0Regs.TCR.bit.TIF  = 1; //清除外设级中断标志位
    PieCtrlRegs.PIEACK.bit.ACK1= 1; //清除PIE级中断应答
}


//定时器中断1的中断服务函数==1000us
interrupt void CpuTimer1Isr(void)
{
    //时间计数的代码程序
    if(delay_flag)
    {
        delay_cnt++;
        if(delay_cnt>65500)
        {
            delay_cnt = 65500;
        }
        else
        {
            ;
        }
    }
    else
    {
        delay_cnt = 0;
    }

    //============================================================
    CpuTimer1Regs.TCR.bit.TIF  = 1; //清除外设级中断标志位
    PieCtrlRegs.PIEACK.bit.ACK1= 1; //清除PIE级中断应答
}

/*

  • sys_timer.h
  • Created on: 2024年8月1日
  •  Author:
    

*/

#ifndef APP_SYS_TIMER_H_
#define APP_SYS_TIMER_H_

extern void FunTimerInit(void);

extern void delay_ms(unsigned int timer);

extern interrupt void CpuTimer0Isr(void);
extern interrupt void CpuTimer1Isr(void);

#endif /* APP_SYS_TIMER_H_ */

***配套代码工程***

6 定时器中断总结

TMS320F28034 提供了多种定时器模块,包括 CPU 定时器、eCAP、ePWM 和 eQEP 等。通过合理配置和使用这些定时器模块,可以实现各种定时任务,例如周期性任务、输入捕获、PWM 信号生成等。掌握这些定时器的使用方法,对于开发高性能嵌入式控制系统至关重要。

***配套代码工程***

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

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

相关文章

武汉流星汇聚:亚马逊平台消费者众多,助力中国卖家销售额大幅增长

在全球电商的浩瀚星空中&#xff0c;亚马逊凭借其庞大的消费者规模和强大的市场影响力&#xff0c;为无数商家特别是中国卖家提供了前所未有的发展机遇。近年来&#xff0c;越来越多的中国卖家选择通过亚马逊平台&#xff0c;将优质产品直接送达全球消费者的手中&#xff0c;并…

【系统架构设计师】二十三、通信系统架构设计理论与实践②

目录 二、5G 网络边缘计算 三、存储网络架构 四、软件定义网络架构 五、网络构建关键技术 5.1 网络的高可用性 5.2 IPv4 与 IPv6 融合组网技术 六、网络构建和设计方法 6.1 网络需求分析 6.2 网络技术遴选及设计 6.3 层次化网络模型设计 6.4 网络安全控制技术 6.5 …

基于Gromacs的蛋白质与小分子配体相互作用模拟教程

在生命科学的广阔领域中&#xff0c;蛋白质与小分子配体之间的相互作用扮演着至关重要的角色。这些相互作用不仅影响着生物体内的各种生命活动&#xff0c;如信号传导、代谢调控和药物作用等&#xff0c;同时也是药物设计和开发的核心内容。因此&#xff0c;深入理解并模拟这些…

模板进阶【C++】

文章目录 模板的特殊化函数模板特化的作用 函数模板的的特殊化语法&#xff1a;函数模板特化的要求 类模板的特殊化类模板的特殊化的要求类模板的特殊化的语法全特化偏特化实例化部分模板参数对基本类模板&#xff08;母板&#xff09;的模板参数进行限制 非类型模板参数非类型…

ESP32低功耗蓝牙服务端的库介绍和实例演示

ESP32低功耗蓝牙服务端的库介绍和实例演示 1.概述 前面的文章介绍了经典蓝牙库和使用示例&#xff0c;这篇文章介绍低功耗蓝牙库的使用。 这篇文章不介绍低功耗蓝牙实现的架构知识&#xff0c;只介绍 如何使用它的库文件实现应用开发只介绍服务端蓝牙开发方式 2.低功耗蓝牙…

R语言大尺度空间数据分析模拟预测及可视化:地统计与空间自相关、空间数据插值、机器学习空间预测、空间升降尺度、空间模拟残差订正、空间制图等

目录 专题一 R语言空间数据介绍及数据挖掘关键技术 专题二 R语言空间数据高级处理技术 专题三 R语言多维时空数据处理技术、数据清洗整合和时间序列分析 专题四 R语言地统计与空间自相关、空间插值方法 专题五 R语言机器学习与空间模型预测及不确定性评估 专题六 R语言空…

htsjdk库ReferenceSequenceFile接口介绍

ReferenceSequenceFile 是 HTSJDK 库中的一个接口,用于表示参考基因组文件。它定义了读取参考基因组序列的标准方法。这个接口使得不同类型的参考基因组文件(如 FASTA 格式)能够以统一的方式进行访问。 ReferenceSequenceFile 接口主要功能 访问参考序列: 提供获取参考基因…

如何在 Windows/Mac/iPhone/Android 上将 PDF 转换为 Word

PDF&#xff08;便携式文档格式&#xff09;是一种流行的格式&#xff0c;广泛用于在数字电子设备中呈现文档。输出文件小且兼容性强&#xff0c;使 PDF 如此受欢迎。但是&#xff0c;编辑 PDF 文件并非免费。您无需购买 PDF 编辑器&#xff0c;而是可以将 PDF 转换为 Word 进行…

嘉兴网站建设的思路

随着互联网的快速发展&#xff0c;网站已经成为企业宣传和推广的重要工具。作为浙江省的一个重要城市&#xff0c;嘉兴具有得天独厚的地理位置和经济实力&#xff0c;因此开展嘉兴网站建设具有重要意义。在进行网站建设的过程中&#xff0c;需要有一定的思路和规划&#xff0c;…

跑深度学习模型Ⅱ:一文安装正确pytorch及dgl

如果要用到GPU &#xff0c;先看这篇安装并保证cuda可用。跑深度学习模型I&#xff1a;一文正确使用CUDA-CSDN博客 啊每次都是pytorch版本问题引发的一系列错误&#xff01; 1. 查看自己的cuda版本 nvcc --version 可以看到我的cuda版本是11.8 nvidia-smi 查看NVIDIA驱动版…

智能变“智障”?云鲸扫地机器人频发故障引质疑

近年来&#xff0c;扫地机器人市场以其智能化技术革新和不断升级的产品功能&#xff0c;成功吸引了消费者的目光&#xff0c;甚至打破了家电行业的价格僵局&#xff0c;实现了价格与价值的双重攀升。然而&#xff0c;在这股智能家电的浪潮中&#xff0c;云鲸扫地机器人却因其频…

【C++从小白到大牛】栈和队列(优先级队列)

目录 引言&#xff1a; 使用方法篇&#xff1a; stack&#xff1a; queue priority_queue 使用方法&#xff1a; 模拟实现篇&#xff1a; stack&#xff1a; 原码&#xff1a; queue 原码&#xff1a; priority_queue 插入和删除数据的思想&#xff1a; 仿函数实…

TDEngine(taos) 涛思数据库-sql初识

一、基本使用 这里读者自行安装数据库&#xff1a;使用安装包立即开始 | TDengine 文档 | 涛思数据 (taosdata.com) // 下载gz文件&#xff0c;解压 tar -zxvf TDengine-server-<对应版本>-Linux-x64.tar.gz// 解压后启动 sudo ./install.sh 启动成功后&#xff0c;直…

动态规划之子数组系列问题

题型介绍 子数组系列动态规划问题长什么样 例题 力扣 53. 最大子数组和 解题步骤&#xff1a; 创建 dp 表以及确定 dp 表中所要填写位置的含义&#xff1a; 首先&#xff0c;根据写题经验&#xff0c;先确定出这道题应该使用的解题思路是 “以某一个位置为结尾进行分析”…

【编码心得】单元测试的那些事

【编码心得】单元测试的那些事 文章目录 单元测试定义&#xff1f;为什么需要单元测试&#xff1f;为重构保驾护航提高代码质量减少 bug快速定位 bug持续集成依赖单元测试团队编码规范要求大牛都写单元测试保住面子 TDD 测试驱动开发何谓 TDD&#xff1f;TDD的基本流程TDD 优缺…

全球轻型汽车市场规划预测:2030年市场规模将接近2502亿元,未来六年CAGR为2.8%

一、引言 随着全球经济的发展和消费者出行需求的增加&#xff0c;轻型汽车作为汽车市场中的重要组成部分&#xff0c;其市场重要性日益凸显。本文旨在探索轻型汽车行业的发展趋势、潜在商机及其未来展望。 二、市场趋势 全球轻型汽车市场的增长主要受全球经济发展、消费者对出…

海风小店微信商城小程序附后端一款免费开源的小程序源码

该商城小程序服务端api基于node.jsThinkJSMySQL&#xff0c;如果对这个不大熟悉的人&#xff0c; 可能有那么一点难度&#xff0c;但是如果只是搭建的话&#xff0c;作者的教程还是比较详细的&#xff0c;而且搭建步骤比较简单&#xff0c; 应该很容易上手&#xff0c;如果你…

【KAN】【API教程】索引

简单来说就是确定激活函数的坐标 from kan import *model = KAN(width=[2,3,2,1]) x = torch.normal(0,1,size=(100,2)) model(x); beta = 100 model.plot(beta=beta) # [2,3,2,1] means 2 input nodes # 3 neurons in the first hidden layer, # 2 neurons in the second hid…

知识图谱开启了一个可以理解的人工智能未来

概述 本文是对利用知识图谱&#xff08;KG&#xff09;的综合人工智能&#xff08;CAI&#xff09;的全面调查研究&#xff0c;其中 CAI 被定义为可解释人工智能&#xff08;XAI&#xff09;和可解释机器学习&#xff08;IML&#xff09;的超集。 首先&#xff0c;本文澄清了…

【Linux学习】实现一个简单版的Shell

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4d5;前言&#x1f351;shell&#x1f4da;Shell的工作原理&#x1f512;Shell的高级功能 &#x1f680;shell的代码实现&am…