自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 【STM32】江科大STM32笔记汇总(已完结)

STM32江科大笔记汇总STM32学习笔记课程简介(01)STM32简介(02)软件安装(03)新建工程(04)GPIO输出(05)LED闪烁& LED流水灯& 蜂鸣器(06)GPIO输入(07)按键控制LED 光敏传感器控制蜂鸣器(08)OLED调试工具(09)OLED显示屏(10)EXTI外部中断(11)对射式红外传感器计次 旋转编码器计次(12)TIM定时中断(13)

2024-09-28 21:36:15 4617 8

原创 江科大笔记—LED闪烁& LED流水灯& 蜂鸣器

LED闪烁& LED流水灯& 蜂鸣器

2024-09-28 21:20:29 502

原创 江科大笔记—GPIO输出

GPIO模块分为GPIO输出和GPIO输入,本文章是主要讲解GPIO输出部分以及一些目录展示的其余内容。后面文章也会提供三个程序学习。第一个是LED闪烁,第二个是LED流水灯,第三个是蜂鸣器。具体哪些端口能容忍5v,可以参考一下stm32的引脚定义,带FT的就是可以容忍5v,不带FT的就只能接入3.3v电压)LED电路符号如下,左边是正极,右边是负极。如下为LED实物图,如果引脚没有剪过,长脚为正极,短脚为负极。通过LED内部也可以看正负极,较小的一半是正极,较大的一半是负极。

2024-09-28 18:11:04 921

原创 江科大笔记——新建工程

新建工程里的启动文件选择我们新建工程第一个加的就是启动文件,这个启动文件有很多类型,至于选择哪一个,我们要根据芯片型号来选择。在下面的表中,这是stm32f1系列中的型号分类,其中根据Flash的大小,分为了小容量产品LD,中容量产品MD、大容量产品HD…。stm32f100系列为超值系列,简写为VL,F105和F107为互联型产品CL,这个就没有根据Flash大小来分类.stm32f103c8t6的Flash为64K,所以选择MD的启动文件。与之对应新建文件步骤总结。

2024-09-26 11:38:15 778

原创 江科大笔记—软件安装

资料下载:https://jiangxiekeji.com/download.html 密码:32。amd64是64位的,x86是32位的,电脑是64位的。软件的支持包目录已经更改,是否要重新加载支持包。关闭软件,在右键以管理员身份运行。是否安装ULINK驱动,点击是。显示没有安装STLINK驱动。安装STLINK驱动成功。打开keil5安装目录。

2024-09-18 17:37:33 583

原创 江科大笔记—OLED显示屏

左边第一个是复位,第二个是全速运行,第三个停止全速运行,第四个单步运行、第五个是跳过当前行单步运行、第六个是跳出当前函数单步运行、第七个是跳到光标指定行单步运行。注:Use,这边是在线仿真,需要把STLINK和STM32都连接好。OLED_Font.h:存的是OLED的字库数据,因OLED是不带字库的,想要显示字符图形,先定义字符点阵的数据。点击程序深灰色区域,可以设置断点,然后点击全速运行,程序就会一直运行,直到断点停下。上面窗口是汇编程序,下面的是c语言程序,左边窗口是寄存器组和状态标志位等信息。

2024-09-18 15:42:06 484 1

原创 江科大笔记—STM32课程简介

课程简介

2024-09-18 15:19:33 296

原创 马王堆帛书版《道德经》

1973年,长沙马王堆汉墓出土了一批古书,其中就包括2170年前的古本《老子》(100年后被称为《道德经》)。结果经过整理复原,人们发现,该版本《老子》与我们现在流行的《道德经》版本,存在着一些差异。德 经上德不德,是以有德。下德不失德,是以无德。上德无为而无以为也。上仁为之而无以为也。上义为之而有以为也。上礼为之而莫之应也,则攘臂而扔之。故失道。失道矣而后德,失德而后仁,失仁而后义,失义而后礼。夫礼者,忠信之薄也,而乱之首也。前识者,道之华也,而愚之首也。是以大丈夫居其厚而不居其泊(薄),居其实不居

2024-07-02 20:26:01 486

原创 AD20使用操作第二部分

对封装管理进行整体编辑,把电阻0402改成0603封装:把1k电阻选中,然后点击——编辑。如原理图管脚画错了,到元件库里,找到管脚并改正,然后再单击右键——更新原理图。原理图编译,可以找出错误,在点击智能车主板.PrjPcb——工程选项。第二种:自己进行编号,按快捷键TAA,就可以进到位号编辑器里。不知道该U几——在封装管理器,通过位号排序——看改成U几。更新更改列表后,在点击——接收更改——执行变更。画方格,把元件给规划:放置——绘图工具——线。编辑完后——点击,接受变化——执行变更。

2024-07-02 09:51:08 845

原创 AD20操作使用part1

先点击右下角Panels,然后电击SCH Library如右下角没有Panels,在视图——状态栏点击,就会出来。点击放管脚,按Tab键,对管脚设置。电气连接点,方向向外,连接导线。鼠标放在导线上,按Shift,可以复制。1,2名字重复了。可以隐藏属性:管脚号和管脚名称设置。Description元件的描述:电阻ID是元件名称Comment:阻值Designator:位号,为R?电阻封装也可以点击Add Footprint进行封装。

2024-07-01 10:48:29 1215

原创 江科大笔记—读写内部闪存FLASH&读取芯片ID

前面一部分存储的是程序文件,最后一页存储的是用户数据,目前我们的假设是程序文件比较小,最后一页肯定是没有用到的,所以我们放心的使用最后一页,但是如果程序比较大,触及到了最后一页,那程序和用户数据存储的位置就冲突了,或者说如果你参数非常多,最后10页很大一部分都是留着存储用户数据的,这样如果前面的程序文件长一些,那样非常容易和用户数据冲突,并且这种冲突如果没发现,就会产生非常隐蔽的bug,那如何解决这个问题呢,这时我们可以给程序文件限定一个存储范围,不让它分配到后面我们用户数据的空间来。

2024-06-26 17:15:36 749

原创 江科大笔记—FLASH闪存

读写FLASH的用途:利用程序存储器的剩余空间来保存掉电不丢失的用户数据通过在程序中编程(IAP),实现程序的自我更新第一个用途,对于我们这个C8T6芯片来说,它的程序存储器容量是64K,一般我们写个简单的程序,可能就只占前面的很小一部分空间,剩下的大片空余空间我们就可以加以利用,比如存储一些我们自定义的数据,而且可以充分利用资源。不过这里要注意我们在选取存储区域时,一定不要覆盖了原有的程序,要不然程序自己把自己给破坏了,一般存储少量的参数,我们就选最后几页存储就行了、

2024-06-25 16:57:09 1268

原创 江科大笔记—独立看门狗&窗口开门狗

配置分频器和重装值:设置之前,需要设定想要的设定时间,例如1000ms,要设置1000ms,但只能设置/16分频之后,因为在最短时间和最长时间都包含1000ms。,是开启时钟了,只有这个LSI时钟开启了独立看门狗才能运行,所以初始化独立看门狗之前,LSI必须得开启,但是这个开启LSI的代码并不需要我们来写,我们看一下手册6.2.9。,是写入预分频和重装值,预分频和重装值具体写入多少,我们可以通过这里的超时时间公式来计算,最后当这些配置工作做完之后,可以执行指令(写入0xCCCC)来启动独立看门狗了,

2024-06-23 11:08:33 936

原创 江科大笔记—WDG开门狗

独立看门狗,它的特点就是独立运行,对时间精度要求较低。独立运行就是独立看门狗的时钟是专用的,LSI内部低速时钟,即使主时钟出现问题了,看门狗也能正常工作,这也是独立看门狗独立的得名原因,对时间精度要求较低,就是独立看门狗只有一个最晚时间界限,你喂狗间隔只要不超过这个最晚界限就行了,你说很快的喂、疯狂的喂、连续不断的喂,那都没问题。窗口看门狗,要求看门狗在精确计时窗口起作用,意思就是喂狗的时间有个最晚的界限,也有个最早的界限,必须在这个界限的窗口内喂狗。

2024-06-22 16:37:21 1059

原创 江科大笔记—修改主频&睡眠模式&停止模式&待机模式

首先是是Systemlnit函数,进来启动HSI,之后就是各种缺省配置,最后调用SetSysClock;SetSysClock是一个分配函数,根据前面解除不同的宏定义,选择执行不同的配置函数:如SetSysClockTo72、To56、To48等。最后在SetSysClockTo72里配置函数,如配置是:选择HSE作为锁相环输入,之后锁相环进行9倍频,再选择锁相环输出,作为主频,这样主频就是72MHZ。

2024-06-21 16:55:26 899

原创 江科大笔记—PWR电源控制

在低功耗模式下,也需要保留必要的唤醒电路,比如串口接收数据的中断唤醒,外部中断唤醒,RTC闹钟唤醒等,在需要设备工作时,STM32能够立刻重新投入工作。如果你只考虑进入低功耗,而不考虑唤醒STM32,那不就跟直接断电没区别了吗,所以低功耗模式我们要考虑关闭哪些硬件,保留哪些硬件以及如何去唤醒,当然关闭越多的硬件设备越省电,唤醒就越麻烦。

2024-06-20 19:19:00 1032

原创 江科大笔记—读写备份寄存器&实时时钟

(1.若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1)。最后一个DIV正在快速的自减,自减的范围是32767~0,DIV每自减一轮,CNT秒数加1,有了这个数我们就可以对秒数进行更细的划分,获取分秒厘秒毫秒这些参数。第六步,配置预分频器,给PRL重装寄存器一个合适的分频值,以确保输出给计数器的频率是1Hz。第三步,启动RTC时钟的LSE时钟,LSE时钟,默认关闭,需要手动开启。第一步,开启PWR和BKP的时钟。

2024-06-19 12:07:26 313

原创 江科大笔记—BKP备份寄存器&RTC实时时钟

20位的可编程预分频器,可适配不同频率的输入时钟,保证分频器输出给计数器的频率为1Hz,计时才正确。RTCCLK频率比较高,需要加一个分频器,来降频。加了一个20位的可编程预分频器,可以对选择的输入时钟进行1~2^20的范围分频,这可适配不同频率的输入时钟。H开头是高速,L开头是低速。E结尾是外部,I结尾是内部。高速时钟一般供内部程序运行和主要外设使用,低速时钟一般供RTC,看门狗使用。RTCCLK有三个来源,第一个是OSC引脚接的HSE外部高速晶振。

2024-06-18 11:05:21 1481

原创 江科大笔记—Unix时间戳

原子钟是当前计时最精确的装置,上千万年才误差一秒,那现在问题又来了,我们以一个恒定不变的秒来计时,但是地球自转越来越慢,这样记下去,计时的一天和自转的一天就会出现偏差,时间长一些,可能中午12点太阳就不是最高的位置。stlink上再引出一根3.3v的电源,接到VBAT引脚,这根线就模拟一个电池的电源一般情况下,VBAT是电池供电口需要接备用电池但是我们目前套件里没有电池,所以就直接引出一根3.3v电源线了也是一样的效果,这个程序的目的是在bkp备份进器写入两个数据,然后再把它们读出来显示一下。

2024-06-17 14:39:30 475

原创 江科大笔记—硬件SPI读写W25Q64

注意:PA15、PB3、PB4这里没有加粗,因为默认情况下,作为JTAG的调试端口使用的,如果要使用原本的GPIO功能或使用重定义外设引脚功能,都需要解除调试端口的复用,否则GPIO或外设引脚都不会正常工作,解除调试端口的方法,在6-4小节。

2024-06-15 18:58:12 784

原创 江科大笔记—SPI通信外设

时钟频率就是SCK波形的频率,一个SCK时钟交换一个bit,所以时钟频率一般体现的是传输速度,单位是Hz或者bit/s。可以看出来,SPI的时钟其实就是由pclk分频得来的,pclk就是外设时钟,APB2的PCLK就是72MHz,APB1的PCLK是36MHz。注意事项:一是这个频率数值并不是任意指定的,它只能是PCLK执行分频后的数值就只有这八个选项。

2024-06-13 21:51:03 1130

原创 江科大笔记—软件SPI读写W25Q64

CS(片选)接到PA4 ,DO(从机输出)接到PA6 ,CLK时钟接到PA5 ,DI(从机输入)接到PA7,当然我这里引脚其实并不是任意选的,实际上是接到了硬件SPI的引脚上,这样的话软件SPI和硬件SPI都可以任意切换。,作用是判断芯片是不是忙状态,要读取BUSY位,是否置1,1表示芯片在忙,0表示芯片不忙了。,执行扇区擦除,先发送指令20,再发送3个字节的地址,这样指定地址,所在的扇区就会擦除。,流程是:交换发送指令03,再发送3个字节的地址,随后转入接收,就可以依次接收数据。,发送一个指令码06。

2024-06-11 16:33:00 558

原创 江科大笔记—W25Q64简介

本节使用的是:W25Q64: 64Mbit / 8MByte。存储器分为易失性存储器和非易失性存储器,易失性存储器一般是SRAM,DRAM。非易失性存储器一般是E2PROM,Flash等。非易失性存储器,掉电不丢失。字库存储,可以应用到显示屏上,在屏幕上显示汉字,就得把汉字的点阵数据存起来,把字库直接存在stm32内部,这样适合少量汉字显示的情况,如果汉字非常多, 就不合适了,所以我们可以用这个芯片来存储汉字。

2024-06-10 21:37:54 1182

原创 江科大笔记—SPI通信协议

W25Q64是一个Flash存储器芯片,内部可以存储8M字节的数据,并且是掉电不丢失的。四根通信线:SCK(Serial Clock)串行时钟线、MOSI(Master Output Slave Input)主机输出从机输入、MISO(Master Input Slave Output)主机输入从机输出、SS(Slave Select)从机选择。(1) SCK (Serial Clock):时钟信号线,用于通讯数据同步。

2024-06-08 16:53:59 820

原创 江科大笔记—硬件I2C读写MPU6050

低电平和高电平时间是:16:9;低电平和高电平时间是:2:1。其实占空比,是为了快速传输设计的。查询引脚定义表,来规划引脚。但由于PB6,7,8,9被OLEDz占用,不方便接线了。可以使用I2C2引脚,但必须是SCL对应PB10,SDA对应PB11,两者不能互换。SCL接PB10,SDA接PB11,但是硬件I2C引脚不可以任意指定。指定STM32作为从机,响应几位的地址。可以选择10位地址和7位地址。2.把I2C外设和对应GPIO口初始化为复用开漏模式。更快的方法,按ctrl+alt+空格,提示参数。

2024-06-07 12:03:08 634

原创 江科大笔记—I2C通信外设

主机,就是拥有主动控制总线的权利。从机,只能在从机允许的情况下,才能控制总线。多主机模型可分为固定多主机和可变多主机。固定多主机就是总线上,有2个或2个以上固定的主机,上面固定为主机,下面是从机,只能是主机对从机进行控制,从机不能控制主机,当2个主机同时控制时,就会产生总线冲突,就要进行总线仲裁,仲裁失败的一方让出总线控制权。

2024-06-06 22:02:36 934

原创 江科大笔记—软件I2C读写MPU6050

由于我们这个代码使用的是软件I2C,就是用普通的GPIO口,手动翻转电平实现的协议,它并不需要STM32内部的外设资源支持,所以这里的端口(SDA,SCL),其实可以任意指定,不局限于这两个端口,你也可以SCL接PAO,SDA接PB12,或者SCL接PA8,SDA接PA9看,等等等等,接在任意的两个普通的GPIO口就可以,然后只需在程序中配置并操作SCL和SDA对应的端口。MPU6050板子上标有,X,Y轴示意图,纵向为X轴,横向为Y轴,Z轴是垂直芯片的轴,这里没标。第二个,把SCL、SDA置高电平。

2024-06-05 20:20:32 446

原创 江科大笔记—MPU6050简介

MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角也叫做欧拉角,常应用于平衡车、飞行器等需要检测自身姿态的场景欧拉角表明了飞机的姿态。欧拉角就是飞机机身相对于初始3个轴的夹角,飞机机头向下或上仰,这个轴的夹角叫俯仰,Pitch飞机机身左翻滚或右翻滚,这个轴的夹角叫滚转,Roll飞机机身保持水平,机头向右转或向左转,这个轴的夹角叫偏航,Yaw。

2024-06-04 19:17:55 961

原创 江科大笔记—I2C通信协议

那这里,目前主机是发送一个字节,字节的内容转换为16进制,高位先行,就是0xD0,然后根据协议规定,紧跟着单元是,就是接收从机的应答位,在这个时刻,主机要释放SDA,释放SDA后,引脚电平回弹到高电平,但是根据协议规定,从机要在这个位拉低SDA,所以从机的波形是这样的,该应答的时候,从机立刻拽住SDA,然后应答结束后,从机在放开SDA,现在综合两者的波形,结合线与的特性,在主机释放SDA后,由于SDA被从机拽住了,SDA没有回弹高电平,这个过程代表从机产生了应答。然而,在输出部分,采用的是开漏输出的配置。

2024-06-04 11:00:42 943

原创 江科大笔记—FlyMcu串口下载&STLINK Utility

FlyMcu是串口下载STLINK Utility是STLINK下载在编程之前,需要配置BOOT引脚,让STM32执行BootLoader,否则点击开始编程,程序会一直卡住。第一步STM32板上有跳线帽,把BOOT0配线帽拔下来,配置BOOT1。第二步,按下复位键,程序重新启动,这样芯片就进入BootLoader程序了。

2024-06-03 11:51:56 924

原创 江科大笔记—串口收发HEX数据包&串口收发文本数据包

串口收发HEX数据包接线图,在PB1口接了个按键,用于控制。首先USB转串口模块,GND共地,RXD接PA9,TXD接PA10,在PB1接按键,PA1接LED(长脚接正,短脚接PA1)。现象:按下按键,变换一次数据,发送一个数据包,OLED显示发送数据,串口助手收到数据,串口收发HEX文本数据包接线图,在PA1口,接了LED,用于指示。接收数据包,发送指定格式的数据包,OLED显示接收到数据包。现象:发送LED_ON开灯,发送LED_OFF关灯。

2024-06-02 10:16:24 322 1

原创 江科大笔记—USART串口数据包

那这里(S=2),这个状态的逻辑就应该是,收到一个数据,判断是不是\r,如果不是,则正常接收,如果是,则不接收,同时跳到下一个状态,等待包尾\n,因为我这里数据包有两个包尾\r\n,所以需要第三个状态,如果只有一个包尾,那在出现包尾之后,就可以直接回到初始状态了,只需要两个状态就行,因为接收数据和等待包尾需要在一个状态里同时进行,由于串口的包头包尾不会出现在数据中,所以基本不会出现数据错位的现象,例如,发送数字100时,HEX数据包只需一个字节100即可,而文本数据包则需要三个字节的字符’1,“0,0。

2024-06-01 11:26:42 999

原创 江科大笔记—串口发送&串口发送+接收

下面这个是我们的USB转串口的模块,这里有个跳线帽,上节也说过,要插在VCC和3V3这两个脚上,选择通信的TTL电平为3.3V,然后通信引脚,TXD和RXD,要接在STM32的PA9和PA10口。当然我们第一个代码,只有STM32发送的部分,所以,通信线只有这个发送的有用,另一根线,第一个代码没有用到,暂时可以不接,在我们下一个串口发送+接收的代码,两根通信线就都需要接了。查询的流程是,在主函数里不判断RXNE标志位,如置1,就收到数据 ,那再调用ReceiveData,读取DR寄存器,这样就行了。

2024-05-30 11:23:35 1186

原创 江科大笔记—USART串口外设

江科大笔记

2024-05-27 17:55:35 957

原创 江科大笔记—USART串口

USART:TX(数据发送脚)、RX(数据接收脚)I2C:SCL(时钟)、SDA(数据)SPI:SCLK(时钟)、MOSI(主机输出数据脚)数据发送、MISO(主机输入数据脚)数据接收、CS(片选,用于指定通信的对象)CAN:CAN_H、CAN_L(差分数据脚,用2个引脚表示差分数据)USB:DP(也叫D+)、DM(也叫D-)也是一对差分数据脚。全双工:指通信双方能够同时进行双向通信。发送线路和接收线路,互不影响。半双工:只有一个数据线,I2C、CAN、USB。

2024-05-26 19:06:54 760

原创 江科大笔记—DMA直接存储器存取

DMA可以直接访问STM32内部存储器的,直接存储器存取,包括运行内存SRAM,程序存储器Flash和寄存器等等,DMA都有权限访问他们,所以DMA才能完成数据转运的工作。外设指的是,外设的数据寄存器DR,比如ADC的数据寄存器,串口的数据寄存器等。存储器指的是,运行内存SRAM,和程序存储器Flash,是我们存储变量数组和代码的过程。每个通道都支持软件触发和特定的硬件触发。这里如果DMA进行的是存储器到存储器的数据转移,比如我们想把Flash的一批数据转运到SRAM去,那就需要软件触发了。

2024-05-25 10:31:12 902

原创 江科大笔记—DMA数据转运&DMA+AD多通道

如果你需要DMA的中断,那就调用DMA_ITConfig,开启中断输出,再在NVIC里,配置相应的中断通道,然后写中断函数就行了。第一步,直接调用DMA_Init,初始化这里各个参数,包括外设和存储器站点的起始地址,数据宽度,地址是否自增、方向、传输计数器、是否需要自动重装,选择触发源、通道优先级,那这所有的参数,通过一个结构体,就可以配置好了。第四步,在运行的过程中,如果转运完成,传输计数器清0了。第三步,就可以进行开关控制,DMA_Cmd,给指定的通道使能,就完成了。第一步,RCC开启DMA的时钟。

2024-05-22 12:30:07 547

原创 江科大笔记—AD单通道&AD多通道

电位器还是接到PA0门口,只从左到右,接了个传感器,从左到右是光敏传感器器,热敏传感器,反射式红外传感器,他的VCC和GND都接在面包板的正负极。另如觉得数据跳变的太厉害,可以采用滤波的方法,让AD的值平滑一些,如均值滤波,读10个或20个值,取平均值,作为AD滤波的值。程序现象AD的值有些抖动,可以采用迟滞比较的方法来完成,设置两个阈值,低于下阈值开灯,高于上阈值,关灯,这就可以避免输出抖动的问题。第五步,开关控制,调用ADC_Cmd,开启ADC,配置完成。第六步,可以对ADC校准,减小误差。

2024-05-20 11:15:23 407

原创 江科大笔记—ADC模式转换

如图,左边是输入通道,16个GPIO口外加两个内部通道,然后进行AD转换器,ad转换器里有两个组,一个是规则组、一个是注入组。规则组最多可以选中16个通道,注入组最多可以选择4个通道。然后转换的结果可以存放在AD数据寄存器里,其中规则组有1个数据寄存器,注入组有4个,然后有触发控制提供了开始转换的START信号,触发控制可以选择软件触发和硬件触发,硬件触发主要来自定时器,也可以选择外部中断引脚,然后还有ADC时钟CLOCK来自RCC,adc逐次比较的过程就是由这个时钟推动的。

2024-05-18 18:08:09 1406

原创 江科大笔记—编码器接口测速

A相输出接到PA6,B相输出接到PA7,也可以AB相可以互换,但PA6,PA7引脚不能随便更换。PA6,PA7是TM3的通道1和通道2。第一步,RCC开启时钟,开启GPIO和定时器的时钟第二步,配置GPIO,需将PA6和PA7配置成输入模式第三步,配置时基单元,预分频器一般选择不分频,ARR一般给最大值655535,只需要CNT执行计数就行了。第四步,配置输入捕获单元,这里只有滤波器和极性两个参数有用,后面的参数没有用到,与编码器无关。第五步,配置编码器接口模式,直接调用一个库函数。

2024-05-16 11:41:39 286

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除