STM32F4 | 定时器中断实验

2023-05-16

文章目录

    • 一、STM32F429 通用定时器简介
    • 二、硬件设计
    • 三、软件设计
    • 四、实验现象
    • 五、STM32CubeMX 配置定时器更新中断功能

  这一章介绍如何使用 STM32F429 的通用定时器, STM32F429 的定时器功能十分强大,有 TIME1TIME8 等高级定时器,也有 TIME2~TIME5TIM9~TIM14 等通用定时器,还有 TIME6TIME7 等基本定时器,总共达 14 个定时器之多。在本章中,我们将使用 TIM3 的定时器中断来控制 DS1 的翻转,在主函数用 DS0 的翻转来提示程序正在运行。

一、STM32F429 通用定时器简介

  STM32F429 的通用定时器包含一个 16 位或 32 位自动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。STM32F429 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F429 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
  STM32 的通用 TIMx (TIM2~TIM5TIM9~TIM14)定时器功能包括:

  • 16 位/32 位(仅 TIM2TIM5)向上、向下、向上/向下自动装载计数器TIMx_CNT),注意:TIM9~TIM14 只支持向上(递增)计数方式。
  • 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
  • 4 个独立通道(TIMx_CH1~4TIM9~TIM14 最多 2 个通道),这些通道可以用来作为:
    A.输入捕获
    B.输出比较
    C.PWM 生成(边缘或中间对齐模式) ,注意:TIM9~TIM14 不支持中间对齐模式
    D.单脉冲模式输出
  • 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
  • 如下事件发生时产生中断/DMATIM9~TIM14 不支持 DMA):
    A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    C.输入捕获
    D.输出比较
    E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不支持)
    F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM14 不支持)

  下面我们介绍一下与我们这章的实验密切相关的几个通用定时器的寄存器。

  • 控制寄存器 1:TIMx_CR1
      该寄存器的各位描述如图所示:
    在这里插入图片描述
    在本实验中,我们只用到了 TIMx_CR1 的最低位,也就是计数器使能位,该位必须置 1,才能让定时器开始计数。

  • DMA/中断使能寄存器:TIMx_DIER
      该寄存器的各位描述如图所示:
    在这里插入图片描述
    这里我们同样仅关心它的第 0 位,该位是更新中断允许位,本章用到的是定时器的更新中断,所以该位要设置为 1,来允许由于更新事件所产生的中断。\

  • 预分频寄存器:TIMx_PSC
      该寄存器用来设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。该寄存器的各位描述如图所示:
    在这里插入图片描述
    这里,定时器的时钟来源有 4 个:

    • 内部时钟CK_INT:默认情况下,TIM3 的时钟来源是内部时钟 CK_INT
    • 外部时钟模式 1:外部输入脚TIx
    • 外部时钟模式 2:外部触发输入ETR,仅适用于 TIM2TIM3TIM4
    • 内部触发输入ITRx:使用 A 定时器作为 B 定时器的预分频器(AB 提供时钟)。

    这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。这里的 CK_INT时钟是从 APB1 倍频来的,除非 APB1 的时钟分频数设置为 1(一般都不会是 1),否则通用定时器 TIMx 的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx的时钟就等于 APB1 的时钟。这里还要注意的就是高级定时器以及 TIM9~TIM11 的时钟不是来自 APB1,而是来自 APB2 的。

  • TIMx_CNT 寄存器
      该寄存器是定时器的计数器,该寄存器存储了当前定时器的计数值。

  • 自动重装载寄存器:TIMx_ARR
      该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器在被叫做影子寄存器。事实上真正起作用的是影子寄存器。根据 TIMx_CR1 寄存器中 APRE 位的设置:APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2 者是连通的;而 APRE=1 时,在每一次更新事件(UEV)时,才把预装载寄存器(ARR)的内容传送到影子寄存器。
      自动重装载寄存器的各位描述如图所示:
    在这里插入图片描述

  • 状态寄存器:TIMx_SR
      该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。该寄存器的各位描述如图所示:
    在这里插入图片描述

只要对以上几个寄存器进行简单的设置,我们就可以使用通用定时器了,并且可以产生中断。
  这一章,我们将使用定时器产生中断,然后在中断服务函数里面翻转 DS1 上的电平,来指示定时器中断的产生。接下来我们以通用定时器 TIM3 为实例,来说明要经过哪些步骤,才能达到这个要求,并产生中断。这里我们就对每个步骤通过库函数的实现方式来描述。首先要提到的是,定时器相关的库函数主要集中在 HAL 库文件 stm32f4xx_hal_tim.hstm32f4xx_hal_tim.c 文件中。定时器配置步骤如下:

  1. TIM3 时钟使能
      HAL 中定时器使能是通过宏定义标识符来实现对相关寄存器操作的,方法如下:

    __HAL_RCC_TIM3_CLK_ENABLE(); //使能 TIM3 时钟
    
  2. 初始化定时器参数:设置自动重装值,分频系数,计数方式等。
      在 HAL库中,定时器的初始化参数是通过定时器初始化函数 HAL_TIM_Base_Init 实现的:

    HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);
    

    该函数只有一个入口参数,就是 TIM_HandleTypeDef 类型结构体指针,其定义为:

    typedef struct
    {
    	TIM_TypeDef *Instance;
    	TIM_Base_InitTypeDef Init; 
    	HAL_TIM_ActiveChannel Channel; 
    	DMA_HandleTypeDef *hdma[7]; 
    	HAL_LockTypeDef Lock; 
    	__IO HAL_TIM_StateTypeDef State; 
    }TIM_HandleTypeDef;
    
    • 第一个参数 Instance寄存器基地址。和串口,看门狗等外设一样,一般外设的初始化结构体定义的第一个成员变量都是寄存器基地址。
    • 第二个参数 Init 为真正的初始化结构体 TIM_Base_InitTypeDef 类型。该结构体定义如下:
      typedef struct
      {
      	uint32_t Prescaler; //预分频系数 
      	uint32_t CounterMode; //计数方式
      	uint32_t Period; //自动装载值 ARR
      	uint32_t ClockDivision; //时钟分频因子 
      	uint32_t RepetitionCounter; 
      } TIM_Base_InitTypeDef
      
      • 参数 Prescaler 是用来设置分频系数的。
      • 参数CounterMode 是用来设置计数方式,可以设置为向上计数,向下计数方式还有中央对齐计数方
        式,比较常用的是向上计数模式 TIM_CounterMode_Up 和向下计数模式TIM_CounterMode_Down
      • 参数 Period 是设置自动重载计数周期值。
      • 参数 ClockDivision 是用来设置时钟分频因子,也就是定时器时钟频率 CK_INT 与数字滤波器所使用的采样时钟之间的分频比。
      • 参数 RepetitionCounter 用来设置重复计数器寄存器的值,用在高级定时器中。
    • 第三个参数 Channel 用来设置活跃通道。每个定时器最多有四个通道可以用来做输出比较,输入捕获等功能之用。这里的 Channel 就是用来设置活跃通道的,取值范围为:HAL_TIM_ACTIVE_CHANNEL_1~ HAL_TIM_ACTIVE_CHANNEL_4
    • 第四个 hdma 是定时器的 DMA 功能时用到
    • 第五个参数 LockState,是状态过程标识符,是 HAL库用来记录和标志定时器处理过程。

    定时器初始化范例如下:

    TIM_HandleTypeDef TIM3_Handler; //定时器句柄
    
    TIM3_Handler.Instance=TIM3; //通用定时器 3
    TIM3_Handler.Init.Prescaler=8999; //分频系数
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
    TIM3_Handler.Init.Period=4999; //自动装载值
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
    HAL_TIM_Base_Init(&TIM3_Handler);
    
  3. 使能定时器更新中断,使能定时器
      HAL 库中,使能定时器更新中断和使能定时器两个操作可以在函数HAL_TIM_Base_Start_IT()中一次完成的,该函数声明如下:

    HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
    

    调用该定时器之后,会首先调用__HAL_TIM_ENABLE_IT 宏定义使能更新中断,然后调用宏定义__HAL_TIM_ENABLE 使能相应的定时器。这里分别列出单独使能/关闭定时器中断和使能/关闭定时器方法:

    __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);//使能句柄指定的定时器更新中断
    __HAL_TIM_DISABLE_IT (htim, TIM_IT_UPDATE);//关闭句柄指定的定时器更新中断
     __HAL_TIM_ENABLE(htim);//使能句柄 htim 指定的定时器
    __HAL_TIM_DISABLE(htim);//关闭句柄 htim 指定的定时器
    
  4. TIM3 中断优先级设置
      在定时器中断使能之后,因为要产生中断,必不可少的要设置 NVIC 相关寄存器,设置中断优先级。
      和串口等其他外设一样,HAL 库为定时器初始化定义了回调函数 HAL_TIM_Base_MspInit。一般情况下,与 MCU 有关的时钟使能,以及中断优先级配置我们都会放在该回调函数内部。函数声明如下:

    void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);
    
  5. 编写中断服务函数
      通过该函数来处理定时器产生的相关中断。通常情况下,在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,我们这里使用的是更新(溢出)中断,所以在状态寄存器 SR 的最低位。在处理完中断之后应该向 TIM3_SR 的最低位写 0,来清除该中断标志。
      以定时器 3的更新中断为例,首先,定时器 3 的中断服务函数为:

    TIM3_IRQHandler();
    

    一般情况下我们是在中断服务函数内部编写中断控制逻辑。但是 HAL 库为我们定义了新的定时器中断共用处理函数 HAL_TIM_IRQHandler,在每个定时器的中断服务函数内部,我们会调用该函数。该函数声明如下:

    void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);
    

    而函数 HAL_TIM_IRQHandler 内部,会对相应的中断标志位进行详细判断,判断确定中断来源后,会自动清掉该中断标志位,同时调用不同类型中断的回调函数。所以我们的中断控制逻辑只用编写在中断回调函数中,并且中断回调函数中不需要清中断标志位。
      定时器更新中断回调函数为:

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
    

      对于其他类型中断,HAL 库同样提供了几个不同的回调函数,这里我们列出常用的几个回调函数:

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);//更新中断
    void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);//输出比较
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);//输入捕获
    void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim);//触发中断
    

通过以上几个步骤,我们就可以达到我们的目的了,使用通用定时器的更新中断,来控制 DS1 的亮灭。

二、硬件设计

  本实验用到的硬件资源有:

  • 指示灯 DS0DS1
  • 定时器 TIM3

本章将通过 TIM3 的中断来控制 DS1 的亮灭,DS1 是直接连接到 PB0 上的。 TIM3 属于 STM32F429 的内部资源,只需要软件设置即可正常工作。

三、软件设计

  我们直接复制“窗口门狗(WWDG)实验”的工程模板,将复制过来的模板文件夹重新命名为“7-定时器外部中断实验”。在HARDWARE->TIME 文件夹下面新建timer.c 文件以及头文件 timer.h
  打开time.c 文件,代码如下:

#include "timer.h"
#include "led.h"

TIM_HandleTypeDef TIM3_Handler;      //定时器句柄 

//通用定时器3中断初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!(定时器3挂在APB1上,时钟为HCLK/2)
void TIM3_Init(u16 arr,u16 psc)
{  
    TIM3_Handler.Instance=TIM3;                          //通用定时器3
    TIM3_Handler.Init.Prescaler=psc;                     //分频系数
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM3_Handler.Init.Period=arr;                        //自动装载值
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
    HAL_TIM_Base_Init(&TIM3_Handler);
    
    HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE   
}


//定时器底册驱动,开启时钟,设置中断优先级
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM3)
	{
		__HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
		HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
		HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断   
	}
}


//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM3_Handler);
}


//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim==(&TIM3_Handler))
    {
        LED1=!LED1;        //LED1反转
    }
}

其头文件timer.h

#ifndef _TIMER_H
#define _TIMER_H
#include "sys.h"

extern TIM_HandleTypeDef TIM3_Handler;      //定时器句柄 

void TIM3_Init(u16 arr,u16 psc);
#endif

  第一个函数 TIM3_Init 用来初始化定时器 3,使能定时器 3 更新中断以及使能定时器。该函数的 2 个参数用来设置 TIM3 的溢出时间。因为我们在 Stm32_Clock_Init 函数里面已经初始化 APB1 的时钟为 4 分频,所以 APB1 的时钟为 45M,而从 STM32F429 的内部时钟树图中得知:当 APB1的时钟分频数为 1 的时候,TIM2~7 以及 TIM12~14 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频数不为 1,那么TIM2~7 以及 TIM12~14 的时钟频率将为 APB1 时钟的两倍。因此,TIM3的时钟为 90M,再根据我们输入的 arrpsc 的值,就可以计算中断时间了。计算公式如下:
T o u t = ( ( a r r + 1 ) ∗ ( p s c + 1 ) ) / T c l k Tout= ((arr+1)*(psc+1))/Tclk Tout=((arr+1)(psc+1))/Tclk
其中:

  • TclkTIM3 的输入时钟频率(单位为 Mhz)。
  • ToutTIM3 溢出时间(单位为 us)。

  第二个函数 HAL_TIM_Base_MspInit 是定时器初始化回调函数,主要是使能定时器 3 时钟以及定时器 3 的 NVIC 配置。
  第三个函数TIM3_IRQHandler 是中断服务入口函数,该函数内部只有一行代码就是调用定时器中断共用处理函数 HAL_TIM_IRQHandler。函数 HAL_TIM_IRQHandler 内部会判断中断来源,根据中断来源调用不同的中断处理回调函数。这里我们开启的是定时器 3 的更新中断,所以我们需要重定义更新中断回调函数HAL_TIM_PeriodElapsedCallback
  第四个函数HAL_TIM_PeriodElapsedCallback 就是更新中断回调函数,也就是真正的中断处理函数,该函数内部通过判断中断是定时器 3 之后,然后控制 LED1 翻转。
  主函数main.c代码如下:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "timer.h"

int main(void)
{
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
    KEY_Init();                     //初始化按键
    TIM3_Init(5000-1,9000-1);       //定时器3初始化,定时器时钟为90M,分频系数为9000-1,
                                    //所以定时器3的频率为90M/9000=10K,自动重装载为5000-1,那么定时器周期就是500ms
    while(1)
    {
        LED0=!LED0;                 //LED0翻转
        delay_ms(200);              //延时200ms
    }
}

  这段代码对 TIM3 进行初始化之后,进入死循环等待 TIM3溢出中断,当 TIM3_CNT 的值等于 TIM3_ARR 的值的时候,就会产生 TIM3 的更新中断,然后在中断里面取反 LED1TIM3_CNT 再从 0 开始计数。
  这里定时器定时时长 500ms 是这样计算出来的,定时器的时钟为 90Mhz,分频系数为 8999,所以分频后的计数频率为 90Mhz/(8999+1)=10KHz,然后计数到 4999,所以时长为(4999+1)/10000=0.5s,也就是 500ms

四、实验现象

  使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口),把编译后产生的.hex 文件烧入到芯片内。可以看到:DS0 不停闪烁,而 DS1 也是不停的闪烁,但是闪烁时间较DS0 慢。

五、STM32CubeMX 配置定时器更新中断功能

  首先使能 TIM3 的方法,
在这里插入图片描述
  然后进入 Configuration->TIM3 配置页,在弹出的界面中点击 Parameter Settings 选项卡,Counter Settings 配置栏下面的四个选项就是用来配置定时器的预分频系数,自动装载值,计数模式以及时钟分频因子。操作方法如下图所示:
在这里插入图片描述
  最后,进入 Configuration->NVIC 配置页,在弹出的界面中点击 NVIC 选项卡,配置 Interrupt Table 中的 TIM3 global interrupt,使能中断,配置抢占优先级和响应优先级。
在这里插入图片描述
  经过上面三个步骤,生成代码,大家对比生成的代码和实验工程的区别。这里需要说明的是,默认情况下,TIM3 的时钟来源是内部时钟 CK_INT,所以在我们实验中使用的是默认配置,没有额外在程序中提现。

/* TIM3 init function */
void MX_TIM3_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 8999;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 4999;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim3);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);

}
void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */

  /* USER CODE END TIM3_IRQn 0 */
  HAL_TIM_IRQHandler(&htim3);
  /* USER CODE BEGIN TIM3_IRQn 1 */

  /* USER CODE END TIM3_IRQn 1 */
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{

  if(htim_base->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspInit 0 */

  /* USER CODE END TIM3_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM3_CLK_ENABLE();
    /* Peripheral interrupt init */
    HAL_NVIC_SetPriority(TIM3_IRQn, 1, 3);
    HAL_NVIC_EnableIRQ(TIM3_IRQn);
  /* USER CODE BEGIN TIM3_MspInit 1 */

  /* USER CODE END TIM3_MspInit 1 */
  }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F4 | 定时器中断实验 的相关文章

  • 一个可以直接运行的WEB录音机,在WEB上实现录音并播放,也可以用来测试麦克风(增加了音频下载功能)

    span class token doctype span class token punctuation lt span span class token doctype tag DOCTYPE span span class token
  • FreeRTOS — 源码下载与移植

    1 FreeRTOS的学习 1 1 FreeRTOS的源码下载 学习一个操作系统前 xff0c 首先要下载对应的源码 xff0c 用于研究和学习 FreeRTOS的源码下载链接如下 xff1a FreeRTOS Real Time Kern
  • freeRTOS学习 — 任务的创建与管理

    1 freeRTOS的任务 xff08 1 xff09 任务的状态 freeRTOS中 xff0c 任务在运行时 xff0c 可能出现以下几种状态 xff1a 1 xff09 运行态 任务当前正在运行中 xff0c 占有cpu的使用权 2
  • freeRTOS学习 — 消息队列

    1 freeRTOS 的消息队列 freeRTOS中提供了任务之间互相通信的另外的一种手段 消息队列 它的作用主要有 xff1a 1 xff09 为了在任务与任务之间 任务与中断之间的通信而准备的 xff0c 可以在任务与任务之间 xff0
  • ucos-ii 的任务调度原理和实现

    ucosii 任务调度和原理 1 ucos ii 任务创建与任务调度 1 1 任务的创建 当你调用 OSTaskCreate 进行任务的创建的时候 xff0c 会初始化任务的堆栈 保存cpu的寄存器 创建任务的控制块 xff08 OS TC
  • 51单片机 | DS18B20 温度传感器实验

    文章目录 一 DS18B20介绍二 硬件设计三 软件设计1 数码管显示函数2 DS18B20 初始化函数及温度读取函数4 主函数 四 实验现象 这一节我们来学习精度较高的外部 DS18B20 数字温度传感器 xff0c 由于此传感器是 单总
  • 上位机命名规范驼峰命名法和下划线命名法

    1 xff09 驼峰命名法 小驼峰命名法 xff1a 除第一个单词之外 xff0c 其他单词首字母大写 xff0c 例如 xff1a myFirstName myLastName 常用于变量名 xff0c 函数名 大驼峰命名法 又称为帕斯卡
  • matlab 调用GPU运算

    1 利用gpuArray 函数将数据从CPU传入GPU中 a 61 zeros 2 3 a 61 gpuArray a 或 a 61 gpuArray single a 数据默认都是双精度 xff0c 降成单精度会提高计算速度 2 用cla
  • 1.数字芯片后端设计小概述

    大家好 xff0c 第一篇文章想来简单介绍一下数字芯片后端的基本流程 对于没有接触过后端设计的新人可能会有用 后端设计总体来说 xff0c 是将前端写好的RTL代码通过综合 xff08 synthesize xff09 转换成物理网表 xf
  • Neutron学习笔记2-- Neutron的网络实现模型

    Neutron学习笔记2 Neutron的网络实现模型 Neutron的三类节点 计算节点网络节点控制节点 Neutron将在这三类节点中进行部署 xff0c Neutron在各个计算节点 xff0c 网络节点中运行各种各样的Agent x
  • Neutron学习笔记1--基本概念

    Neutron学习笔记 基本概念 1 涉及的Linux网络技术 bridge xff1a 网桥 xff0c Linux中用于表示一个能连接不同网络设备的虚拟设备 xff0c Linux中传统实现的网桥类似于一个hub设备 xff0c 而ov
  • 解决EXCEL打开.csv文件时的乱码问题

    问题描述 xff1a 在爬取数据的时候需要生成 csv文件用于存储数据 xff0c 但是生成的文件打开的时候是都是乱码 xff08 包括在网上下载的用于数据分析联系的 csv文件很多时候也会乱码 xff09 xff0c 具体情况如下 xff
  • 关于C语言中字符串以‘\0‘结尾的原因

    0 一般放在字符串的结束处 xff0c 用来表示字符串的结束 xff0c 其是ascii值为0的字符的转义 如果一个字符串中没有 0 这个结束字符 xff0c 那么这些函数将不能确定字符串的结束位置在哪儿 xff0c 从而引起一些不必要的错
  • ESP8266_NONOS_SDK开发环境搭建及验证

    ESP8266 NONOS SDK开发环境搭建及验证 视频教程 xff1a 芯片资料芯片 xff1a ESP8266EX模组 xff1a ESP 12F开发板 xff1a NodeMCU 启动模式安装AiThinkerIDE编译报错问题No
  • 华为开发者大会2019观后感

  • 运行Mapreduce,运行一半卡着不动了

    64 root 64 master mr inverted test bash run sh rmr DEPRECATED Please use rm r instead 19 01 17 23 22 23 INFO fs TrashPol
  • 51单片机 | LCD1602 液晶显示实验

    文章目录 一 LCD1602 介绍1 LCD1602 简介2 LCD1602 常用指令3 LCD1602 使用 二 硬件设计三 软件设计1 LCD1602 驱动函数2 主函数 四 实验现象 在前面章节 xff0c 我们已经学习过几种显示装置
  • Ubuntu18.04下自定义meauconfig

    一 前言 本文记录ubutu18 04下自定义meauconfig的安装使用 二 安装 参考链接 xff1a https nuttx apache org docs latest quickstart install html 或者可以看这
  • 服务器搭建及数据库部署

    服务器搭建 参考文章 快速搭建一个自己的服务器详解 xff08 java环境 xff09 因为上学期做非关系数据库课程实验时使用过PolarDB云数据库 xff0c 进行过阿里云的学生认证 xff0c 所以此次云服务器也就选择了Ali的开发
  • MATLAB 2018b 安装 mexopencv (VS 2017 编译)

    MATLAB 2018b 安装 mexopencv VS 2017 编译 之前电脑上装的是MATLAB 2016b 没办法识别VS 2017 虽然官方说有补丁解决这个问题 但还是下了最新的2018b 2018b 识别VS 2017 是没问题

随机推荐

  • Mybatis搞五下(分页、缓存)

    Mybatis搞五下 xff08 分页 缓存 xff09 上篇博客我们讲了动态SQL xff0c 一一多多和延迟加载问题 xff0c 这篇我们讲点轻松的东西 xff0c 关于分页插件pageHelper和Mybatis面试常问的缓存问题 M
  • 03、postman前置脚本

    postman前置脚本是指在Pre requests Script中编写的js脚本 xff0c 一个请求在发送之前 xff0c 会先去执行Pre Request Script xff08 前置脚本 xff09 中的代码 xff0c 可以是为
  • Python3爬取淘宝网商品数据!

    分析淘宝网 这次选择的是淘宝网热卖而不是淘宝网 xff0c 二者虽然名字有不同 xff0c 但是数据还是一样的 xff0c 区别就在于前者把后者的所有店铺和商品的海量数据按照销售量 好评度 信誉度综合测评 重新计算 重新排序展现给买家的一个
  • Python实现淘宝准点抢单!双十一秒杀神器啊!还不来学?

    一 ChromeDriver的安装 若想使用Selenium成功调用Chrome浏览器完成相应的操作 xff0c 需要通过ChromeDriver来驱动 我们在下载之前先来确认下我们使用的Chrome浏览器版本 只需要红框内几位相同即可 根
  • 【点云系列】 场景识别类导读

    文章目录 1 背景知识2 定义3 传统方法4 基于深度学习的方法5 其他参考 xff1a 终于可以简单写一下这一块的导读了 xff0c 拖了一个多周了 希望可以帮助到大家 xff1b xff09 1 背景知识 点云检索 xff08 poin
  • 异常检测综述(Anomaly Detection: A Survey)

    Anomaly Detection A Survey 异常检测综述 xff1a 异常检测是一个重要的问题 xff0c 已经在不同的研究领域和应用领域进行了研究 许多异常检测技术是专门为某些应用领域开发的 xff0c 而其他技术则更为通用 本
  • 基于Prometheus和k8s搭建监控系统

    文章目录 1 实验环境2 Prometheus介绍 xff1f 3 Prometheus特点3 1 样本 4 Prometheus组件介绍5 Prometheus和zabbix对比分析6 Prometheus的几种部署模式6 1 基本高可用
  • STM32F4 | 窗口门狗(WWDG)实验

    文章目录 一 STM32F4 窗口看门狗简介二 硬件设计三 软件设计四 实验现象五 STM32CubeMX 配置 WWDG 在本章中 xff0c 我们将使用窗口看门狗的 中断功能来喂狗 xff0c 通过 DS0 和 DS1 提示程序的运行状
  • deepin15.11系统下使用源码包(tar.xz)安装MySQL 8.0+(补充)

    1 下载MySQL的安装包 1 1 进入官网 xff0c 找到下载 官网地址 mysql官网 1 2 找到下载入口 1 3 选择这个 1 4找到适合自己电脑系统版本 2 安装 配置MySQL和创建mysql用户 注意 最好使用root安装和
  • 基于docker部署prometheus

    1 prometheus架构 Prometheus Server 收集指标和存储时间序列数据 xff0c 并提供查询接口 ClientLibrary 客户端库 Push Gateway 短期存储指标数据 主要用于临时性的任务 Exporte
  • Prometheus监控实战系列二十:监控Kubernetes集群(下)

    本文承接上篇 xff0c 在本篇中我们会讲解Prometheus如何应用基于Kubernetes的服务发现功能 xff0c 检索目标信息并进行监控 在监控策略上 xff0c 我们将混合使用白盒监控与黑盒监控两种模式 xff0c 建立起包括基
  • RT-Thread 简介及架构

    RT Thread xff0c 全称是 Real Time Thread xff0c 顾名思义 xff0c 它是一个嵌入式实时多线程操作系统 xff0c 基本属性之一是支持多任务 xff0c 允许多个任务同时运行并不意味着处理器在同一时刻真
  • 进程的结构

    什么是进程 UNIX标准 xff08 特别是IEEE Std 1003 1 2004年版 xff09 把进程定义为 一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源 目前 xff0c 可以把进程看作正在运行的程序 像Linu
  • 【代码小坑】梯度回传为0

    记录一下训练过程中遇到的问题 xff0c 由于这个问题我花了很长时间才解决 xff0c 所以值得记录 先给出结论 xff1a tensor转换成numpy后会丢失梯度 xff0c 导致回传出现问题 由于原代码不容易理解 xff0c 简单用个
  • (超详细)零基础如何学习操作系统---操作系统书籍推荐

    直接先给出路线书籍 编码 隐匿在计算机软硬件背后的语言 汇编语言 x86从实模式到保护模式 操作系统导论 操作系统真象还原 查漏补缺 1 编码 隐匿在计算机软硬件背后的语言 对于完全不懂计算机的朋友 xff0c 这本书可以让你对计算机有一个
  • 多种形式ICP问题的ceres实例应用

    一家之言 xff0c 仅作分享 xff0c 如有不合理或需要改进的地方 xff0c 欢迎各位讨论 ICP方法主要解决空间点云3D 3D的运动估计问题 xff0c 已知 xff1a t 1 t 1 t 1 和
  • git配置以及git-cola使用教程

    git安装 打开终端 xff0c 输入sudo apt get install git git配置 配置用户名 git config global user name 34 user name 34 配置邮箱 git config glob
  • C++ 手撸简易服务器

    本文使用上一期写的反射类 xff0c 另外我发现 lt WinSock2 h gt 这个头文件里有RegisterClass 这个结构 xff0c 还有typedef RegisterClass RegisterClassW这句话 这都能重
  • STM32CubeMX实战教程(一)——软件入门

    软件入门 前言新建工程界面简介MCU外设配置时钟树工程设置工具生成代码代码分析main cgpio cstm32f4xx it c 程序下载现象 结语 前言 STM32Cube 是一个全面的软件平台 xff0c 包括了ST产品的每个系列 平
  • STM32F4 | 定时器中断实验

    文章目录 一 STM32F429 通用定时器简介二 硬件设计三 软件设计四 实验现象五 STM32CubeMX 配置定时器更新中断功能 这一章介绍如何使用 STM32F429 的通用定时器 xff0c STM32F429 的定时器功能十分强