【嵌入式软件-STM32】STM32简介

news2024/11/26 18:40:49

目录

        一、STM32定义

        二、STM32用途

        三、STM32特点

        四、STM32 四个系列

        五、了解ARM

        六、芯片解释

        七、片上资源

        八、命名规则

        九、系统结构

        内核

        Flash

        DMA

        外设种类和分布

        十、引脚定义

        类型

        名称

        引脚

        十一、启动配置

        十二、STM32最小系统电路

                STM32及供电

        供电引脚

        滤波电容

        VBAT

        晶振

        复位

        启动配置(BOOT配置电路)

        下载端口

        十三、最小系统板实物图


tips:以下都是自己在网课学习整理的总结跟归纳~可能有自己偏向(就是详略啦~)ヾ(◍°∇°◍)ノ゙(嗯哼 因为大部分都是网课内容而已 主要是拿来自用而已~ 所以感兴趣可以自己去看同款江协网课——

简介

一、STM32定义

基于ARM Cortex-M内核开发的32位微控制器

二、STM32用途

智能车——循迹小车: 读取光电传感器/摄像头数据——驱动电机前进和转弯

无人机——读取陀螺仪加速计的姿态数据、根据控制算法去控制电机的速度——保证飞机稳定飞行

机器人——驱动舵机、控制机器人关节——让机器人运动

无线通信——连接上一些2.4G无线模块或蓝牙、WIFI模块——无线通信功能

物联网——借助无线模块来通信(如蓝牙、WIFI、ZigBee),STM32驱动继电器来控制220V电路的通断

工业控制——PLC,工厂用来进行工业控制

娱乐电子产品——爱心流水灯等(也可以弄lysk语音交流传输)

三、STM32特点

功能强大、性能优异、片上资源丰富、功耗低、经典的嵌入式微控制器

四、STM32 四个系列

高性能系列、主流系列、超低功耗系列、无线系列

CoreMark——内核跑分,跑分越高性能越好;

五、了解ARM

ARM公司设计ARM内核,半导体厂商完善内核周边电路并生产芯片

(所以芯片可以理解为 基于各内核与完整电路连线组成)


ARM系列:1)经典系列 ARM1 ~ ARM11

                   2)Cortex-A  性能最高,发展最快

                        Cortex-R(Real Time)面向实时性很高的场景

                        Cortex-M(Mircrocontroller)主要用于单片机领域(such STM32)

六、芯片解释

RAM:运行内存    实际存储介质SRAM

ROM:程序存储器 实际存储介质Flash闪存

与51不同,51为5V供电,不能直接给STM32供电,若用5V,则需加稳压芯片,把电压降到3.3V再给STM32供电

自画板子的话,则需了解封装

七、片上资源

NVIC 与 SysTick 为Cortex-M3内核里的外设,其余为内核外的外设

NVIC -嵌套向量中断控制器:用于管理中断的设备,比如配置中断优先级等东西

SysTick-系统滴答定时器:用于给操作系统提供定时服务的(Delay函数的功能)(STM32 可加入操作系统,如FreeRTOS、UCOS等,如果用操作系统,就需要SysTick提供定时来进行任务切换的功能)

RCC-复位和时钟控制:对系统的时钟进行配置,使能各模块的时钟(其他外设在上电的情况下,默认是没有时钟的,不给时钟的情况下,操作外设是无效的,外设不会工作,这样目的是降低功耗;所以在操作外设之前,必须要先使能它的时钟,用RCC完成时钟的使能)

GPIO—通用IO口:可用于点灯、读取按键等(最基本的功能)

AFIO-复用IO口:完成复用功能端口的重定义,还有中断端口的配置

EXTI-外部中断:配置好外部中断后,当引脚有电平变化时,就可以触发中断,让CPU来处理任务

TIM—定时器:最常用、功能最多的外设分高级定时器,通用定时器,基本定时器三种;最复杂->高级定时器,常用->通用定时器;不仅可以完成定时中断,还可以完成测频率、生成PWM波形(电机驱动、舵机驱动最基本的要求)、配置成专用的编码器接口等功能

ADC-模数转换器:STM32配置了12位的AD转换器,可以直接读取IO口的模拟电压值,无需外部连接AD芯片,使用方便~~

DMA—直接内存访问:可帮助CPU完成搬运大量数据这样的繁杂任务

USART—同步/异步串口通信:平时用的UART是异步串口的意思;此处USART既支持异步串口,也支持同步串口;

I2C—I2C通信:(与SPI为)两种常用的通信协议。STM32中配置了它们的控制器,可以用硬件来输出时序波形,使用起来高效;(用通用IO口来模拟时序波形也可以)

SPI-SPI通信:通信协议

CAN-CAN通信:通信协议,一般用于汽车领域

USB—USB通信:通信协议,可做模拟鼠标、模拟U盘等设备

RTC-实时时钟:在STM32内部完成年月日、时分秒的计时功能,可接外部备用电池,计时掉电也能正常运行

CRC—CRC校验:一种数据的校验方式,用于判断数据的正确性

PWR-电源控制:可以让芯片进入睡眠模式等状态,以达到省电的目的

BKP-备份寄存器:存储器,当系统掉电时仍可由备用电池保持数据(这个根据需要可以完成一些特殊功能)

IWDG-独立看门狗:当单片机因为电磁干扰死机或者程序设计不合理出现死循环时看门狗可以及时复位芯片,保证系统的稳定

WWDG-窗口看门狗:同上

DAC-数模转换器:可以在IO口直接输出模拟电压,是ADC模数转换的逆过程

SDIO-SD卡接口:可以用来读取SD卡

FSMC-可变静态存储控制器:可以用于扩展内存,或配制成其他总线协议,用于某些硬件的操作

USB OTG-USB主机接口:用OTG功能,可以让STM32作为USB主机去读取其他USB设备

八、命名规则

fd046481a08d4070aa5356c73a64f5aa.jpg

九、系统结构

09e5fad56513400795cd9dfed74e55fa.jpg

可以将系统分成四部分:内核、Flash、DMA、外设种类和分布

内核

连接着 三条总线
ICode-指令总线:用来加载程序指令的

DCode-数据总线:用来加载数据的(如常量、调试数据)

ICode 与 DCode 主要用来连接Flash闪存

System—系统总线

Flash

存储的为用户编写的程序

DMA

DMA,可以看作内核CPU的“小秘书”;

如有大量的数据搬运,让CPU来干则有点浪费时间,如有个外设ADC模数转换,这个模数转换可以配置成连续模式,用CPU会费时费力,影响CPU正常工作
DMA:负责简单且反复要干的事情,如数据搬运

2) DMA解析:

DMA通过DMA总线连接到总线矩阵上,可以拥有和CPU一样的总线控制权,用于访问外设;当需要DMA搬运数据时,外设会通过请求线发送DMA请求,然后DMA就会获得总线控制权,访问并转运数据(整个过程不需要CPU参与,省下了CPU的时间来干别的事情)

外设种类和分布

SRAM:用于存储程序运行时的变量数据

AHB系统总线(AHB-先进高性能总线):用于挂载主要的外设,挂载的一般是最基本的或性能比较高的外设

APB(APB-先进外设总线):用于连接一般的外设

1)桥接:

因为AHB和APB的总线协议、总线速度还有数据传送格式的差异,所以中间需要加两个桥接,来完成数据的转换和缓存

差异:

(AHB的整体性能比APB高一些,APB2性能比APB1高一些,APB2一般是和AHB同频率,都是72MHz,APB1一般是36MHz)

(所以APB2连接的都是一般外设中稍微重要的部分 如GPIO端口,还有一些外设的1号选手等 如UASRT1、SPI1、TIM1、TIM8(TIM8和TIM1一样,也是高级定时器,所以也是重要的外设)、还有ADC、EXTI、AFIO也是接在APB2上面的)

(其他的像2、3、4、5号外设、DAC、PWR、BKP等次要一点的外设都会分配到APB1上去)

十、引脚定义

(黑点左边为1号引脚,引脚按逆时针依次排序,直至48号引脚)

标红色的为电源相关的引脚;标蓝色的为最小系统相关的引脚;标绿色的为IO口、功能口引脚

类型:

        S——电源

         I——输入

        O——输出

        I/O——输入输出

名称:

I/O口电平:代表I/O口所能容忍的电压,FT——代表能容忍5V电压,无FT则只能容忍3.3V电压;若无FT的要接5V电平的,需要加装电平转换电路

主功能:上电后默认的功能,一般与引脚名相同,但引脚的实际功能以主功能为主,而非引脚名称的功能

默认服用功能:为I/O口上同时连接的外设功能引脚,在配置I/O口中可以选择通用I/O口或是复用功能

重定义功能:如果有两个功能同时复用在了I/O口上,而确实两个功能都需用到的话,可以把其中一个复用功能重映射到其他端口上,前提为重定义功能表里有对应的端口

引脚:

01.VBAT:备用电池供电的引脚,可接3V电池;当系统电源断电时,备用电池可以给内部的RTC时钟和备份寄存器提供电源

02.PC13-TAMPER-RTC:为I/O口,或侵入检测,或RTC;

        I/O口可根据程序输出或读取高低电平(最基本最常用的功能);

        侵入检测可用来做安全保障的功能,如产品安全性比较高,可在外壳加一些防拆的触点,接电路到该引脚上,若有人强行拆开设备,触点断开,该引脚的电平变化会触发STM32的侵入信号,然后会清空数据来保证安全;(可以理解为 有异常波动即立刻清空)

        RTC引脚可用来输出RTC校准时钟、RTC闹钟脉冲或秒脉冲

03.PC14-OSC32_IN  

&04.PC15-OSC32_OUT:是I/O口或接32.768KHz的RTC晶振

05.OSC_IN

&06.OSC_OUT:接系统的主晶振,一般为8MHz,芯片内部有锁相环电路,可以对这个8MHz的频率进行倍频,最终产生72MHz的频率,作为系统的主时钟

07.NRST:系统复位引脚,N代表低电平复位

08.VSSA

&09.VDDA:内部模拟部分的电源,如ADC、RC震荡器等;VSS为负极,接GND,VDD为正极,接3.3V;

10.PA0-WKUP

&11.PA1  &12.PA2  &13.PA3  &14.PA4  &15.PA5  &16.PA6  &17.PA7  &18.PB0

&19.PB1:都为I/O口,其中PA0兼具了WKUP的功能,可用于唤醒处于待机模式的STM32

20.PB2:是I/O口,或BOOT1引脚;BOOT引脚是用来配置启动模式的

(比起20号引脚(未加粗),更推荐使用10~19号以及21、22号引脚等(加粗),因为未加粗的I/O口可能需要进行配置或者兼具其他功能,使用时需要留意一下)

21.PB10 

&22.PB11:为I/O口

23.VSS_1  &24.VDD_1

35.VSS_2  &36.VDD_2

47.VSS_3  &48.VDD_3:都为系统的主电源口;VSS为负极,VDD为正极

STM32内部采用了分区供电的方式,所以供电口比较多,使用时,VSS接GND,VDD接3.3V即可

25.PB12  &26.PB13  &27.PB14  &28.PB15  &29.PA8  &30.PA9  &31.PA10  &32.PA11 

&33.PA12:都为I/O口

34.PA13  &37.PA14  &38.PA15  &39.PB3

&40.PB4:为I/O口或调试端口,默认主功能为调试端口,调试端口是用来调试程序和下载程序的

STM32支持SWD和JTAG两种调试方式,SDW需要两根线,分别是SWDIO和SWCLK;JTAG需要五根线,分别是JTMS、JTCK、JTDI、JTDO、NJTRST;

(本教材使用的事STLINK来下载调试程序,STLINK用的是SWD的方式,即只需占用34号PA13与37号PA14两个I/O口即可,在使用SWD调试方式时,剩下的PA15、PB3、PB4可以切换为普通I/O口来使用,但要在程序中进行配置,不配置的话默认是不会用作I/O口的)

41.PB5  &42.PB6  &43.PB7  &45.PB8 

&46.PB6:都为I/O口

44.BOOT0:同BOOT1一样,也是用来做启动配置的

十一、启动配置

即为BOOT0 与 BOOT1 两个引脚的功能

启动配置的作用:指定程序开始运行的位置,一般情况下,程序都是在Flash程序存储器开始执行,但在某些情况下,可以让程序在别的地方开始执行,用以完成特殊功能

如表6:

BOOT0接0(即接地),无论BOOT1接什么,启动模式都是主闪存存储器,即主闪存存储器被选为启动区域,也就是正常执行Flash闪存里面的程序(一般情况下最常用的模式)

BOOT1接0(即接地),BOOT0接1(即接3.3V电源正),启动模式都是系统存储器,即系统存储器被选为启动区域

该模式是用作串口下载用的

(这个系统存储器存的就是STM32中的一段BootLoader程序,BootLoader程序的作用就是接收串口的数据,然后刷新到主闪存中,这样就可使用串口下载程序了 )

(一般需要串口下载程序的时候会配置到这个模式上;①救急:若将以下五个端口全配置为I/O口,该芯片没有调试端口,下载不了程序,则这种情况就需要用串口的方式下载程序了;②没有STLINK,也没有JLINK,则可以使用串口来进行下载程序,多了一种下载程序的方式)

BOOT1接1(即接3.3V电源正),BOOT0接1(即接3.3V电源正),配置的是内置SRAM启动

该模式主要用来进行程序调试,用得少;

tips:

BOOT引脚的值是在上电复位后的一瞬间有效,之后可随便了;引脚定义中,BOOT1和PB2是在同一个引脚上(20.PB2),即上电的瞬间是BOOT1的功能,当第4个时钟过后就为PB2的功能了

十二、STM32最小系统电路

STM32及供电

        供电引脚

         该3个分区供电的主电源(如下图)

        与模拟部分电源(如下图)都连接了供电引脚(VSS->GND,VDD->3V3)

       

       滤波电容

        对于供电非常必要,连接在VSS与VDD之间,可以保证供电电压的稳定

        VBAT

        接备用电池,备用电池是给RTC和备用寄存器服务的,如不需这些功能则不用接备用电池,VBAT直接接3.3V或悬空即可

        如接3V的纽扣电池(如下图),正极接VBAT,负极接GND

晶振

接了8MHz的主时钟晶振,STM32的主晶振一般都为8MHz,8MHz经过内部锁相环倍频,得到72MHz的主频;

晶振的两个引脚分别通过这两个网络标号,连接到STM32的5、6号引脚;

另外还需要接两个20pF的电容,作为启震电容,电容的另一端接地即可;

如果需要RTC功能的话,还需要再接一个32.768KHz的晶振,电路和这个一样,接在3、4号引脚(OSC32就是32.768KHz晶振的意思,32768=2^{15},内部RTC电路经过2的15次方分频,就可以生成1秒的时间信号了)

复位

图为上电瞬间的波形

该复位电路是由一个10k的电阻0.1uF的电容组成(uF-微法),用来给单片机提供复位信号;

NRST接在STM32的7号引脚,NRST为低电平复位,即当该复位电路在上电的瞬间,电容是没有电的,电源通过电阻开始向电容充电,并且此时电容呈现的是短路状态,那NRST引脚会产生低电平;当电容逐渐充满电时,电容相当于断路,此时NRST就会被R1上拉为高电平,上电瞬间的波形为“先低电平,逐渐上拉为高电平”,其中的低电平就可以提供STM32的上电复位信号

(由于电容充电速度快,所以宏观来看,单片机在上电的一瞬间复位了)

电容左边并联了一个按键,可以提供手动复位的功能,当按下按键时,电容被放电,并且NRST引脚也通过按键被直接接地了,相当于手动产生了低电平复位信号;按键松手后,NRST又回归高电平,此时单片机就从复位状态转为工作状态

(复位按键平时一般在设备的小孔上,当设备死机且不方便断电重启时,可以拿针戳一下小孔里的按键,就可以使设备复位了,即为手动复位功能,按下按键,程序就从头开始运行)

启动配置(BOOT配置电路)

H1相当于开关的作用,拨动这个开关,就可让BOOT引脚选择接3.3V或是GND了

在最小系统板上,使用的是(如下图)这种跳线帽来充当开关的功能,当跳线帽插在左边两个脚时,就相当于接地;插在右边两个脚时,就相当于接3.3V,这样就可以配置BOOT的高低电平了

如若自己设计电路的话,接一个拨码开关也是没问题的,比插跳线帽要方便一些

跳线帽 插左边两个脚=接地

跳线帽 插右边两个脚=接3.3V

下载端口

如果是用STLINK下载程序,则需要把SWDIOSWCLK这两个引脚引出来方便接线

另外需把3.3VGND引出来,GND是必须引出来的,如果板子自己有供电的话,3.3V可以不引(但建议都引出来,方便一点)

十三、最小系统板实物图

(正面)

黑色芯片-STM32F103C8T6

左边两个跳线帽,用来配置BOOT引脚

复位按键

USB接口,可以进行USB通信,也可以为板子供电

8MHz的主时钟晶振

32.768KHz的RTC晶振

两个LED,上面为PWR电源指示灯,下面为接在PC13口的测试灯

SWD的调试接口,用来下载程序的

上下两排为用于接线的排针

(背面)

5个脚小芯片-3.3V稳压芯片

其余为电阻电容这些小元件

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器人动力学和轨迹规划

路径规划(way):规划连接位置A与位置B间序列点或曲线的策略。 注意:这个路径规划是非常重要的,是机器人智能的一个体现。 路径规划主要有3个方法:MoveJ:关节点到点运动,MoveL&#…

Spring Boot学习资源库:Java开发者的新篇章

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译,任…

crossover和虚拟机哪个好用?Mac电脑玩游戏用哪个软件?

由于大多数热门游戏都是针对Windows平台开发的,这对于Mac用户来说可能会带来一些困扰。幸运的是,有几款虚拟机软件可以帮助解决这个问题,其中最常提到的是Parallels Desktop(简称PD虚拟机)和CrossOver。 PD虚拟机&…

Nodejs-Nestjs框架 RBAC(基于角色的访问控制模型) 微服务 仿小米商城实战视频教程-2024年-试看学习记录

文章目录 前提-安装环境Nestjs框架介绍Nestjs框架环境搭建创建nestjs项目运行nestjs项目demonestjs新项目结构解释nestjs中的控制器、路由、Get、Post、方法参数装饰器nestjs模板引擎、配置静态资源(了解即可)nestjs中的服务(Model)nestjs中的cookie(了解即可)nestjs中的se…

企业工作者如何提高对数据治理的认知度

提高对数据治理的认知度是一个涉及多方面努力的过程,以下是一些建议,可以帮助企业或个人增强对数据治理的理解和重视: 一、教育与培训 组织内部培训:定期举办数据治理相关的培训课程,邀请行业专家或内部资深人士进行…

AI用得好,升职加薪早

最近,K哥在公司里经常说的一句话就是:“AI用得好,升职加薪早!” 而且我们团队每个人都增加了一条KPI,叫做“含AI量”。什么意思呢?就是完成一项工作,使用了多少AI工具。 我不仅这样要求团队&…

JS 数组去重 — 各类场景适合方法大全

JS 数组去重 — 各类场景适合方法大全 本文介绍各种场景 JS 去重 方法使用 性能最好、用的最多、场景大全 文章目录 JS 数组去重 — 各类场景适合方法大全 一、基础篇:简单直观的去重方法1. 使用Set数据结构2. 利用filter和indexOf方法3. reduce方法的应用 二、进阶…

国产长芯微LDC5422单通道、16位、电流源和电压输出DAC,HART连接完全P2P替代AD5422

描述 LDC5422是低成本、精密、完全集成、16位数模转换器(DAC),内置可编程电流源和可编程电压输出,设计用于满足工业过程控制应用的需要。 输出电流范围可编程设置为4 mA至20 mA、0 mA至20 mA或者超量程的0 mA至24 mA。 此产品的LFCSP版本有一个CAP2引脚…

Linux运维_安全狗Apache版本安装

--------->安全狗官网(网站安全狗-网站安全防护,防后门|防SQL注入|防CC攻击|网马查杀|防篡改) 1.下载解压安全狗 2.

《Windows PE》4.3 延迟加载导入表

延迟加载导入表(Delayed Import Table)是PE文件中的一个数据结构,用于实现延迟加载(Lazy Loading)外部函数的机制。 延迟加载是指在程序运行时,只有当需要使用某个外部函数时才进行加载和绑定,…

【最新华为OD机试E卷-支持在线评测】最小的调整次数(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

CAN和CANFD如何转换和通信

随着科技的发展,汽车电子和工业领域中CAN通信需要承载数据量也越来越大,传统CAN通信有了向CANFD通信过渡的倾向。在实现过渡的过程中可能会出现自己设备是CAN通信,客户设备是CANFD通信的情况,或者自己设备是CANFD通信,…

MySQL高阶2084-为订单类型为0的客户删除类型为1的订单

目录 题目 准备数据 分析数据 总结 题目 编写SQL查询以根据以下条件报告所有订单: 如果客户至少有一个类型为0的订单,则不要报告该客户的任何类型为1的订单。否则,报告客户的所有订单。 按任意顺序返回结果表。 准备数据 Create tab…

【java】spring boot打war包

【java】spring boot打war包 第1步:修改pom.xml文件的打包方式 在项目根目录下找到pom.xml文件,首先看看你的文件内容里有没有packaging节点;如果有packaging节点,直接修改节点为war<packaging>war</packaging><

Android Camera系列(四):TextureView+OpenGL ES+Camera

别人贪婪时我恐惧&#xff0c;别人恐惧时我贪婪 Android Camera系列&#xff08;一&#xff09;&#xff1a;SurfaceViewCamera Android Camera系列&#xff08;二&#xff09;&#xff1a;TextureViewCamera Android Camera系列&#xff08;三&#xff09;&#xff1a;GLSur…

单片机(学习)2024.10.9

目录 汇编整体分类 1.指令 2.伪操作 3.伪指令 汇编代码 汇编初始化 数据搬运指令 算术运算指令 加法 减法 乘法 比较指令 跳转指令 逻辑运算指令 与或&#xff0c;异或 左移右移 内存操作 LOAD/STORE 指令 写 读 CPU的栈机制 栈的概念 栈的种类 1.空栈(…

设备多久(60/50/40min)未上报,类似场景发送通知实现方案

场景描述 设备比较多&#xff0c;几十万甚至上百万&#xff0c;设备在时不时会上报消息。 用户可以设置设备60分钟、50分钟、40分钟、30分钟未上报数据&#xff0c;发送通知给用户&#xff0c;消息要及时可靠。 基本思路 思路&#xff1a; 由于设备在一直上报&#xff0c;如果…

叶国富的永辉填坑之旅

叶国富体验了一把过山车&#xff01;永辉的难题逐渐转移到名创优品&#xff0c;后者是否能应对这些问题&#xff0c;以及其股价的徘徊&#xff0c;都预示着挑战才刚刚开始。 转载&#xff1a;原创新熵 作者丨樱木 编辑丨蕨影 低迷了3年的二级市场&#xff0c;迎来了超级反转&…

【金九银十】笔试通关 + 小学生都能学会的堆排序

算法原理 堆排序是一种基于比较的排序算法&#xff0c;它利用了数据结构中的堆&#xff08;Heap&#xff09;。堆是一种特殊的完全二叉树&#xff0c;分为最大堆&#xff08;Max-Heap&#xff09;和最小堆&#xff08;Min-Heap&#xff09;。在最大堆中&#xff0c;每个父节点…

单场数字人直播爆量300万,GMV狂增80%,电商人如何玩转数字人直播?

单场直播带货300万&#xff0c;在头部主播那里也许不算什么。但如果告诉你&#xff0c;这是数字人直播做出的成绩&#xff0c;你会惊讶吗&#xff1f; 苏宁借力电商数字人开播&#xff0c;直播时长比以往能增加3倍&#xff0c;GMV增量80%&#xff0c;下单转化57%&#xff0c;不…