[STM32]从零开始的STM32 HAL库环境搭建
一、前言
之前在搭建STM32的标准库环境时就告诉过大家,开发STM32的方式主要有三种。一种是最原始但是效率最高的寄存器开发,另一种是效率仅次于寄存器难度相对较低的标准库开发,最后一种是最为简单但是程序效率最低的HAL库开发。如果对于初学者而言,你使用HAL库你可以快速的配置STM32的外设并将STM32使用起来,但是你会少很多接触STM32底层代码的机会,这不会让你的代码能力有所提升。所以,对于初学者,我并不建议一开始就学习HAL库,而是从标准库学起,由下而上的学习。在企业开发中,为了开发效率和程序员之间的开发环境统一,会更倾向于使用HAL库进行开发。提到HAL库的环境配置与效率问题,我们不得不提到一款软件了———cubeMX,这是由ST公司开发的用于简化STM32的初始化配置的一款软件,它能省去我们对函数库的配置与对外设的初始化,我们只需使用简单的几个步骤就能配置好STM32的HAL库开发环境并且初始化外设。那么,本次的教程,就会教大家如何安装cubeMX以及安装相关的固件库并且配置STM32的基本环境。
二、在开始之前
在开始配置HAL库之前,大家需要先配置好keil的环境,因为HAL库始终只是一个函数库,概念和标准库是一样的,然而cubeMX只是用来生成HAL库的软件而已。所以尽管HAL库简单,我们仍然需要keil来进行编译。这里需要大家准备好keil的环境并且已经安装好了STM32对应的芯片包。具体教程请看下面的文章:
keil的安装以及芯片包安装:[STM32]如何正确的安装和配置keil?(详细)-CSDN博客
在安装好keil以后,这里还需要下载我给的资料包,资料包中包含了cubeMX的安装包以及部分芯片在cubeMX的固件包。这里cubeMX安装包的下载方式较为苛刻,所以不推荐大家自己下载。
资料下载:https://pan.baidu.com/s/1IL9IQzxCNC95UWupvSFsug?pwd=clxm
提取码:clxm
在下载完资料以后,就可以继续下面的步骤了。
三、cubeMX的安装
既然我们要使用HAL库,第一步当然是配置一个HAL库的环境。上面我也提到了,HAL库的环境我们可以使用cubeMX直接配置。所以这里我们需要安装cubeMX。
打开我给的资料包文件夹下的cubeMX的文件夹就可以看到cubeMX的安装包了:
我们双击安装包启动安装引导程序:
首先就是这里可以选择是只为我安装还是为所有用户安装,这里我们选择“只为我安装”即可,我们选择上面的选项:
这里我们直接点击“Next”:
这里我们需要同意协议,并且点击“Next”:
这里我们再将“已阅读ST条款”打上勾,然后点击“Next”:
下面需要选择一下cubeMX的安装路径,这里需要注意的是cubeMX对中文非常敏感,路径中不能有一点中文或者其它特殊字符。选择好路径以后,我们直接点击“Next”:
这里点击了“Next”以后,可能会弹出下面的提示:
这里的提示表示这个目录已经存在,问我们要不要覆盖,如果点击了“yes”这个目录中原本文件夹就没有了。
如果收到了下面这样的提示就表示cubeMX安装的目录不为空,我们需要将目录清空或者新建一个目录:
来到下一步以后,这里有两个选项是关于快捷方式的需要我们选择要不要在桌面或者开始菜单添加快捷方式,这里我都打勾表示都要添加。随后点击“Next”即可:
随后就进入了安装,大家这里耐心等待:
进度条走完以后,我们直接点击“Next”:
最后点击“Done”:
至此,我们的cubeMX就已经安装完成了:
四、cubeMX的更新以及芯片包的安装
cubeMX和别的一些IDE或者语言不同,它的版本并不是固定在低版本,相反,cubeMX版本最好保持在一个比较高的版本。新版本会对旧版本生成的工程进行向下兼容,但是旧版本是没办法兼容新版本的。所以,现在就来教大家如何更新cubeMX吧。首先我们启动cubeMX:
这里我们点击上方菜单的“Help”:
在“Help”的下拉菜单中,我们点击“Check for Updates”:
这里会列出我们可以更新的cubeMX版本和固件包的版本,如果这里是空的,就表示你的cubeMX和固件包不需要更新:
这里我们需要勾选要更新的cubeMX和相关的固件包,最后点击“Install”:
随后就进入了更新得状态,但是这里可能会因为网络更新失败,这里目前没有解决办法,大家只能尝试使用一些正向代理手段来解决:
当然,如果实在没办法更新的话,不更新也没关系,我给的cubeMX的安装包版本是比较新的。
下面我们来教大家如何安装固件包,这里先说一下固件包的概念。固件包是为了让cubeMX支持相关的STM32芯片,假如我这里的想要生成STM32F1的HAL库工程,我就需要安装一个F1的固件包。所以,为了让我们的cubeMX能够支持到我们芯片,首先就需要安装相关的固件包。这里固件包可以分为在线安装和离线安装。这里两种方法我们都会介绍。首先是在线安装:
我们这里同样要点击菜单中的“Help”:
然后点击下拉菜单中的“Manage embedded software packages”:
随后就能看到下面的窗口了:
这里有STM32几乎所有单片机的型号,大家选择自己型号的单片机下载即可,这里我就用F1举例。我们点击STM32F1:
这里的下拉菜单中我们可以选择固件包的版本,这里建议大家选择最新版,我们直接在固件包前面打上勾然后点击“Install”即可:
随后就会开始安装了:
这里在安装固件包时,仍然可能因为网络出现错误。当然这里如果你因为网络问题一直无法下载固件包的话,可以看下面的离线固件包安装教程。
这里如果固件包安装好了固件包对应的前面的框的颜色会发生改变:
至此,我们的在线安装固件包就已经完成了。
现在你可能已经完成了在线安装,或者说你想进行下面的离线安装,但是我们现在有一件必须做的事,那就是确定自己的用户名中没有中文。怎么看用户名中有没有中文呢,我们需要到C盘中的“用户”文件夹下:
这里可以看到,我的计算机中拥有两个用户,这两个用户的用户名都没有中文和别的特殊字符,这里的两个文件夹就代表了这两个用户的用户文件夹:
如果你发现你的用户名中有中文,那可能就需要修改用户名或者是重新创建一个用户,重新创建用户相对简单一些。不管是哪种方法,在网络上都有对应的教程,大家跟着操作就行。这里保证用户名中没有中文的一步是绝对要做的,不然后面的cubeMX在生成的时候是一定会报错的。大家可能会有疑问,我们这里C盘下的用户文件夹,这个文件夹不就是中文吗,为什么这个中文没关系,其实这里的中文只是单纯的被显示为了中文,其实本质还是英文路径,不信吗?假如我们随便查看一个用户文件夹的属性:
我们可以看到这个文件夹位于C盘下的Users文件夹下,是的这里“用户”两个字被替换为了“Users”。
这里我们解决了用户名的问题就可以开始准备离线安装固件包了。首先我们这里需要了解一个路径“C:\Users\85884\STM32Cube\Repository”,即用户目录下的“STM32Cube”目录下的“Repository”目录:
这个目录包含了我们下载的固件包,以文件夹的形式存放在这里,这里的每一个文件夹就是一个固件包上面有单片机的型号和固件包的版本。所以,如果我们想离线安装的话,只需要将对应的固件包的文件夹复制到此处即可,打开我给的资料中的固件包文件夹,这里我提供了大多数常用系列的固件包:
大家使用时只需要将这些固件包复制到我刚才说的文件夹中即可。
复制进去以后,我们重启cubeMX就可以看到对应的固件包已经安装成功了:
如果我给的固件包中没有你想要的,可以去下方ST的github的开源主页:
cubeMX固件包开源主页:
STMicroelectronics/STM32Cube_MCU_Overall_Offer: This repo describes all STM32 MCU related GitHub projects. The open source offer for the STM32 MCU products
在主页中往下滑,就可以看到所有系列的固件包了:
这里我们以F7的固件包举例,我们点击“STM32CubeF7”就可以进入F7固件包相关的主页:
随后我们点击页面中的“Code”:
在下拉菜单中点击“Download ZIP”:
随后浏览器就会弹出下载了:
我们将这个压缩包下载到我们能找到的地方:
解压得到以下文件夹:
我们将这个文件夹复制到对应的路径中:
这个时候我们再启动cubeMX,再次来到固件包的管理页面,可以看到我们的固件包已经被添加进来了:
至此,我们离线安装固件包就已经完成了。
五、cubeMX新建一个STM32 HAL库工程
前面的步骤都算是为新建工程做的准备,从现在开始,我们才正式的开始创建cubeMX的工程并且生成STM32的工程,这里我会使用STM32F103C8T6来举例。我们首先还是启动cubeMX:
随后点击中间的“ACCESS TO MCU SELECTOR”:
在点击了以后这里可能会弹出更新框,也可能会更新失败,不过不用担心,只要固件包配置正确了,这里更新与否都无所谓:
随后会弹出这个芯片选择页面,这里要我们选择我们要使用的芯片:
直接在左上角的搜索框输入要使用的芯片型号即可:
我们在搜索结果中,双击就可以选择这个芯片了:
随后就来到一个这样的页面,这也表示我们的工程被创建了:
现在我们开始一些简单的配置使STM32能够正常工作,这些配置放在别的系列的单片机中也是必须的,我们首先来配置STM32的时钟,这里点击“System Core”,在下拉菜单中点击“RCC”:
这里我们需要将外部高速时钟使能(HSE):
配置完成以后就是这样的:
随后我们来对时钟进行详细的配置,这里点击顶部的“Clock Configuration”进入时钟的配置界面:
在cubeMX中,我们配置时钟输入或者是主频亦或是每个外设的时钟是非常简单的,我们只需要能看懂时钟树即可,现在我来带大家看看时钟树,我们先看最左边的部分:
这里有四种时钟,即外部高速,外部低速,内部高速,内部低速时钟。这些时钟被输入到了芯片内部,我们可以使用“锁相环源选择多路复用器”来选择那一路时钟进入锁相环。
我们继续往后面看,这里有“x”或者“/”符号的地方就是锁相环,它可以使时钟分频或者倍频,这也是为什么我们的外部时钟输入只有8M,而STM32的主频却有几十上百M,这些频率都是通过锁相环分频或者倍频之后得到的:
随后就是“锁相环源选择多路复用器”,我们看到在时钟树中能够选择时钟源的地方就使用的是“锁相环源选择多路复用器”:
在STM32F103单片机中的多路复用器只有三个,随着系列的增加,这里的多路复用器和锁相环都会变多。
我们现在来调整多路复用器,使STM32的系统时钟直接接到我们的外部高速时钟,具体的我们需要调整多路复用器,如图:
这里大家可能会问,16M的频率是不是太低了。这里我们当然可以改,我们直接改“HCLK”这里:
可以直接输入72回车,cubeMX会自动配置锁相环:
如上图就算是配置好了。这里最高频率不要超过芯片能工作的最高频率,否则可能会是芯片无法工作甚至烧毁。
配置完时钟,我们点击“Pinout & Configuration”回到刚才的配置界面:
随后点击“SYS”我们需要配置一下调试接口:
这里配置为“Serial Wire”:
设置以后,我们可以发现PA13和PA14被占用了,这也刚好是我们使用STLink下载程序的接口。如果不配置的话,下次烧录可能会存在烧录不进去的情况,如果你已经烧录不进去了,可以考虑使用串口将程序擦除再烧录。
配置完上面的模块以后,STM32已经可以基本的工作了,但是我们还需要配置一些GPIO来查看一点现象,比如,我们现在就来配置一下STM32最小板上LED对应的引脚,来点一个灯试试看。我们这里可以直接点击右边单片机上的PC13:
这里因为我们需要点灯,所以把GPIO配置为输出模式。配置完成以后,对应的GPIO会亮起:
然后我们再点击左边菜单中的GPIO进行详细配置:
点击选中我们要配置的GPIO口:
下面我们来详细的看看这些参数:
首先是“GPIO output level”表示GPIO一开始输出的电平,有“High”和“Low”两种选项,即一开始GPIO默认高或者低。
然后是“GPIO mode”,表示GPIO的输出模式,有开漏输出和推挽输出两种,这里因为要驱动LED,所以选择推挽输出。
然后是“GPIO Pull-up/Pull-down”表示GPIO的上下拉状态,这里可以上拉,也可以下拉或者说不上拉也不下拉。
最后是“Maximum output speed”表示GPIO的输出速度,这里我们可以直接选择高。
经过了上面的配置,我们的GPIO就已经配置好了。下面可以准备生成keil工程了,我们这里点击“Project Manager”进入项目配置界面:
首先是“Project Name”即项目的名字,大家可以根据用途给项目命名,我这里的项目是点灯,所以这里直接就写“LED”,注意,这里的项目名不能有中文和特殊字符:
然后是“Project Location”,我们需要选择一下项目的路径,注意这里路径中的每一个文件夹都不能有中文:
随后在“Toolchain /IDE”这里我们要选择“MDK-ARM”:
版本直接默认即可:
随后我们点击“Code Generator”配置一下代码的生成:
这里在第一个框中我们要选择“Copy all used libraries into the project folder”表示复制所有的库文件:
在第二个框中,我们将“Generate peripheral initialization as a pair of '.c/.h' files per peripheral”打上勾,表示将为每一个外设都生成一个单独的.c .h:
至此,我们所有的配置都已经完成了,我们直接点击“GENERATE CODE”生成工程:
在生成完成以后,可以看到这样一个弹窗,如果你在生成时报错了,就去检查对应的固件包有没有安装好,或者路径中有没有中文,cubeMX大部分的错误都是这两种:
这里我们直接点击“Open Project”这可以直接启动Keil:
点击了以后可以看到我们的keil了已经启动:
这里可以先不动,我们直接点击编译,编译一般都是没有错误和警告的,这也意味着HAL库的环境已经搭建完成了:
我们这里进入main.c:
往下滑就能找到我们的主函数了:
主函数的while也在这下面:
我们的一些初始化函数也被写在了主函数中:
既然我们一开始已经配置了GPIO,那么现在的GPIO已经被“MX_GPIO_Init”这个函数初始化为了我们想要的状态。我们不用再对GPIO有多余的配置,下面我们就来点个灯吧,我们可以直接使用HAL库中的引脚电平翻转函数和延时函数:
这里我们在主函数的循环中,每500ms翻转一次电平。大家注意,在cubeMX生成的工程中,一定要将代码写在“BEGIN”和“END”中,比如“/* USER CODE BEGIN WHILE */”和/* USER CODE END WHILE */“”这两个就是配对的,代码要写在这两个注释之间,不然下次使用cubeMX生成代码时,以前写的代码就会被覆盖。
我们再次将代码编译并且下载:
程序下载以后,可以看到LED正常闪烁。如果你的LED没有闪烁可能就需要检查一下是不是哪里没有配置好,或者使用调试模式看看问题。至此,我们的STM32 HAL库工程就已经生成完成了。
六、结语
在cubeMX中,我们可以配置STM32的所有外设,极大的简化了我们搭建环境和外设初始化的过程,但是问题也随之而来,HAL库将函数封装得太上层了,我们需要修改底层代码会变的非常不便。至于选择什么库进行开发,就看大家自己吧。最后,感谢大家的观看!
相关文章:
[STM32]从零开始的STM32 HAL库环境搭建
一、前言 之前在搭建STM32的标准库环境时就告诉过大家,开发STM32的方式主要有三种。一种是最原始但是效率最高的寄存器开发,另一种是效率仅次于寄存器难度相对较低的标准库开发,最后一种是最为简单但是程序效率最低的HAL库开发。如果对于初学…...
Docker部署Kafka SASL_SSL认证,并集成到Spring Boot
1,创建证书和密钥 需要openssl环境,如果是Window下,下载openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 还需要keytool环境,此环境是在jdk环境下 本案例所使用的账号密码均为: ka…...
Pr:音频过渡
Adobe Premiere Pro 自带一组共三个音频过渡 Audio Transitions效果。 对音频剪辑之间应用交叉淡化 Crossfade过渡,操作方式类似于应用视频过渡效果。 对于交叉淡化,要保证前剪辑的出点之后及后剪辑的入点之前有足够的预留内容(也称“手柄”&…...
HarmonyOs鸿蒙开发实战(17)=>沉浸式效果第二种方案一组件安全区方案
1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感,从而使用户获得最佳的UI体验。 2.组件安全区方案介绍 应用在默认情况下窗口背景绘制范围是全屏,但UI元素被限制在安全区内…...
从 const 到 mutable:C++ 中的优雅妥协与设计智慧
在C编程中,const 关键字被广泛应用于确保数据的不变性,它提供了一种强大的机制来防止意外修改,从而增强了代码的可靠性和可维护性。然而,在某些特定场景下,完全的不变性可能会限制设计的灵活性,这时 mutabl…...
CC工具箱使用指南:【CAD导出界址点Excel】
一、简介 群友定制工具。 面图层导出界址点Excel表之前已经做过好几个,这个工具则是将CAD导出Excel。 CAD数据如下: 工具将如上截图中的边界线导出界址点Excel,并记录下面内的文字。 二、工具参数介绍 点击【定制工具】组里的【CAD导出界…...
制作图片马常用的五种方法总结
目录 1. 以文本方式2. Windows的cmd方式3. PhotoShop方式4. 16进制5. Linux的cat方式 图片马:就是在图片中隐藏一句话木马。利用.htaccess等解析图片为PHP或者asp文件。达到执行图片内代码目的。 1. 以文本方式 用文本方式(这里用notepad。如果用记事本的方式打开…...
深入解析MySQL中的事务处理
一、引言 事务是数据库管理系统执行过程中的一个逻辑单位,它由一系列操作组成,这些操作要么全部执行,要么全部不执行。事务在保证数据的一致性、隔离性、持久性方面发挥着重要作用。MySQL作为一个广泛使用的数据库管理系统,对事务…...
TCP Analysis Flags 之 TCP Dup ACK
前言 默认情况下,Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态,并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时,会对每个 TCP 数据包进行一次分析,数据包按照它们在数据包列表中出现的顺序进行处理。可…...
r-and-r——提高长文本质量保证任务的准确性重新提示和上下文搜索的新方法可减轻大规模语言模型中的迷失在中间现象
概述 随着大规模语言模型的兴起,自然语言处理领域取得了重大发展。这些创新的模型允许用户通过输入简单的 "提示 "文本来执行各种任务。然而,众所周知,在问题解答(QA)任务中,用户在处理长文本时…...
光伏电站的方案PPT总结
现在的市面上每做一个项目,做个项目方案是必不可少的了,光伏电站的项目亦是如此,做一个既美观又有说服力的项目PPT方案就尤为重要,项目PPT方案的全面性,美观度更征服业主,拿下项目,下面我从鹧鸪…...
前端pdf预览方案
前端pdf预览方案 pdf预览一般不需要前端生成pdf文件,pdf文件一般是通过接口,获取pdf文件【responseType:‘blob’,】或二进制文件流【responseType: ‘arraybuffer’,】或者已有的pdf文件。 前端PDF预览通常是通过读取现有的PDF文件,并使用…...
java 深拷贝 浅拷贝 详解
在 Java 中,深拷贝和浅拷贝是对象拷贝(复制)时的两个重要概念,它们决定了拷贝后的对象与原对象之间的关联性。以下是深拷贝和浅拷贝的详解,包括定义、实现方式及其区别。 1. 概念解释 1.1 浅拷贝(Shallow …...
针对git、giteeVSCode连接的使用 || Live Share插件使用
1.下载git 链接 打开终端,桌面鼠标右键 2.配置密钥 登录gitee。 设置密钥 查看官方文档 跟着教程 复制最后的输出进行密钥添加 验证是否添加成功 3.创建&连接远程仓库 创建仓库 git终端进行配置 远程仓库克隆到本地 桌面终端clone,克隆他人|自己的仓库到本地…...
如何解决Ubuntu 20.04中Vim编辑器在按下Ctrl+S时暂停响应的问题
如何解决Ubuntu 20.04中Vim编辑器在按下CtrlS时暂停响应的问题 在Ubuntu 20.04中使用Vim编辑器时,用户可能会遇到按下CtrlS后编辑器似乎“卡死”或无响应的情况。这个问题实际上源于历史悠久的终端行为,而非Vim本身或操作系统的缺陷。以下是详细的分析及…...
mybatisPlus打印sql配置
MyBatis-Plus 提供了方便的配置方式来打印 SQL 查询语句,以便进行调试和性能分析。可以通过配置 log 来输出 SQL 语句以及执行的参数。 方法 1:通过 application.properties 或 application.yml 配置打印 SQL 可以通过配置 application.properties 或 a…...
Redis 内存管理
参考:面试官:为什么 Redis 不立刻删除已经过期的数据? 目录 1.Redis 给缓存数据设置过期时间有什么用? 2.Redis 是如何判断数据是否过期的呢? 3.Redis 过期 key 删除策略了解么? 4.大量 key 集中过期怎…...
Excel表文本函数、日期和时间函数
一、文本函数 函数说明CHAR返回字符代码所对应的字符CLEAN删除文本中的所有不可打印字符CODE返回文本字符串首字符的代码CONCATENATE合并多个文本字符串EXACT检查两个文本是否完全相同FIND查找文本中某个字符串的位置LEFT从文本的左边开始返回指定数量的字符LEN返回文本字符串…...
从零到一:利用 AI 开发 iOS App 《震感》的编程之旅
在网上看到一篇关于使用AI开发的编程经历,分享给大家 作者是如何在没有 iOS 开发经验的情况下,借助 AI(如 Claude 3 模型)成功开发并发布《震感》iOS 应用。 正文开始 2022 年 11 月,ChatGPT 诞生并迅速引发全球关注。…...
基于Java Springboot幼儿园管理系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
Python小白学习教程从入门到入坑------习题课2(基础巩固)
目录 一、选择题 二、实战题 2.1 实战1:输入一个年份,判断是否是闰年 2.2 实战2:模拟10086查询功能 2.3 实战3:使用嵌套循环输出九九乘法表 2.4 实战4:猜数游戏 一、选择题 1、以下选项符合Python语法要求且能够…...
基于IPMI_SSH的服务器硬件监控指标解读
随着企业IT架构的日益复杂化,对服务器的实时监控和管理变得至关重要。监控易作为一款功能强大的监控软件,支持通过IPMI_SSH的方式对服务器硬件进行远程监控,确保服务器的稳定运行。本文将针对监控易中基于IPMI_SSH的服务器硬件监控指标进行解…...
数据结构-二叉树及其遍历
🚀欢迎来到我的【数据结构】专栏🚀 🙋我是小蜗,一名在职牛马。🐒我的博客主页 ➡️ ➡️ 小蜗向前冲的主页🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏🌍前言 本篇文章咱们聊聊数据结构中的树,准确的说因该是只说一说二叉树以及相…...
(33)iptables设置防火墙策略常用命令(docker环境、非docker环境)
#普通环境(非docker) # 拒绝所有对端口 31001 的访问 iptables -A INPUT -p tcp --dport 31001 -j DROP # 允许 IP 地址 20.59.30.77 访问端口 31001 (此处用的是虚拟机 所以要使用nat地址的网关) iptables -I INPUT 1 -p tcp -s 20.59.30.77 --dpor…...
fastadmin中动态下拉组件(SelectPage)的使用
实现的功能如下: 1、支持模糊搜索;2、分页功能;3支持多选 官方文档:https://doc.fastadmin.net/doc/178.html html页面引用组件 <div class"form-group"><label class"control-label col-xs-12 col-sm-2…...
通过Python 调整Excel行高、列宽
在Excel中,默认的行高和列宽可能不足以完全显示某些单元格中的内容,特别是当内容较长时。通过调整行高和列宽,可以确保所有数据都能完整显示,避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业,尤其是在…...
力扣-Mysql-3278. 寻找数据科学家职位的候选人 II(中等)
一、题目来源 3278. 寻找数据科学家职位的候选人 II - 力扣(LeetCode) 二、数据表结构 表:Candidates ----------------------- | Column Name | Type | ----------------------- | candidate_id | int | | skill | varch…...
Android笔记(三十六):封装一个Matrix从顶部/底部对齐的ImageView
背景 ImageView的scaleType默认显示图片是这样,但是有时候设计稿需求希望图片左右能紧贴着ImageView左右边缘,又不破坏图片的比例,用自带的matrix,centerCrop等都可以满足 但是都会造成图片的某些区域被裁剪了,如果设…...
web 入门
学习 Web 开发的基础,建议从以下几个方面入门,按步骤循序渐进学习核心知识: 1. 了解 Web 的基础概念 在开始编码之前,先理解 Web 开发的基本工作原理: Web 前端与后端: 前端:负责用户界面和用…...
京东 2025届秋招 自然语言处理
文章目录 个人情况一面/HR面 10min二面/技术面 1h三面/技术面 1h四面/线下HR面 20min 个人情况 先说一下个人情况: 学校情况:211本中9硕,本硕学校都一般,本硕都是计算机科班,但研究方向并不是NLP,而是图表…...
杨家坪网站建设/seo网站优化方案
MFC 起步沉思录 一直以为学MFC就是往子类继承的虚函数里添加方法就OK了,但自从这个暑假学起MFC以来,就慢慢改变了我的愚见,我越来越懂得了师哥曾经说过的话,精通一门语言的关键还是算法或思想,学习MFC,只是…...
给wordpress添加引导页/软文写作的十大技巧
| 选择器 | 权重 | |-继承或者 *-|-0,0,0,0-| | 元素选择器(标签选择器) | 0,0,0,1| | 类选择器,伪类选择器 | 0,0,1,0| | ID选择器 |…...
重庆梁平网站建设哪家好/互联网线上推广
作者▕ IT修真院编审▕ 暗灭编辑▕ 匹诺曹本文共3500字,预计阅读需要20分钟课程大纲第一阶段——HTML及CSS入门任务一:九宫格——用htmlcss制作一个网页1、盒模型、常见元素分类、调试如何理解盒模型及其content、padding、border、margin?常…...
企业网站备案还是不用备案/晚上看b站
链接:https://ac.nowcoder.com/acm/contest/699/F来源:牛客网 题目描述 从前有个小哥哥Bill非常喜欢编程,但是让他更加心动的是班上那位小姐姐,为了取得小姐姐的欢心,Bill每天刷acm题,只想着找一个机会大发…...
市场营销价格策略/绍兴百度推广优化排名
这次。。。。。。好像稍有起色? 不像前几次那么差了,但是还是不尽如人意 凭君莫话封侯事,一将功成万骨枯,也许是在暗示着什么吧 继续保持 简要说一下考试经历 上来肛T1,想岔了把前缀和相减想成了相加,复杂度…...
wordpress设置静态页面/seo网站免费优化软件
据悉,Python语言最近的发展趋势难以令人忽视,因为其全面覆盖的特性得到了大家的关注,这门风头正劲的语言成为了全世界程序员们的学习对象。不过也从侧面反映出 Python 语言的特点:简单、高效。其实近期小编研究了不少代表技术趋势…...