STM32F407简单驱动步进电机(标准库)
配置
单片机型号:STM32F104ZGT6
步进电机:YK28HB40-01A
驱动器:YKD2204M-Plus

接线方式:
pu+:接对应的产生PWM的引脚,这里接PF9,对应TIM14_CH1通道!
pu-:接单片机的GND;
DR+:接单片机的3.3V(电机转动的方向固定)或者单片机的控制引脚这里是PF8
DR-:接单片机的GND;
这里没有使用电机的使能引脚!!!
-V:接24V的负极
+V:接24V的正极
A+:接的步进电机的红线(需要参考对应的原理图,不同的电机接法存在差异)
A-:步进电机的蓝线
B+:步进电机的绿线
B-:步进电机的黑线
采用定时器主从模式,发送固定脉冲,控制步进电机的转动;
比如在驱动器上,将脉冲调到1600挡位,表示当有1600个脉冲到来时,电机转动一周。如果输入800个脉冲,则电机就转动半圈;
主定时器采用TIM14_CH1;
从定时器采用TIM12_ITR3;





表72在407中文手册370页; 表79在464页; 图165在446页; 图166在447页
代码部分
采用标准库进行开发,先创建好工程!
再创建一个pwm.c和pwm.h文件就可以驱动了!
pwm.c
#include "PWM.h"
#include "stm32f4xx.h" /*
*PF9 TIM14_CH1通道
*PF8 方向引脚
*/
void TIM14_PWM_Init(void) //主定时器 //uint32_t arr,uint32_t psc
{ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //使能定时器 14 时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9 复用为定时器 14GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOF8GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //复用推挽输出GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF8//TIM_InternalClockConfig()TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period =100-1; //arr; //设置自动重装载值 100-1TIM_TimeBaseStructure.TIM_Prescaler =1050-1;//psc; //设置预分频值TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim 0=TIM_CKD_DIV1TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(&TIM_OCInitStructure); //默认的初始化TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择 PWM 模式 1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;//输出极性高 //TIM_OCPolarity_Low; //输出极性低TIM_OCInitStructure.TIM_Pulse=50;//CCRTIM_OC1Init(TIM14, &TIM_OCInitStructure); //初始化 TIM//TIM_SelectMasterSlaveMode();//TIM_SelectOutputTrigger();TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable); //通道1的CCR可以更改TIM_ARRPreloadConfig(TIM14,ENABLE); //使能ARR预装载寄存器TIM_Cmd(TIM14, DISABLE); //使能 TIM14}void TIM12_Init(void)//从定时器
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM12,ENABLE); //使能定时器 12 时钟TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 65535; //设置自动重装载值 100-1TIM_TimeBaseStructure.TIM_Prescaler =1-1; //设置预分频值TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim 0=TIM_CKD_DIV1TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseInit(TIM12, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的//TIM_SelectMasterSlaveMode(TIM12,);TIM_SelectInputTrigger(TIM12,TIM_TS_ITR3); //TIM14主 TIM12从:ITR3TIM_SelectSlaveMode(TIM12,TIM_SlaveMode_External1);//从模式TIM_ITConfig(TIM12,TIM_IT_Update,DISABLE);TIM_ARRPreloadConfig(TIM12,ENABLE); //使能ARR预装载寄存器NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM8_BRK_TIM12_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM12, DISABLE); //使能 TIM12
}/**
uint16_t Num 发送的脉冲数(从定时器的ARR值)
uint8_t Dir 步进电机的旋转方向
uint16_t Speed 速度(更改主定时器的ARR值)
*/
void PWM_Output_Speed(uint16_t Num,uint8_t Dir,uint16_t Speed)
{if(Dir==1){GPIO_ResetBits(GPIOF,GPIO_Pin_8);//正转}else{GPIO_SetBits(GPIOF,GPIO_Pin_8); //反转}TIM_Cmd(TIM12, DISABLE);//关闭TIM12使能TIM_SetAutoreload(TIM12,Num);//从新设置ARR计数值TIM_GenerateEvent(TIM12,TIM_EventSource_Update);//配置由软件生成定时器事件,新修改ARR计数值后,马上软件更改一次事件TIM_Cmd(TIM12, ENABLE); //使能 TIM12TIM_ClearITPendingBit(TIM12,TIM_IT_Update);//清楚中断标志位TIM_ITConfig(TIM12,TIM_IT_Update,ENABLE);//开启定时器12的中断TIM_SetAutoreload(TIM14,Speed);//从新设置ARR计数值TIM_GenerateEvent(TIM14,TIM_EventSource_Update);//配置由软件生成定时器事件,新修改ARR计数值后,马上软件更改一次事件TIM_SetCompare1(TIM14,Speed/2); //设置CCR的值为ARR的一半,占空比为50%TIM_GenerateEvent(TIM14,TIM_EventSource_CC1);//配置后由软件生成通道一的事件,马上生效TIM_Cmd(TIM14, ENABLE); //使能 TIM14
}void TIM8_BRK_TIM12_IRQHandler(void)
{if(TIM_GetITStatus(TIM12,TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM12,TIM_IT_Update);TIM_Cmd(TIM12, DISABLE);//关闭TIM12使能TIM_Cmd(TIM14, DISABLE);//关闭TIM14使能TIM_ITConfig(TIM12,TIM_IT_Update,DISABLE);//关闭定时器12的中断}
}
pwm.h
#ifndef __PWM_H__
#define __PWM_H__#include "stm32f4xx.h" void TIM14_PWM_Init(void); //uint32_t arr,uint32_t psc
void TIM12_Init(void);
void PWM_Output_Speed(uint16_t Num,uint8_t Dir,uint16_t Speed);#endif
main函数部分
#include "stm32f4xx.h" // Device header
#include "pwm.h"int main()
{TIM14_PWM_Init(); //168M/168=1Mhz的计数频率,重装载值100,所以PWM频率为 1M/100=1Khz.TIM12_Init();PWM_Output_Speed(3200,0,40);//发送的脉冲数 步进电机的旋转方向 速度(更改主定时器的ARR值)while(1){}}
通过PWM_Output_Speed(3200,0,40);输入 3200个脉冲,电机逆时针转2圈。最后一位参数为速度;
PWM_Output_Speed(1600,1,40);就是沿顺时针方向旋转一周;
通过修改PWM_Output_Speed();可以实现电机的角度、方向、速度控制。
其他方式的pwm简单驱动
采用定时器的翻转模式,驱动电机的转动:
#include "PWM.h"
#include "stm32f4xx.h" /*
*PF9 TIM14_CH1通道
*PF8 为方向引脚
*/uint16_t CCR1=1000;void TIM14_PWM_Init(uint32_t arr,uint32_t psc)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //使能定时器 14 时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9 复用为定时器 14GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOF8GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //复用推挽输出GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF8TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = arr-1; //设置自动重装载值 输出频率TIM_TimeBaseStructure.TIM_Prescaler =psc-1; //设置预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim 0=TIM_CKD_DIV1TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //翻转模式 //TIM_OCMode_PWM1; //选择 PWM 模式 1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;//输出极性高 //TIM_OCPolarity_Low; //输出极性低TIM_OCInitStructure.TIM_Pulse=CCR1; //CCRTIM_OC1Init(TIM14, &TIM_OCInitStructure); //初始化 TIMTIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Disable);//失能 //使能TIM14在CCR1上的预装载寄存器 TIM_OCPreload_Enable
// TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能 TIM_ClearFlag(TIM14,TIM_FLAG_CC1); //清除定时器中断标志位TIM_ITConfig(TIM14,TIM_FLAG_CC1,ENABLE); //开启定时器比较中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM8_TRG_COM_TIM14_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM14, ENABLE); //使能 TIM14
}void TIM8_TRG_COM_TIM14_IRQHandler(void)
{uint16_t num = 0;if(TIM_GetITStatus(TIM14,TIM_FLAG_CC1)==SET){TIM_ClearITPendingBit(TIM14,TIM_FLAG_CC1);num=TIM_GetCapture1(TIM14);TIM_SetCompare1(TIM14,num+CCR1);}
}
在main函数中调用TIM14_PWM_Init(65536,1);
运行结果就是使电机沿单一方向转动,通过修改ARR值可以调速;
通过在main函数调用下面函数,可控制电机的旋转方向;(引脚接线注意接对)
GPIO_SetBits(GPIOF,GPIO_Pin_8); //反转
GPIO_ResetBits(GPIOF,GPIO_Pin_8); //正转
直接输出pwm波形的驱动
pwm.c
#include "PWM.h"
#include "stm32f4xx.h"
//#include "uart.h"/*
*PF9 TIM14_CH1通道
*
*/
void TIM14_PWM_Init(uint32_t arr,uint32_t psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //使能定时器 14 时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9 复用为定时器 14GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值 100-1TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim 0=TIM_CKD_DIV1TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择 PWM 模式 1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; //TIM_OCPolarity_Low; //输出极性低TIM_OCInitStructure.TIM_Pulse=50;//CCRTIM_OC1Init(TIM14, &TIM_OCInitStructure); //初始化 TIMTIM_Cmd(TIM14, ENABLE); //使能 TIM14}
在main函数中调用TIM14_PWM_Init(100-1,1680-1);
运行结果就是使电机沿单一方向转动,通过修改ARR值可以调速;
相关文章:
STM32F407简单驱动步进电机(标准库)
配置 单片机型号:STM32F104ZGT6 步进电机:YK28HB40-01A 驱动器:YKD2204M-Plus 接线方式: pu:接对应的产生PWM的引脚,这里接PF9,对应TIM14_CH1通道! pu-:接单片机的G…...
使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本
作者:来自 Elastic Jonathan Simon 收集数据对于可观察性和安全性至关重要,而确保数据能够快速搜索且获得低延迟结果对于有效管理和保护应用程序和基础设施至关重要。但是,存储所有这些数据会产生持续的存储成本,这为节省成本创造…...
LeetCode131. 分割回文串(2024冬季每日一题 4)
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1: 输入:s “aab” 输出:[[“a”,“a”,“b”],[“aa”,“b”]] 示例 2: 输入:s “a…...
万字长文解读深度学习——训练(DeepSpeed、Accelerate)、优化(蒸馏、剪枝、量化)、部署细节
🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总万字长文解读…...
STM32—独立看门狗(IWDG)和窗口看门狗(WWDG)
概述: WDG(Watchdog) 看门狗,看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能计时复位程序,避免程序陷入长时间的罢工状态,保证系…...
ks8 本地化部署 F5-TTS
huggingface上有一个demo可以打开就能玩 https://huggingface.co/spaces/mrfakename/E2-F5-TTS 上传了一段懂王的演讲片段,然后在 generate text框内填了点古诗词,生成后这语气这效果,离真懂王就差一个手风琴了。 F5-TTS 项目地址…...
Web组态大屏可视化编辑器
1、零代码、一键构建、一键下载 用户只需通过拖拉拽操作,即可在画布上添加、调整和排列各种设备组件、图表和控件。零代码拖拽方式让用户能够实时预览界面效果,直观地观察布局、样式和数据的变化。 2、实时展示,自动化连接数据,用…...
【comfyui教程】让模特换衣服,comfyui一键搞定!
前言 一键穿上别人的衣服?揭秘ComfyUI模特换装工作流! 你有没有想过,某天早晨你起床后,只需轻轻一点,就能穿上明星昨晚在红毯上的华丽礼服?这种听起来像是科幻电影的情节,如今通过ComfyUI模特…...
数据湖与数据仓库的区别
数据湖与数据仓库是两种不同的数据存储和管理方式,它们在多个方面存在显著的区别。以下是对数据湖与数据仓库区别的详细阐述: 一、数据存储方式 数据仓库 通常采用预定义的模式和结构来存储数据。数据在存储前通常经过清洗、转换和整合等处理࿰…...
golang分布式缓存项目 Day6 防止缓存击穿
该项目原作者:https://github.com/geektutu/7days-golang。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 1 缓存雪崩、缓存击穿与缓存穿透 概念解析: 缓存雪崩:缓存在同一时刻全部失效,造成瞬…...
Redis高可用-主从复制
这里写目录标题 Redis主从复制主从复制过程环境搭建从节点配置常见问题主从模式缺点 Redis主从复制 虽然 Redis 可以实现单机的数据持久化,但无论是 RDB 也好或者 AOF 也好,都解决不了单点宕机问题,即一旦 redis 服务器本身出现系统故障、硬…...
Angular框架:构建现代Web应用的全面指南
文章目录 前言一、Angular简介二、Angular的核心特性三、Angular的应用场景四、Angular的发展趋势五、如何开始使用Angular结语 前言 在当今高度竞争的互联网环境中,构建高效、响应迅速且易于维护的Web应用成为企业成功的关键。Angular框架以其强大的功能、灵活的架…...
Golang | Leetcode Golang题解之第563题二叉树的坡度
题目: 题解: func findTilt(root *TreeNode) (ans int) {var dfs func(*TreeNode) intdfs func(node *TreeNode) int {if node nil {return 0}sumLeft : dfs(node.Left)sumRight : dfs(node.Right)ans abs(sumLeft - sumRight)return sumLeft sumRi…...
gdb编译教程(支持linux下X86和ARM架构)
1、下载源码 http://ftp.gnu.org/gnu/gdb/ 我下载的8.2版本。 2、下载完后拷贝到linux的x86系统。 3、解压,然后进入到目录下,打开当前目录的命令行窗口。 4、创建一个生成目录。 5、我们先开始x86版本,这个比较简单,不需要配置…...
Android 开发指南:初学者入门
Android 是全球最受欢迎的移动操作系统之一,为开发者提供了丰富的工具和资源来创建各种类型的应用程序。本文将为你提供一个全面的入门指南,帮助你从零开始学习 Android 开发。 目录 1. 了解 Android 平台[1]2. 设置开发环境[2]3. 学习基础知识[3]4. 创…...
镭速大文件传输软件向金融银行的文档管理提供高效的解决方案
随着数字化浪潮的推进,金融机构对文档处理和大文件传输的需求日益增长。无论是中央机构还是地方分行,他们都急需一套强大的文档管理系统来应对日益庞大的数据量和日益复杂的业务需求。如何有效地管理海量文档,成为了金融机构面临的一大挑战。…...
D64【python 接口自动化学习】- python基础之数据库
day64 SQL-DQL-基础查询 学习日期:20241110 学习目标:MySQL数据库-- 133 SQL-DQL-基础查询 学习笔记: 基础数据查询 基础数据查询-过滤 总结 基础查询的语法:select 字段列表|* from 表过滤查询的语法:select 字段…...
HTTP 客户端怎么向 Spring Cloud Sleuth 传输跟踪 ID
在 Spring Cloud Sleuth 的请求链路追踪中,X-B3-TraceId 是第二个 ID,X-B3-SpanId 是第三个 ID。以下是 Sleuth 中各个追踪标识的含义: X-B3-TraceId:表示整个请求链路的全局唯一 ID,用于跟踪请求在多个服务间的流转。…...
为什么hbase在大数据领域渐渐消失
HBase 曾是大数据存储领域的标杆之一,凭借其强大的分布式、列式存储和高扩展性,广泛应用于电商、社交网络、金融等需要海量数据管理的场景。然而,近年来 HBase 的使用确实在减少,这主要是因为数据技术栈的演变和用户需求的变化。以下是一些主要原因: 1. 复杂的运维和管理…...
【GPTs】EmojiAI:轻松生成趣味表情翻译
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 💯GPTs指令💯前言💯EmojiAI主要功能适用场景优点缺点 💯小结 💯GPTs指令 中文翻译: 此 GPT 的主要角色是为英文文本提供幽默…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
