STM32基于STM32CubeMX DMA + EXTI读取DS1307数据

STM32基于STM32CubeMX DMA + EXTI读取DS1307数据


  • ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
  • 🍁对于文中所提供的相关资源链接将作不定期更换。
  • 🔰说明:本人没有开通打赏功能,谨防上当受骗!
  • 📍DS1307 HAL外设驱动文件 https://github.com/lamik/DS1307_RTC_STM32_HAL

🎉基于STM32CubeMX配置工程,当然不局限与STM32其他型号的芯片的使用,只要是stm32芯片都可以使用该源文件,在任意一款STM32型号的单片机上进行驱动移植使用,方便项目移植,减少不必要的重复开发工作。

  • 🔖DS1307时钟模块
    在这里插入图片描述

  • 📜串口打印信息:
    在这里插入图片描述

📓功能说明

由于工程默认配置的外部中断引脚,没有配置上下拉,中断引脚输出浮空状态,浮空状态认为是处于高电平一直处于触发状态,个人使用的话可以配置为上下拉状态,以及通过外部上下拉电阻,将中断引脚至于一个确定电平状态,然后通过上升沿或下降沿触发中断,调用 I2C DMA数据接收,这种用于主动方式来获取时间。

📓STM32CubeMX配置

  • 🌿使能I2C接口
    在这里插入图片描述
  • 🌿开启DMA传输功能
    在这里插入图片描述
  • 🍁具体参数配置:
    在这里插入图片描述
    在这里插入图片描述

🔧GPIO引脚EXTI 配置

  • 🌿引脚可以根据个人需求任意指定。
    在这里插入图片描述

✅串口配置用于调试信息输出(非必须项)

  • ✨如果只是读取DS1307数据作为其他时基来源,可以不配置串口,这里是用来查看读取ds1307数据,所以启用串口功能。
    在这里插入图片描述

🎉以上配置可以根据个人需求进行引脚切换,以及外设选择。

🛠KEIL工程配置

  • 🔧usart.c文件中添加printf重映射,并在Keil设置中勾选MicroLib选项。
#include "stdio.h"
/*可调用printf*/
int fputc(int ch,FILE *f)
{
    /*&huart1指的是串口1,如果用别的串口就修改数字*/
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch , 1 , 1000);
    return ch;
}

📑DS1307驱动文件

  • 🌿DS1307.c文件
/*
 * DS1307.c
 *
 *	The MIT License.
 *  Created on: 4.09.2019
 *      Author: Mateusz Salamon
 *		Contact: mateusz@msalamon.pl
 *
  *      Website: https://msalamon.pl/dalsze-zmagania-z-rtc-ds1307-i-pcf8563-na-stm32/
  *      GitHub: https://github.com/lamik/DS1307_RTC_STM32_HAL
 */

#include "DS1307.h"

I2C_HandleTypeDef *hi2c_ds1307;

uint8_t Ds1307Buffer[7];

void DS1307_SetControlRegister(uint8_t Value)
{
	Value &= 0x93;// Put zeros where zero is needed 0b10010011

	HAL_I2C_Mem_Write(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_CONTROL, 1, &Value, 1, DS1307_I2C_TIMEOUT);
}

void DS1307_GetControlRegister(uint8_t *Value)
{
	HAL_I2C_Mem_Read(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_CONTROL, 1, Value, 1, DS1307_I2C_TIMEOUT);
}

void WriteBitToControlRegister(uint8_t BitNumber, uint8_t Value)
{
	uint8_t tmp;

	if(Value>1) Value = 1;

	DS1307_GetControlRegister(&tmp);
	tmp &= ~(1<<BitNumber);
	tmp |= (Value<<BitNumber);
	DS1307_SetControlRegister(tmp);
}
void DS1307_SQWEnable(uint8_t Enable)
{
	WriteBitToControlRegister(DS1307_CONTROL_SQUARE_WAVE_ENABLE, Enable);
}

void DS1307_SQWRateSelect(uint8_t Rate)
{
	uint8_t tmp;

	if(Rate>3) Rate = 3;

	DS1307_GetControlRegister(&tmp);
	tmp &= ~(3<<DS1307_CONTROL_RATE_SELECT_0);
	tmp |= (Rate<<DS1307_CONTROL_RATE_SELECT_0);
	DS1307_SetControlRegister(tmp);
}

void DS1307_OutputControl(uint8_t Enable)
{
	WriteBitToControlRegister(DS1307_CONTROL_OUTPUT_CONTROL, Enable);
}

void DS1307_ClockHalt(uint8_t Enable)
{
	uint8_t tmp;

	if(Enable>1) Enable = 1;

	HAL_I2C_Mem_Read(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_SECONDS, 1, &tmp, 1, DS1307_I2C_TIMEOUT);
	tmp &= ~(1<<7);
	tmp |= (Enable<<7);
	HAL_I2C_Mem_Write(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_SECONDS, 1, &tmp, 1, DS1307_I2C_TIMEOUT);
}

uint8_t bcd2dec(uint8_t BCD)
{
	return (((BCD & 0xF0)>>4) *10) + (BCD & 0xF);
}

uint8_t dec2bcd(uint8_t DEC)
{
	return ((DEC / 10)<<4) + (DEC % 10);
}

int dayofweek(int Day, int Month, int Year)
{
    int Y, C, M, N, D;
    M = 1 + (9 + Month) % 12;
    Y = Year - (M > 10);
    C = Y / 100;
    D = Y % 100;
    N = ((13 * M - 1) / 5 + D + D / 4 + 6 * C + Day + 5) % 7;
    return (7 + N) % 7;
}

void DS1307_SetDateTime(RTCDateTime *DateTime)
{
	uint8_t tmp[7];

	if(DateTime->Second > 59) DateTime->Second = 59;
	if(DateTime->Minute > 59) DateTime->Minute = 59;
	if(DateTime->Hour > 23) DateTime->Hour = 23;
	if(DateTime->Day > 31) DateTime->Day = 31;
	if(DateTime->Month > 12) DateTime->Month = 12;
	if(DateTime->Year> 2099) DateTime->Year = 2099;

	tmp[0] = dec2bcd(DateTime->Second);
	tmp[1] = dec2bcd(DateTime->Minute);
	tmp[2] = dec2bcd(DateTime->Hour);
	tmp[3] = dayofweek(DateTime->Day, DateTime->Month, DateTime->Year) + 1;
	tmp[4] = dec2bcd(DateTime->Day);
	tmp[5] = dec2bcd(DateTime->Month);
	tmp[6] = dec2bcd(DateTime->Year - 2000);

	HAL_I2C_Mem_Write(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_TIME, 1, tmp, 7, DS1307_I2C_TIMEOUT);
}

void DS1307_CalculateDateTime(RTCDateTime *DateTime)
{
	DateTime->Second = bcd2dec(Ds1307Buffer[0]);
	DateTime->Minute = bcd2dec(Ds1307Buffer[1]);
	DateTime->Hour = bcd2dec(Ds1307Buffer[2] & 0x3F);
	DateTime->DayOfWeek = Ds1307Buffer[3];
	DateTime->Day = bcd2dec(Ds1307Buffer[4]);
	DateTime->Month = bcd2dec(Ds1307Buffer[5] & 0x1F);
	DateTime->Year = 2000 + bcd2dec(Ds1307Buffer[6]);
}

#ifdef DS1307_USE_DMA
void DS1307_ReceiveDateTimeDMA(void)
{
	HAL_I2C_Mem_Read_DMA(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_TIME, 1, Ds1307Buffer, 7);
}
#else
void DS1307_GetDateTime(RTCDateTime *DateTime)
{
	HAL_I2C_Mem_Read(hi2c_ds1307, DS1307_ADDRESS, DS1307_REG_TIME, 1, Ds1307Buffer, 7, DS1307_I2C_TIMEOUT);

	DS1307_CalculateDateTime(DateTime);
}
#endif

void DS1307_ReadRAM(uint8_t Address, uint8_t *Value, uint8_t Length)
{
	if((Address < DS1307_REG_RAM_START) || (Address > DS1307_REG_RAM_END)) return;
	if((Address + Length + DS1307_REG_RAM_START) > DS1307_REG_RAM_END) return;

	HAL_I2C_Mem_Read(hi2c_ds1307, DS1307_ADDRESS, Address, 1, Value, Length, DS1307_I2C_TIMEOUT);
}

void DS1307_WriteRAM(uint8_t Address, uint8_t *Value, uint8_t Length)
{
	if((Address < DS1307_REG_RAM_START) || (Address > DS1307_REG_RAM_END)) return;
	if((Address + Length + DS1307_REG_RAM_START) > DS1307_REG_RAM_END) return;

	HAL_I2C_Mem_Write(hi2c_ds1307, DS1307_ADDRESS, Address, 1, Value, Length, DS1307_I2C_TIMEOUT);
}

void DS1307_Init(I2C_HandleTypeDef *hi2c)
{
	hi2c_ds1307 = hi2c;

	DS1307_SQWRateSelect(SQW_RATE_1HZ);
	DS1307_SQWEnable(1);
	DS1307_ClockHalt(0);
//	Ds1307Buffer[0] = 0x00; // 初始化为写入ds1307的起始地址
//  Ds1307Buffer[1] = 0x80; // 控制寄存器,启用时钟输出
//  HAL_I2C_Master_Transmit_DMA(hi2c_ds1307, DS1307_ADDRESS, Ds1307Buffer, 2);
//  HAL_Delay(10); // 等待数据传输完成
}
void DS1307_ReadTime(I2C_HandleTypeDef *hi2c,uint8_t *time_data)
{
	hi2c_ds1307 = hi2c;
  Ds1307Buffer[0] = 0x00; // 读取ds1307的起始地址
  HAL_I2C_Master_Transmit_DMA(hi2c_ds1307, DS1307_ADDRESS, Ds1307Buffer, 1);
  HAL_I2C_Master_Receive_DMA(hi2c_ds1307, DS1307_ADDRESS, time_data, 7);
  HAL_Delay(10); // 等待数据传输完成
}

  • DS1307.h文件
/*
 * DS1307.h
 *
 * 	The MIT License.
 *  Created on: 4.09.2019
 *      Author: Mateusz Salamon
 *		Contact: mateusz@msalamon.pl
 *
  *      Website: https://msalamon.pl/dalsze-zmagania-z-rtc-ds1307-i-pcf8563-na-stm32/
  *      GitHub: https://github.com/lamik/DS1307_RTC_STM32_HAL
 */
#ifndef __DS1307_H__
#define __DS1307_H__

//	Uncomment when you are using DMA reading
#include "main.h"

#define DS1307_USE_DMA	

#define DS1307_ADDRESS      (0x68<<1) //ds1307设备地址
#define DS1307_I2C_TIMEOUT			100

#define DS1307_REG_TIME             0x00

#define DS1307_REG_SECONDS          0x00
#define DS1307_REG_MINUTES          0x01
#define DS1307_REG_HOURS          	0x02
#define DS1307_REG_DAY              0x03
#define DS1307_REG_DATE             0x04
#define DS1307_REG_MONTH            0x05
#define DS1307_REG_YEAR             0x06
#define DS1307_REG_CONTROL          0x07
#define DS1307_REG_RAM_START        0x08
#define DS1307_REG_RAM_END     		0x3F

//
//	Controll register 0x07
//
#define DS1307_CONTROL_OUTPUT_CONTROL			7
#define DS1307_CONTROL_SQUARE_WAVE_ENABLE		4
#define DS1307_CONTROL_RATE_SELECT_1			1
#define DS1307_CONTROL_RATE_SELECT_0			0


typedef enum
{
	SQW_RATE_1HZ 		= 0,
	SQW_RATE_4096HZ 	= 1,
	SQW_RATE_8192HZ 	= 2,
	SQW_RATE_32768HZ 	= 3
}SQW_Rate;

typedef struct
{
	uint16_t 	Year;
	uint8_t  	Month;
	uint8_t		Day;
	uint8_t		Hour;
	uint8_t		Minute;
	uint8_t		Second;
	uint8_t		DayOfWeek;
}RTCDateTime;

void DS1307_SQWEnable(uint8_t Enable);
void DS1307_SQWRateSelect(uint8_t Rate);
void DS1307_OutputControl(uint8_t Enable);
void DS1307_ClockHalt(uint8_t Enable);

void DS1307_ReadRAM(uint8_t Address, uint8_t *Value, uint8_t Length);
void DS1307_WriteRAM(uint8_t Address, uint8_t *Value, uint8_t Length);

void DS1307_SetDateTime(RTCDateTime *DateTime);
#ifdef DS1307_USE_DMA
void DS1307_ReceiveDateTimeDMA(void);	// Use in DS1307 Interrupt handler
void DS1307_CalculateDateTime(RTCDateTime *DateTime);	// Use in DMA Complete Receive interrupt
#else
void DS1307_GetDateTime(RTCDateTime *DateTime);	// Use in blocking/interrupt mode in DS1307_INT EXTI handler
#endif
void DS1307_Init(I2C_HandleTypeDef *hi2c);

#endif


📝主程序代码

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "DS1307.h"
#include "stdio.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
RTCDateTime r;      // Date and Time variable
uint8_t Message[32]; // UART message
uint8_t MessageSize;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
//    RTCDateTime *tm;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
    DS1307_Init(&hi2c1);
    uint32_t TimerUART = HAL_GetTick();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
    while (1)
    {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        if ((HAL_GetTick() - TimerUART) > 1000)
        {
       MessageSize = sprintf(Message, "%02d:%02d:%02d\n\r", r.Hour, r.Minute, r.Second);
//           MessageSize = sprintf(Message, "%02d:%02d:%02d\n\r", tm->Hour, tm->Minute, tm->Second);
           HAL_UART_Transmit(&huart1, Message, MessageSize, 1000);
//					printf("Time:%s \r\n",time_data);
            TimerUART = HAL_GetTick();
            HAL_GPIO_TogglePin(GPIOE, LED_Pin);
        }

    }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
#ifdef DS1307_USE_DMA
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == DS1307_INT_Pin)
	{
		DS1307_ReceiveDateTimeDMA();
	}
}

void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
	DS1307_CalculateDateTime(&r);
}
#else
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == DS1307_INT_Pin)
	{
		DS1307_GetDateTime(&r);
		printf("EXTI trigger! \r\n");
	}
}
#endif
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
    /* User can add his own implementation to report the HAL error return state */
    __disable_irq();
    while (1)
    {
    }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
    /* User can add his own implementation to report the file name and line number,
       ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

📚程序源码

  • 🎉工程基于STM32F103VE,可以根据个人适配到stm32任意一款型号的单片机上使用。
  • ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
  • 🍁对于文中所提供的相关资源链接将作不定期更换。
    • 🔰说明:本人没有开通打赏功能,也没有接受任何第三方自助,谨防上当受骗!
链接: https://pan.baidu.com/s/192KP5ozCzGFGhtzUAyuUhQ
提取码: p7j7

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM垃圾回收机制简介

内存管理 Java的内存管理很大程度指的就是对象的管理&#xff0c;其中包括对象空间的分配和释放。 对象空间的分配&#xff1a;使用new关键字创建对象即可 对象空间的释放&#xff1a;将对象赋值null即可。垃圾回收器将负责所有“不可达”对象的内存空间。 垃圾回收过程 任…

蓝桥杯web备赛——Node.js

node.js之前只能说是略有了解&#xff0c;这次好好了解一下吧&#xff01; 东西还是比较多的。 目前来看就了解比赛会用到的http模块就可以了&#xff0c;其他的暂且不做了解 const http require("http");//1.引入http模块const app http.createServer();//2.创建…

华为OD机试题【狼羊过河 or 羊、狼、农夫过河】用 C++ 编码,速通

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:狼羊过河 or 羊、狼、农夫过河…

Stata 回归结果详解

目录一、数据信息二、指标1.上半部分2.下半部分三、详细解释SSM - 模型平方和SSR - 残差平方和SST - 总平方和R-squared - R方 - 拟合系数Adj R-squared - 调整后的拟合系数df - 自由度MS - 均方差F - 总体显著性检验Prob > F - P值Root MSECoef.Std. Err.tP > | t |95% …

Python(黄金时代)—— python深入使用

深拷贝和浅拷贝 可变类型与不可变类型 可变对象是指&#xff0c;一个对象在不改变其引用的前提下&#xff0c;可以修改其所指向的地址中的值 不可变对象是指&#xff0c;一个对象引用指向的值是不能修改的 浅拷贝 浅拷贝是对于一个对象的顶层拷贝&#xff1b; 简单理解就是&…

蓝桥杯基础8:BASIC-7试题 特殊的数字

资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 153是一个非常特殊的数&#xff0c;它等于它的每位数字的立方和&#xff0c;即1531*1*15*5*53*3*3。编程求所有满足这种条件…

JavaSE——运算符

目录 一.运算符 二.赋值运算符 三.算术运算符 1.四则运算 2.加法运算 3.除法运算 4.取模运算 5.增量运算符 6.自增自减 四.关系运算符 五.逻辑运算符 1.逻辑与 && 2.逻辑或 || 3.逻辑非 &#xff01; 4. 短路求值 六.位运算符 1.按位与& 2.按位…

6款无版权可商用的图片网站

今天给大家分享几个无版权可商用的图片网站&#xff0c;无论是网页设计、还是数字营销、商业海报制作等等都可以非常简单方便的查询到自己想要的图片。 免费可商用图标库 unDraw https://undraw.co/illustrations unDraw是作者Katerina Limpitsouni一手创作的扁平化图标库&…

国内IT软件外包公司汇总(2023 最新版)!

大环境不行&#xff0c;面试太少了&#xff0c;很多本科生想进外包都没机会。非常时期&#xff0c;不需要在意那么多&#xff0c;外包作为过渡也是没问题的&#xff0c;很多外包其实比小公司还要好多了。 也不要太担心去外包会污染自己的简历&#xff0c;只要接触的项目还可以…

电商平台API接口,店铺所有商品

item_search_shop-店铺的所有商品 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥&#xff08;注册Key和secret接入&#xff1a; https://o0b.cn/anzexi&#xff09;api_nameString是API接口名称&#xff08;包括…

动态规划-构造最优二叉树的解路径_20230403

动态规划-最优二叉搜索树的解路径&#xff08;算法导论) 前言 本文将探索递归的先序和后续对信息表达的影响&#xff0c;通过考察最优二叉搜索树的解roo[i][j]的解&#xff0c;我们可以分析先序和后续遍历之间的互相转换关系&#xff0c;以及为了转换&#xff0c;所付出的空间…

蓝桥杯第23天(Python)(疯狂刷题第6天)

题型&#xff1a; 1.思维题/杂题&#xff1a;数学公式&#xff0c;分析题意&#xff0c;找规律 2.BFS/DFS&#xff1a;广搜&#xff08;递归实现&#xff09;&#xff0c;深搜&#xff08;deque实现&#xff09; 3.简单数论&#xff1a;模&#xff0c;素数&#xff08;只需要…

下一个系统不是Win12,微软要复活Win10X

先是 Windows 三年发布周期回归又是官方 UI 泄露&#xff0c;再到前不久新增的测试频道… 微软将在2024年推出或许名为 Windows 12 的下一代系统基本已经板上钉钉了。 相比过去&#xff0c;小蝾总觉得即便是换代更新能带来的震撼都越来越少了。 当年每一个版本都是划时代的更…

.net C#反编译及脱壳常用工具--小结

1、Reflector --微软自家工具--推荐 Reflector是最为流行的.Net反编译工具。Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使NET程序员眼前豁然开朗&#xff0c;因为这个免费工具可以将NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转…

【学习笔记、面试准备】机器学习西瓜书要点归纳和课后习题参考答案——第3章

机器学习西瓜书要点归纳第3章 线性模型3.1 基本形式3.2 线性回归3.3 对数几率回归3.4 线性判别分析3.5 多分类学习3.6 类别不平衡问题3.7 阅读材料习题目录地址 第3章 线性模型 3.1 基本形式 线性模型定义&#xff1a; 其中x是输入向量 优点&#xff1a;形式简单&#xff…

C#中的转换

一、什么是转换 将一个类型转换为另外一个类型&#xff1b;可以是两个值类型之间的转换&#xff1b;可以是两个引用类型之间的转换&#xff1b;可以是值类型和引用类型之间的转换&#xff08;拆箱与装箱&#xff09;&#xff1b;可以用户自定义转换。转换的时候有隐式转换/自动…

lombok快速入门

Lombok是一个实用的Java类库&#xff0c;可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代码。 通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法&#xff0c;并可以自动化生成日志变量&#xff0c;简化java开发、提高效率。 <…

好用到爆的windows文件检索工具--Everything

如果你的电脑是windows系统&#xff0c;那么这款软件强烈推荐大家安装>Everything&#xff0c;他可以帮助你快速的检索的磁盘里的文件&#xff0c;话不多说&#xff0c;开始安装 1.下载 访问https://www.voidtools.com/zh-cn/会跳转官方下载地址 双击安装包运行 效果如下…

Tensor张量基础与常用方法【Pytorch】

Tensor中文译名为张量&#xff0c;标量是零维张量&#xff0c;向量是一维张量&#xff0c;矩阵是二维张量&#xff0c;矩阵的堆叠是三维张量…… 张量的维数可以无穷大&#xff0c;不过由于现实世界是三维的&#xff0c;因此更高维度的图形我们无法想象&#xff0c;但是这并不…

即时通讯-6-已读回执的方案设计

背景-为什么展示已读未读 部分即时通讯软件会选择展示给用户已读未读&#xff0c; 主要是快速感知对方的阅读状态&#xff0c; 感觉到自己受重视&#xff0c; 方便做下一步操作。 如果要带点高度的讲&#xff0c;满足软件所代表的关键用户的诉求 什么场景下要展示已读回执 t…
最新文章