粉丝21获赞14
大家好,现在来录制 s t n 三二 q 五 m x 开发 g d 三二 f 三零三。第七讲配置 print。 在我的 csdn 这里有一个文字版的教程,如果需要 gd 的一个芯片的话,可以找我来进行一个申请。 这个 pen 函数的话在很多地方都有用,比如说调试或者是打印系统信息。 这里使用 s 间三二 f 幺零三进行配置。时钟数的话在使没有使用外部的一个轻震,使用的是内部八兆的。然后通过一个背屏到了一个六十四 照的一个主屏,然后选择创口一,这里选择一个翼步,然后 bottle 的话就幺幺五二零零,这个由于是只要打印,所以的话这个就这个中断就可以不进行勾选。 然后在代码配置这里的话只生成我们需要的文件,以及独立开 c 和 h 文件。这里选择的是 m t k m 就是 q。 生存完毕之后,在魔术棒这里要勾选这个 micro 的一个 一个这个缺缺型的一个 c 库,否则的话是无法进行一个打印的。 debug 的话,这里使用的是一个追令进行一个调试, 这已经识别出来接口的话,就是一个 s w 的一个接口。这里勾选上一个复位和运行, 然后就引用一下这个 s t d i o 的一个 h 文件,如果不予引用的话,会 有一个这样的一个报错,然后就是一个重定项。由于这里我们使用的是一个创口一,所以在这里就写的是一个创口一,如果是二的话你就将它改成二。 接下来就没什么 好配置的,就是直接在这 wel 循环这里进行一个打印,一秒打印一次, 这时候编译完了,我们下载进去, 然后我们进行一下复位就可以看到他现在就是一秒打印一次,就说明已经配置成功了。 第七讲配置打印函数 pint 就已经讲解完毕,谢谢大家。
大家好,现在来录制 s t n 三二 cube 开发 g d 三二 f 三一三。第十三讲 iphone 七配置 o l e d。 在我的 csdn 这里有一个文字版的一个教程,这里使用的是我自己绘制的一个开发版, 然后使用 p b 八和 p b 九来作为一个 iphone c 进行一个输出。我们先新建一下工程, 配置一下适中, 因为 然后把这个调试口给它打开, 是 p a 十三和 p v 十四,之后的话在 iphone c 这里使了 iphone c, 这也默认的是 p b 六和 p b 七,这我们用的是 p b 八和 p p 九,我们可以这选中它,它就可以切换过来, 然后这个时候就已经配置完毕,点击一下生成我们的一个工程, 这里的话,一般的这种标准模式下,它最大就是一百 k, 地址位是一个七位,这些都是默认的,不用去对它进行过多的一个设置, 编一下它会提示版本五是不兼容,我们调到版本六 debug, 这里用一个追令来进行一个调试, 重新编一下,这个时候就没有爆出的警告,这也是一个 个淘宝,淘宝买显示屏给的一个开发文档,所以我们用 随便一个来进行一个开发的一个演示。 嗯,在这里也是有我的一个已知声明的, 可以看到在这里的话,他通过这图片我们可以知道他的一个地址位的话是 零幺幺幺幺零,然后它一共的话是可能会有两种地址, 然后在这里也说明啊,他只会有这两种的地址。在这里的话通过这个 s a 零来进行一个切换,然后对应的在 p c b 上是有一个电阻,一个上下拉来进行一个切换的, 然后还有一个这个因为我们只要对屏幕进行一个写的操作,就那么就是零,那么 它就会有一个,很多屏幕上都会写个零叉七八或者零叉七 a, 这样来代表它的一个地址,它是把这个 r、 w 也给加上去啊,所以看 那在这个小屏幕后面,它是可以通过这个电阻来切换它的一个地址,这上面写 iphone c 的一个地址。一般情况下一个 iphone c 线上只能挂两个这样的一个设备,然后用零叉七八或零叉七 a 来进行一个区分, 下面就是一个移词,我们看一下 这的话主要就是这几个文件, l、 d 点 c, l、 d 点 h, 还有 b、 m、 p 的话是图片,还有一个字库 都是在 这里面,我们复制一下, 在这里的话 h 文件是放在 n、 n、 c 这里面,然后 c 文件的话我们放在这个 s、 r、 c 里面,放进去之后要注意在这 给他导入,导入进来,没有导入进来的话,他是没有办法去进行一个识别的, 这时候就已经加进来了,像编一下,他应该就会出现有报错了,他会显示这 一个 s、 y、 s 的一个图文件的一个报错,这个的话我们还有报错,我们删掉它,这是一个系统的一个图文件, 还有这个 delete 的一个文件,我们也删掉它。 编译完之后呢,他自己会说这个 u 八和 u 三二这无符号八位, 还有一个五符号三十二位是没有定义,他就会出现这样的一个报错,我们可以去进行一下声明, 用我们这里随便定一个 定义之后,双击它,然后去打开到在这个 s t d inter 的 h 文件,这里是有一个声明的,我们复制一下, 这用的一般是 u 八和 u 三二,这个十六就没必要用它了, 嗯,这有个 u 三二, 我们重新编译一下,这时候他的报错警告就少了很多了。 我们先把这个 h 文件添加到我们的面函数里面, 那他现在还是有这么多的一个报错。 可以看到这里的话,它是对我们的一个 old 是一个模拟的,模拟的话它就会有一个这种 reset, reset 的话就是字领和 set 的话是字一,这里对应的是一个清除和设置, 但是我们用的是一个硬件的,就不用模拟了,然后这些我们就给他给注视掉就好, 这话它有这报错,这个的话是一个 iphone 七开始和停止进行了一个高电瓶和低电瓶,这个就是一个方波,但是我们用的是硬件,所以这些就不需要我们给它给, 都给他给注视掉就可以了。 那 iphone 七的话,它是对应的,你要导入 这个 iphone c 的一个头文件,要一般要用到的都是这个 l d 点 c, 这里面 对于 iphone 七写的一个函数的话,用这个函数,当然还有其他的 dma 这些方式。我们用这个的话,它主要是有几个参数, 一个是一个用的一个 iphone c 的一是一还是二,以及地址,包括它的要写入的指令长度和一个溢出时间。 这里的话可以看到它一共是写了三条指令,这个是 iphone c 写这个控制的一个指令,对应的就是七八零零,还有一个 iphone c 的一个控制指令, 修改完之后就通过这样的一个函数就可以发送出去,这上面就不需要了,这里的话就是对设备 地址零叉七八写入一个这样的一个长度是一的一个控制指令,他的一个艺术时间是零叉一百。 然后接着我们往下看,这个的话是写对 iphone c 写一个数据, 同样的他通过模拟的也是写的三个,分别是地址指令 以及它的一个 iphone c 的一个数据,这样就可以了。然后我们接着往下看,这个是应该是传一个图片,它用到的也是这个写一个字节,然后 在这里可以看到他调用的就是刚刚我们上面的要么就控制的一个指令,要么就是写数据的一个指令, 之后下面的话都是都是一样的,都是一一些写数据的一个指令, 然后重新编译之后还还有报错。在这个 oled 这个初始化这里 可以看到,在梦函数这里的话,它是有个初始化和一个清除的一个操作, 但是这些都已经在我们的 cube 里面已经 已经配置过了,就不需要通过操作这些来进行一个配置,然后我们注视掉它, 好像是就没有爆出的警告了,这的话是有个 delete 的两百毫秒, 我们再随便一个地方有个 h a l 库的一个延时, 我们在这里写入购物家就知道它是在 s t n 三二 f e h l 库里面, 那么我们要用到这个延迟的话,我们就要把它的一个库给导入进去, 再重新编一下, 现在就是没有报出和警告了。然后就是一个曲模, 这有个取模的一个软件, 可以看到刚开始打开的时候,它上面是显示一个图形的一个模式,我们再 模式这里把它切换为一个字符的一个模式,然后点击这个齿轮来进行一个设置,照着这个图表进行一个设置就行了啊,因为我们只要他的一个数据就行了,就不需要这些格式的一个定义,就给他会给取消掉。 这下面输入我们要的要显示的一个字,点击生成字母,它就会有显示出来了, 然后把它放到我们的一个字库里面,这个是淘宝给的一些默认的他自己的一个字库,我们改成我们自自己需要的。 等下我会讲这些制服到底是代表什么呢?像我们先深层用一下, 然后我们来让他进行一下显示,看下能否正常的进行一个显示, 这时候就能够正确地显示出来了。这个就是一个展示中文字符的一个函数,可以我们来到这个函数定义这里,可以看到这 x、 y 是对应的一个 坐标,还有的这个 n、 o 代表的就是它的一个, 可以看到它调用的是这个 h、 j、 k 的一个数组,就你用到第几个,你就去让它去写第几个就行了。比如说这个 n、 o 零的话是这个 g 字, n、 o、 e 的话是这个帖字, 这领子 t 疑似帖。 ok, 我们来看一下这个,这个年的话,它应该是在下面的,但是它这显示的是一个二, 他的一个坐标是这样的,这屏幕是幺八六四, 对应的就是一百二十八个像素点,乘以六六十四个像素点,那就是零到六十三,这是零到一百二十七。 在这里我们设置的字宽和字高是十六乘十六,这一个字的话,他应该是零到十五, 所以我们这里设置的时候,这个 g 的话,那就是这这哦在这个这个字, 所以这是零零开始,零零开始就在这里,这个铁的话是十六零,就是十六零, 那么这个年的话是三十二,三十二应该是在这里,那为什么它的一个 y 坐标是二呢?我们来看一下这个它的一个取码的一个方式, 它取码方式是这样的,它这勾选的是低位在前,高位在后的这样的一个取码 的一个方式。那么我们知道这样的一个数据里面,它是代表一个字减,那是八位的一个数据,那么你这十六乘十六,十六的话,那就要两个字减来进行一个表示。我来以这个年为例子, 哇,它的一个取码是这样的, 但是它是一个 d 位在前的。我 来先标一下,这第零列的话是都是零,那我们就不看它了,那我们看这第一列,那就是零零幺零, 那对应的就是这个零叉二零。然后零叉幺八的话,那就是 d 位在前嘛,那就对应的是零叉幺八,这个的话,那就是幺幺零零零幺幺幺对应的就是 c 七,这一共是十六乘十六的,那这一共有十六列。 修炼读完之后再从这里开始读,那所以这里是第零次,这是第一次, 这个话零叉零四的话呢,是, 所以这三个都是零叉零四,到这里的话, 这里就就是零叉零七,对的是这一列,这个取码就是这样取的, 所以的话这一个十六乘十六的字的话,它是占两两个二乘以八,那就是这 g 字的话,它占的就是 零一零和一,然后二开始那就是在这里了,二和三就是在在这里, 然后是四和五, 所以你要在这第二行显示的话,那前面的话,那就是零和一列,然后下面就是二和三,列和二和三行。 那要注意的话,它的一个字体大小的话,如果你是要显示,比如说数字这些的话,就要给它 一个字体大小,一般都是十六或者是十二,嗯,这个代码是错的。比如说我们要在这下面去进行一个 显示的话, 它对应的最开始应该是零, 那行的话,那就是这个气质是零和一,这个二零二二年的话是二和三,这也应该是一个四。 然后就是 j、 x、 y 显示三个字符,还有它的一个大小,我们让它显示一个小一点的一个十二, 你重新编译一下, 可以看到他就正常的显示在 在这里啊。然后还有一个图片,图片的话既然都是要这种 p、 n、 p 的一个格式,它就是只有两个灰度,分别是有这黑色的和这个白色的,分别用零和 e i 表示。 刚刚我们在这里是切换为这个字符模式,我们切换为图形模式,然后点击打开, 这样的话他就打,我们点击生成,可以看到这里显示的有点小,我复制复制出来一些, 这里的话,它后面都是有加这一个, 前面都有加这个大括号,后面都有加这个反大括号和一个逗号,但是我们不需要,不需要的话就自定义我们的一个格式,把这些都给删删除掉, 你就确认再重新生成,可以看到他这里就已经没有了, 图片是放在这个 b m p 点 h 的一个头文件中, 可以看到这里面的话也是全都是,他只是一个一维的一个数组,不是二维的,把这个给删删除掉, 把我们刚刚生成的给复制进去。 好,这样就复制成功了, 然后显示完这些字之后呢,延时两百 两千毫秒,那就是两秒,然后对整个屏幕进行一个清楚的操作,然后再显示我们的一个图片,它的位置是从零到零开始,这个是这个是它的一个结束的一个位置,就是起始和一个结束。 嗯,在这里有一个说明, 我们再重新编译一下 啊,这个还是能正常显示,后面的话就是显示我们的一个图片, 然后代码的话我也是附在了这后面,这都是一样的。 s t n 三二 q 版开发 g d 三二 f 三零三第十三讲就已讲解完毕,谢谢大家。
s t m 三二 q 波 max 是 s t m 三二 q 波工具家族中的一员,从 m c u m p u 选型、银角配置、系统适中 以及外设时钟设置到外设参数配置、中间键参数配置,他给 s t m 三二开发者们提供了一种简单方便并且直观的方式 来完成这些工作。所有的配置完成后,它还可以根据所选的 i d e 生成对应的工程和初日化 c 代码。除此之外, s t m 三二 q 波 max 还提供了工号计算工具,可作为产品设计中工号评估的参考。 pro max, 我们可以在菜单栏文件这里新建工程和加载以前创建好的 工程,那么我们如果想改变界面显示的字体大小,可以在 window 这里进行选择。那么我们在 hop 里还有一个很常用的功能,就是倒数第二个,这里可以安装我们的依赖包, 比如我们如果想安装 f 零的依赖包,就可以点击前面这个小三角,点开之后,这里我们可以看到他最前方这个小方块是空空白的,就证明我们没有安装,那我们可以点击这个这个选项,然后下面进行 进行 instar 安装,点击安装它就会在线给我们安装这个依赖包,等我们安装好之后,就会像 f 一前面这样变成了绿色,就证明我们安装好了。 那我们如果想新建工程呢?打开新建新建菜单栏,打开之后,我们可以在这里输入我们想要创建工程的芯片, 比如 s t m 三二 f 幺零三 c 八 t 六。我们输上之后,再 这一栏就可以看到所需要创建工程的芯片,让我们双击就可以进入图形化配置界面,打开之后我们可以看到芯片的图形化已经出来了。在银角配置之前,我们需要点击 sis, 这里 将第八个方式调整为 s w d 的,这样的话我们就可以用 s w d 的方式进行程序的稍写,比如我们使用 s t link 就可以 可以稍写程序了。那么我们如果想点亮一个 led 灯呢?经过查看原理图,假如我们的控制 led 灯的引角是 p b 零,我们就可以左键点击 p b 零,这里我们可以看到 pb 零相关的引脚配置就显示出来了,比如我们点灯的,那肯定是输出模式,所以我们就可以点击 gpl autoput, 点击好之后 我们可以看到它的颜色已经变了,变成了绿色,就证明我们可以用了。那 gpl 相关的详细配置呢?可以在试窗这里点击 gpl, 在 gpl 这里可以看到刚才配置的 p b 零,点击它能够在下方这里看到它详细的一些配置,那如果我们上电让它为 低电瓶的话,这就选 low, 如果要让它为高电瓶的,可以选 h。 下面这个是他的模式,是推碗输出的还是开漏输出的?通常情况下我们用推碗输出,所以这里配置推碗的,那上输出的上拉和下拉呢?一般不使用,所以都选 no。 那么我们的输出速度对于 led 灯来说,输出速度没有什么要求,可以默认用烙就行了。那最终我们配置完之后,需要生成工程,点击我们可以在这里输入工工程的名字。 第二个选项,这里是工程的路径,那在这里呢有我们输出的 id, 如果我们想用的是 k o, 就选择 m d k 杠 m, 这样的话就 我们生成的工程就是 m d k 杠 m 的了,就是 ko 可以使用了。那第二个选项呢?能够配置我们生成的代码,如果选择这个选项,那么我们生成的代码就是 只是需要的库,那选择第一个选项就是我们生成的代码为全部的库,这里还有一个地方需要配置, 点击勾选上,那么我们生成的代码就为模块化编程的方式,如果不选项就只有慢慢点 c 文件,那么所有的程序都会在慢点 c 中堆在一起, 我们勾选上生成工程,点击右上角这一侧生成,生成好之后我们就可以点击打开工程, 工程打开以后,我们可以在这里看到我们的慢点斯文件就已经生成好了,那么我们实现具体逻辑功能的函数就可以在这里进行编写了。
今天记录一下玩这个 s t m 三二 q max 的一个过程,我们可以先选择我们的一个 m c u, 然后 m c u 它这个是在更新我们的 m c u 的一个固定库,我们可以不用更新它, 然后我们等待他现金出来,然后因为我这是收藏了,我可以直接选我们所需要的一个,我选的是幺零幺 c 八 t 六的一个芯片, 然后选择芯片好以后,然后我们可以看到我们的一个电路,仍然是我们前面的那个电路,就是 是正极接的是一个三点三伏,负极接的是我们的单拼接的 a 零角,然后我们要让灯亮并且闪烁,我们就得将 a 零角设成一个输出的一个模式,然后我们找到我们的, 找到我们的 gpl, 这样就可以可以对他写一个标识,因为方便我们到时候调用 这个始终先暂时不管,暂时不用去管他的配置,然后对我们的这个工程密密不明,我们可以来一个 max, 我们工程进行一个命名,然后我们选择我们的 mdk 版本,可以来个低点的版本,然后我们再 把这两个选项配置一下,让他点 c 点 h 更好看一点,然后其他的地方都不用配置了,然后我们直接生成一个工程, 直接打开这个工程, 然后打开以后我们可以看到这儿慢点 c, gpl 点 c, 然后我们可以看慢点 c, 里面就对 gpl 进行了一个初始化,然后我们这儿就 首先要点亮,我们就得去找那个 pl 点 c 的那个弹出方法, 可以用这个方法来, 可以先用这个方法复制过来, 然后进去我们直接输入 led, 可以看到它就自动跳出了我们的一个 led 的一个输入,然后 我们可以来个延迟,可以延迟个五百毫秒,应该是个一千毫秒吧? 好,让我们叮一下, 可以看到 b e 没有搞错,然后我们直接下载, 下载完成的时候是这样,然后呢按一下复位按钮,就开始进行一秒钟的停车闪烁。
大家好,现在录制 s t n 三二 q 版 i d e。 第七讲创口收发配置, 在 cube 配置里面将时钟的一个主屏设置到了六十四兆, 在调试这里选择 s w d 的一个调试模式之后开启的是一个创口二, 波特率为幺幺五二零零,同时把这一个中段开起来, 设置完毕之后在工程这里勾 勾选,勾选这两个,同时 id, 选择 cube id, 然后我们生成一下工程。 在 csdn 这里也有我的一个文字版的一个教程, 这有个 print 的一个重定项,如果不需要的话就没必要进行一个配置。这我们 讲解创口的一个发送和接受函数,对于 dma 的话我们下节课再讲。 这发送函数有两种,一种是轮巡的方式发送,还有一个是通过 中断的一个模式进行一个发送接收,同样的是有轮巡和中断。 首先我们讲一下这个轮巡 短询发送的方式很简单,它就是 top k, 他首先定义好一个我们要发送的一个创口以及他的要方式送的一个数据以及他的一个长度,最后的话这个就是他的一个延时, 这个延时的话是一个毫秒,我们先看一下这个发送, 哦,这里的话是没有加延时的,我们加个延时, 在这里加入了一毫秒的延时,可以看到此时他通过轮巡向创口二中发送 buff 一的一个十个数据,要注意这一个 溢出的一个时间,如果设置太小可能没发完,他就已经关闭掉了。 然后我们再看一下一个中段发送,中段发送的话 它的方式会比较多一点,它主要有两个方法定义一个 buff 二,它的数据是九八七六四三二一零, 好通过这个中断进行一个发送。这里的话,这个 weld 是一个等待,如果发送完毕,他再去执行下面的一个就是组程序里面的一些其他的一些代码, 可以看到这时候他就是能够正常的打印了,然后 也可以用方法二,方法二的话这个就是一个等待,因为我们看下这个函数,当他发送完毕的时候,他会返回一个 ok, 所以我们可以在这里加一个 well 进行一个判断,当他如果发送完毕的话,就可以使用这个 ok 来进行一个判断。 那既然说到一个它是通过中断发送完,那么我们可以取消掉这个 well 的一个判断, 这样也是可以发送了。但是一定要注意,就是如果这个这个还没发送 完,你又在下面加加多了一个发送的话,他可能是第二条他没有发送出去,就是这个时序,一定要把把握好嘛, 这个他这样也是可以发送的。那我们看来进行一下对比,轮循和中断有什么不同?首先看到第一幅图,就是一个轮循的图,黄色线是创口发送数据的一个波形, 我说错了,第一个是一个这个中断发送的,当它 当他有就是不加这个 well 循环的时候, 它在中段里面发送,同时程序出程序可以执行其他的一些任务,如果像这种轮巡的话,它就会在它发送,就是这个没有 it 的, 等到他发送完毕,他才会执行一些其他的一些任务,这样的话就会造成 效组程序的一个效率较低下,同时在 rto 系统中不太建议使用这个,因为它会卡在那里。 好,现在我们来看一下一个接收这些,我们先注视掉, 这里话就定一个数组 deter 一,然后它的所有数据都是零, 这里的话也是通过轮巡获取十十个数据,它的一个延时,这也是一万毫秒,那对应的就是十秒,如果它读取完毕的话,它会返回一个 ok 的一个值,这时候我们将它进行一个打印。 好,我们现在发送一下, 可以看到发送过去他也是能够正常的进行一个打印的。 接下来我们再讲一下这个中断的一个接收,先先把这个给注视掉, 由于要用到一个读取的一个这个回调函数,那我们就需要将变量定一下外部, 同时因为这个是一个中断的接收,那既然是中断的接收,我们就首先需要开启一下中断 开始加中断,通过创口二接受一个十个数据,并放到这个 r x data 里面。 要注意就是使用 发送和接收的一个中段,中段发送或中段接收的时候,需要将这个进行一个 nvi 系的一个中段进行一个开启,否则他没有办法正常的进行一个工作。 这个读取的一个回调函数,他也很简单,就是当他读取完十个数据之后,他就会跳到这一个读取的一个回调函数里面, 这个时候呢就可以将它打印出来,打印完毕之后再重新进行一个开启,我们来验证一下, 发送五个 a, 五个 b, 可以看到发送过去也是能够正常地接收。然后再我再讲一下,就是在可以通过这个 r x 和 t s 口来进行接到我们的一个创口里,也可以用这一个 通过 s t。 零到的这个通讯口进行调试,也是可以的。比如说现在是用外部接的,我们可以切换到 s t 零的一个接口通过发送,同样也是 是可以进行一个调试的。 s t n 三二 q 把 id 第七讲创口的收发配置就已经讲解完毕,谢谢大家。
第一步操作,那我们先找到这个福瑞 f 在什么地方,那我们看在这个 q x 的这个界面里面,在他的最下侧 mini 中间键里面打开,上次课我们已经用了一个文件管理中间键,就是 fpt fs, 今天我们利用下一个中间键叫做福瑞阿 q s, 我们点一下这个中间键, 点一下,点一下之后,那么这里木的,首先第一个他没有打开我们的 a, 我们打开他,打开他之后稍等,然后会在底下啃这个瑞神里面,在底下这个窗口里面会出现一大堆财富配置 啊,出现一大堆彩虹为止。原来的福瑞阿特 s 的移植,他是一个开元的东西,就是说这个公,这是一个基金会,他们把这个福瑞阿特 s 原代码的他做了很多版本,然后这个版本呢他就免费发扬社会,然后你拿到这个版本呢,就像我们利用词一样,他是个是一个通用型版本, 然后你要是绑到某一个硬件上,比如说像我们的 s m 三二上,那你要对他叫做移植,要修改里面的一些参数,对吧?原来呢都是基于代码的形式,我们再代码一点点去改, 这个工作量还是有一定工作量。那么现在呢,这个一把公司呢?很牛,他从二零二零一,呃,一五年还是一六年,就是 qmax 出来之后,呃第二年,他现在呢就把这个福瑞 rts 呢,就把这个实时操作系统集成到他这可乐化鞋店里了。据说现在他的高端的产品, 那么他集成的这个实时操作系统越来越多,就是这种免费的,大部分都是免费的,那么大家都知道我们现在这款 mcu 现在主屏多少啊?主屏主屏频率多少啊?七十二、七十二兆特斯。昨天我们要做的东西,几个人,我们几个是调研,现在他的一把公司出了一款叫做 hhh 系列, hc 系列, h, 哎, hc 系列的这个内核主频到多少到多少兆赫兹了呢?你猜一猜。去年我们学那二四幺零 linuse 那个是二百二十兆,还记得吧?对吧?现在你说 f 三二 h 系列到多少呢?到了四百兆赫兹,那一个芯片,但多少钱呢?你猜多少钱的芯片 啊?多少钱?三十块钱。我们去年那栗子是多少钱呢?那一个芯片大概是四五百块钱,那一个板子两千多块钱 啊,所以说现在整个这个价格已经被拉的非常非常低了,知道主屏上的很很厉害。好了,这个东西得有速度,没有速度的话运行不起来。调用,调用,做这个调用, 然后接下来我们开始配置,那我们看在这里面的参数非常多,基本上我们把所有东西都要走一遍。首先第一个肯菲格瑞,呃,肯菲格牌是瑞特斯,这是对实时 操作系统福利 rts 的默认参数的配置,基本上他默认的,他基本上配的基本上比较 ok 了,基本上拿来就能用,大的不用改。首先这个版本是多少版本的?注意看这段版本啊,九点零点版本,你们的抓版本多少? 是不是有点这个,对吧?哎,这个版本还在升,他隔一段就升,隔一段就升,每个版本的兼容性还是有问题的。然后接下来 基本上是建名之意,你看他是蝌蚪腮艇,这就属于什么内核配置,内核配置里面基本上你什么都不用改,怎么什么都不用改啊?都不用动,第二个叫做 marry mand。 这边的腮艇什么意思啊? 内存管理,还记得我们上学期讲二四幺零的时候,我们一再强调就是对于这个嵌入系统,之所以能挂第六个词和不能挂第六个词,主要差在什么地? 孩子们还不知道,考试有考过类题,就是什么内存管理,通气,对吧?有个 mm 字那个东西,那么我们现在讲的 xm、 三二这些东西是没有内存管理这个硬件的,所以说 但是你跑操作系统你就要内存,对吧?该内肯定有吧,对吧?那么由谁来做内存管理?没有硬件用谁来做? 用软件来做?他要写算法,他一共写了几种算法呢?他一共写了五种算法。五种的,原来我的是四种,我去,去年看还是四种的,现在搞成五种了。 那这个如果你们有兴趣的话去研究一下,尤其比如说有同学考研究生要做这方面研究。这个他里面算法是很牛的,他里面大量的对列的处理算法,代法很简单。呃,原来我去参加一次这个福瑞阿杰的培训,然后有一个公司的,他们几个小小年轻的去,然后参加他们公司干什么? 他们要自己做这个任务。调度算法就是把福瑞 rts 里的调度算法给修改了,他们实现一个更高效的算法。当时他们去请教这个福瑞阿 ds, 这个在中国的代理是北航的一个教授开的公司,然后请教人家的一些问题, 就是感觉就说在实际应用中他们又有很多的变化,就是更加优化这个算法了。这很牛啊,那帮人就是搞算法的出身了啊。默认 你可以查资料,我默认呢用的就是第四种。那所谓这个内存管理,想一想怎么叫内存管理?怎么叫内存管理? 那么所谓内存管理就是什么呢?你得有这个概念,比如说我们要形成一个任务,对吧? pass, 那么这个任务里面是不是有很多变量,对不对?那这个任务有很多变量和过程值,但是当时间片轮巡时间到的时候,这个任务是不是要停掉啊? 要把 cpu 资源让给另外一个任务,对吧?但这就有个问题,当前的这个任务假定是 a 任务,那么他 a 任务的过程值哪去了? a 任务过程值哪去了? 你想象一下,过程值是不是都拿 cpu 在算的呀?对不对?那 cpu 这个时候跑别人那去了,那这值是不是丢失了呀?所以应该怎么办?存起来怎么存? 哎?存在什么对战区里面?就是我们讲 c 语言的对战区,所以说所谓的他这个内存就是这个卖卖卖,那什么卖那什么的内存管理。在我们这个实操作系统里面,实质上就是利用对战区 来实现一个上下文的推送啊,上下文的保管读写读写功能,所谓上下文就是当前的这个任务的状态值,哎,存进来,所有的计算器存进来,存起来,然后 用的时候再还原回来,对吧?就这个概念,然后这个也不用动,这个地方很重要,叫做头,太阳可以晒。什么意思? 扣他屁股。屁股是什么单词?有的说这个单词我原来也是一直没搞明白,那么我在这个文档里面给大家写了这么一段话,在下面这个位置,在这个第二一点四这个位置, s t m 三二中关于堆战的含义,在 s t m 三二中有两个单词,一叫一个叫做 style, 也叫做 k, 叫什么呢?堆和战,那么其中 style 战是干什么用的?战是用来存放函数里面的局部音量的,这好理解吧? 而堆是什么东西啊?是我们说的不是全级面料,堆是让程序员来动态申请和分配的,这就是我们 c 语言里面所谓是传统军人啊。对战,这不准确, c 语言我们的写那个教材写的不准确,应该严格的定义应该叫什么堆曲, 他不是战区,我们在 c 园里面升起的动态内存空间是堆区,不是战区,明白意思吧?战是由计算机自己管理的局部变量来管理的,对吧?那么这样的话,我们有了这概念之后,他们就可以知道。那么在我们这个配置参数里面,在我们这个配置参数里面,这个嘿股是什么东西啊? 这个黑布就是什么呀?哎,就是堆渠,就是用户程序申请和释放的东西,对吧?这个现在默认多少呢?三零七二大概多少呢?三 k 就是三 k 的空间,你先不动,待会咱们看错误啊,待会会报错,先记住你的,你的区是三 k, 算法是 h 四,然后底下这些 单数呢?都可以不用管他,现在基本上默认都有了啊,这个要有。那么我们在做定时器的时候,大家都知道我们 f 三二有硬件定时,对吧?太 像我们这个板子档次比较低,只有几个呢?只有四个太,对吧?如果是用最牛的那个板子,他应该是八个太太木一到太木八,对吧?但是有些比如我们的需求很很复杂,太木还不够,怎么办?硬件的太木没了,怎么办?有什么改作啊?软件, 所以说这里提供的这个骚特盖开门第三个是什么东西啊?软件定时器,就是他也是个软件定时中段服务,我们把这个引 ab 把这个启用起来,这是个很好玩的东西,反正我个人特别喜欢用定时器来做东西,所以说每次我做所有程序我都把定时器带了,是吧?所以说我都每次都给大家是定时器的程序啊。然后这是 这是这个,这是这个,这是这个碳,然后还没完,还有这个东西 底下这个啊,这个可以不留吧?这个 time 的在这不管了,他的这个内对战区不管了,这是第一个参数配完了,对吧?好了,第一个基本的内核参数我们配完了,我们实际上就启用了一个胎门,对吧?别没动。
好,好了,那么我们现在开始做实验,第一步我们简单一点,我们点亮一个小灯啊,那么首先第一个,那么我们在学硬件开发的时候一定要注意,我们第一关呢是看硬件的电路图,就是说我们拿到一个东西得有硬件电路图,基于硬件电路图我们才可能编成,得了解各个管角的含义。 那么在给大家的资料中,那我们看刚才我们是零一零二,已经都完事了,对吧?零一零二、零三都完了,我们找其中有个正点原子的电路图,看到没有?有一个零七,看到没有?把正点原子电路图打开,在里面有一个电路图文件夹,看到没有? 把电路图打开,在里面呢?有一个 pdf 本件,把这个打开,就是 f 幺零 f 七 f 幺的一点四版本的这个电路图是这样一个本件打开没有 那么注意,就是说我们以后拿到任何一个硬件,比如说大家上淘宝啊,或者找什么人买,买完之后接下来第二件事就是管他要资料,资料里面就应该含有这个电子器件的硬件电路图,对吧?那么找什么东西呢?我们现在呢要想点亮这个板子的 led 小灯,我们看找一下 led, led 就是小灯吗?看在第二部 pdf 的第二个文件上有这么个图,看到没有?找到这个图没有?找到这个图没有, ok 吧?看看能不能看懂这个图, 那么看这个电路图怎么看这个电路图?首先 vcc 三点三,这什么东西啊?这是电源对吧?这是给个干,那你说这哪来的呢?就是我们刚才从外接我们接了个电源模块吗?对不对?因为电源模块他内部机会转换 降糖的三点三,直流三点三,然后这个方块代表什么呀?代表电阻,对吧?代表一个电阻,然后这个这是一个三角,这叫什么呀?这叫什么呀? 这叫二极管,发光二极。为什么叫发光二极管呢?因为上面有箭头,如果没有箭头的话,就是普通二极管,对吧?那么二极管有什么特性? 在他的正端,高电瓶,负端就是横线,这一端加低电瓶,二就是什么?点亮正向倒通,如果是负向加电压的话,能倒通吗?倒通不了,所以说这个二极管要想点亮的话,给这个二极管这个,那么他另一端他的负向这端他叫 led 零,对吧?那你想一想, 要想这个,要想这个二极管点亮的话,在 led 零这段是给高电瓶还是低电瓶?哎?给个低电瓶,因为他的正端接的是三点三,对不对?护端给一个低电瓶,他就是什么呢?所以 低电瓶就是我们所谓低电瓶,就是就是零,零伏,对吧?如果是高电瓶的话,按照我们这个电路来说就是谁呢?三点三伏,对吧?这就是所谓的数字的零和什么一,明白了吧?就是我们整个板子,我们现在用那种板子呢,叫嵌入式系统,那么它是 s t s 三八二就是一法公司,这 s t m 三二系列, 他所有的电脑环节都是三点三伏,就是最高的电是三点三伏,明白这意思吧?所以说我们所谓的高电瓶,那就指什么三点三,低电瓶指谁呢?零就这么个概念啊。所以说那么这里只要给 led 零,给个零的话,这个二一管是不是就点亮了? 同样道理,给 led 一,给个零的话,下面这个 l 这个第二,第二个 led 是不是也点亮了?那么他叫 ds 一和 ds 零和什么 ds1 两 led, 明白了,那么什么是这 led 零和 led 一呢?这我们不知道对不对?那我们找,我们回到上一个 出去,这是第二幅图,我们找第一幅图,在第一幅图的最中间,大家发现有一个很大的东西,有很多很多关掉,对吧?那么你看他叫什么名字呢?啊?他没给名字,那么这是什么呢?这个中间这块呢?就是我们板子上中间那个大的,刚才讲的 s m 三 f 幺零三 r e t 的这个芯片,明白意思吧? 这个芯片是一个三十二位的 cpu, 但是他带有 iu 端口,那么在这里大家找一下 led 零和 led 一,找一下这两个名字,看他那标着呢? led 零在左侧中上这个位置,看到没有? led 零看到没有? 找一下自己那个找到了没有?那么他是什么什么意思呢? led 零代表的是个别名,他代表的是谁啊?是 pb 五,然后是多少关角呢?是第一百 三十五管角,找到这个地方了吗?找到了吗?那么什么意思呢?那我们来介绍一下芯片,那么这个芯片呢?是一款三十二位的芯片, 那么这款芯片他外面有很多管角,他一共多少个管角呢?一百四十四个管角,非常多了啊,一百四十四个管角,那么现在这个 led 零,刚才我们看到这个 led 零, led 零连的多少呢?一百三十五管角,对吧?那么一百三十五管角,但是记这个管角号呢?他是不好记的,所以说他怎么做呢?他把呢管角呢分成各个组,那么叫做什么呢?我们的名词叫做端口 pot p o r t pot 端口, 那么怎么叫这个端口呢?就叫做 p a 端口, pb 端口, pc 端口 abcdefg, 明白这意思吧?就是 p 较快呢,快呢? a 破一个 b, 明白吧?每一个端口里面有多少个环角呢?因为呢, 我们这是一个三十二位的 cu, 但是他呢,每一个管角呢?他最多最多呢是十六位,每一个管角最多是十六个针,明白意思吧?那么在这个管角里面,这十六个针呢,就从零排起,比如说 pa, 那就是从 pa 零到多少呢? p a 十五,没有十六,对吧? p a 零到 p a 十五,所以说我们看 led 零连的是谁呢? pb 五,明白这意思了吧?他就是 pb 口的端口的第六个管角,零,一二三四五六嘛,第六个吧。好了,这是 led 零,记住这个数,得记住是谁啊? pb 五, 然后翻过来, led 多少在他对角线上多少呢? pe 五,对吧?这两个东西我们就记住了,记住了吧? ok, 刚才讲了,如果我要想那 led 小灯点亮,我只要在这个 pb 五或者 pe 五上输出一个零,是不是就点亮了呀?就这么 道理吧。好了,那么这是很简单一个实验,我们先把大家记住我这个思路啊,第一步查电路图,对吧?然后去找资料好了,找到资料之后,我们把这两个关键信息提炼出来之后,那么接下来我们来配这个参数, 回到这个 q max 这个软件上,就是这个软件,看到了吧,这个软件打开,打开之后,那么我这里有默认,你就甭管了, 那么在这里呢,有一个,有一个 start project 的符号什么?有个 star 的埋 project 符号什么?看到了吧?这个蓝色的,那么点击第一个或第二个也可以,问题不大,他俩都是一样的,就是 access to memestery, 就是我们要点击一个,我们要创建一个一个配置参数的一个一个工程。 原来我们在编 s m 三二的时候呢,大量的程序呢,我们是靠人去写的,现在呢,我们不需要去写了,他很多参数呢,都是靠过,都是 通过图形化的界面呢来进行配置,这个就是一个图形化的配置界面,这就简单了,变成简单了。原来学这个东西都得到大三到大四的时候才学这个东西,因为什么呢?东西太多,现在有这个图形化之后呢,很多呢,很多知识点隐藏了,你们在后续的课程中慢慢会学,但是我们现在可以先用啊, 那么你们以后学的时候,你们啊,原来这知识点在这呢,对吧,你们就慢慢明白了,我们就不再做这个深入的知识隐身了。那如果这个一直停留在这什么意思呢?这是当漏的,他会反问网站很讨厌,怎么呢?看守取消他,别让他连那个服务器在国外呢, 这个产品呢,是依法,是意大利和法国他们联合开发的公司,叫做依法公司做这个芯片,他的服务器在国外,他是一种连在这个,这个软件呢,是在线联网,可以不断升级的一个软件,打开之后 是这样一个界面吧。好,那么进来之后我们看左上, 在左上有两个名字,看到了吧,这我们叫 tab 太,就是标签,就是他有两个操呃,两个这个,两个这个界面, 那么第一个叫做 mcu, 就是我们记住啊,这不叫 cpu, cpu 是三折普洱赛斯 unit 中央处理单元,对吧? mcu 呢?是 m microsoft microsoft 三车 unit, 就是微呃微型中央处理单元。那么这就是我们所谓的类似于单面机的概念,就是什么呢?他除了有计算功能和越控制功能之外呢?他可以直接接外部设备,比如 led 小灯,比如接 vsb, 他把一些功能集成了, led 灯管集成了, 那么好,这叫 mcu。 再有一个是 bod, 什么意思啊?他每个厂商呢?对每款芯片呢?他都会做一个开发板,就是做一个这个演示用的,做实验用的调试板, 那么这个型号已经固定了,它里面会有定制参数。我们现在这个板子呢,不是官方出的,这是正点原子,这也是一个老师开的一个公司,他自己的做的一个板子啊。所以说我们现在选的 mcu c like, 明白意思吧?选这个,前面这个标选错了,然后在这里这个寻查询,这个地方,色池这个地方打 打名字, stm 三二。 stm 没事,区分大啊,不区分大小写,你打了之后他就会自动搞,但是尽量按大写吧。 stm 三二,我们什么呢? fo 级啊, 一,记住我们现在用的是 f 一系列,大家看到了,是不是很多系列啊?他零一二三四五六一到几系列呢?一直到七系列,我们是幺零几啊,刚才说幺零三,还记得吧,那个版就是那个大芯片上那个号叫什么啊? c e, 看到了吧?我们是 c e t 六吧,对不对?那么达到 z e 就足以了,就是 stm 三二 f 幺零三 z e, 这是他代表的型号,然后你在那个右下会不会看到这样一个结构啊, 对吧?有两个,不要乱点啊,不要打爆双击,不要轻易不要打爆双击,然后把鼠标放在这个小框这个中间这位置,把它拖开, 看到没有,往后拖一点,那么这是什么意思呢?一个是 z t 的 x, 还有个 z 什么 h, 我们用的是 h 吗?不是,我们用的谁啊? z e t, 看到了吧?所以说点一下,单击一下这个 z e t, 看到了没有? 那么这一题看,注意看他后面的信息。那么 market 现在市场上这个是 iq, 实际上有卖货的,然后呢? unit process for 多少钱呢?这是啊, 多少钱?四点六七一七,这是什么? ku 是什么? ku 是什么 啊?欧欧元,四点七一,四点七一六七,欧元多少钱呐?多少钱?哎,折人民币大概四十多块钱一个,很便宜啊,但这指的只是一个芯片啊,但你知道我买这一个版多少钱啊?我这一个多两百多块钱呐,将近将近两百两百三十多块钱呐 啊,他的核心气垫大概就是四十多块钱,不到五十块钱啊,然后再往下拍,可以,这是什么呢?叫做封装模式。什么叫封装模式呢?就这个芯片管角长的样子,我们比如点一下,都是单的单机啊,点一下上面这个就是这个, 那你看在这个右上那个位置,是不是有个图啊?看到了吗?那你看这两个图有什么区别?都是一百四十四,有什么区别?你看到了吗? 下面那个 lq fmp, 就我们用这种模式,他的小环角是不是在外面啊?是不是外面有一圈小环角啊?但你看上面那个版,上面这个芯片有吗?没有,他的触点呢?是在这个芯片的底下,是隐藏触点。明白意思啊,这是两种封装模式, 然后再有下面 flag, 这什么意思? flag 啊,就是我们说的闪存,那么就是我们写完的代码要存到这个 flags 里面,明白意思吧?那换价说,你的代码量最多最多多大呀? 五百一十二 k b。 有同学说,这这么点啊,我随便开个成语都几百兆,那是 pc 级对吧?嵌入系统,他的要求程序必须非常精巧很小,对吧?功能单一化,所以说最大多少呢?一百五十五百一十二 k b 啊。然后 ram 是什么还记得吗?哎? random excess memory 随机存储存储器对不对?随机存储器什么概念呢?就是对应我们 pc 机的内存。 什么是内存呢?程序运行起来之后,没运行的时候放在哪啊?放在 flags 里面,明白这意思吧? 哎,一旦运行起来,它里面的过程代码就是有大量过程计算吗?对不对?那个代码放在哪里呢?放在 rev。 有同学说,什么是过程代码呀?你想一想,你在写一个 ce 圆程序的时候,你的全局变量,你的局部变量,你的数组,这是不是都是运算的东西啊? 那么这就是什么东西啊?这就是过程变量放在哪个里面呢? ref 里面,所以说你可以想象。那换价说,比如我定一个数组,你数组能超过六十四 k b 吗?不可以吧,这就是限定了你的硬件资源,所以说嵌入式难就难在什么地方呢?你在编程之前一定要了解你 你的芯片的资源可用范围,明白我说的意思吧,对吧?这些东西限定了你用的东西,你比如说六十四 k b 这学期有同学你们学,你们这学期开的课,什么课?开的会编吧? 没开,没开数据结构,那么事实上,那么我们在定一些东西的时候,比如我们定一个数组,那数组多大?他是有上限的对吧?尤其像一些动态数组等等,那么都有严格要求的,那就不说了, 等再有 io 这指的是管角,他有多这个吞吐 io 指什么呢?就是音谱的,按着 out poot 什么意思啊?输入和输出 i 和 o 就是音谱的,按着 out poot 就是做吞吐的输入,输出就是我所谓的高音输入输出。再有这个芯片最高的工作频率计算频率是多少? 七十二道赫兹什么概念?我们的 cpu 现在拿到手一般多少?够快?你们的笔记本里面多少啊?都是记 一级的对不对?二点四 g, 三点八 g 一级的是不是概念吧?这是差什么?差一个量级对吧?一个量级是幺零二四对吧?一千零二十四倍二的十四米 啊,然后没了,这是我们通过这个东西我们可以看到他的一些基本参数,然后接下来上面的文字看到了吧?这个文字就描述了这个芯片的一些特性,是吧?如果需要看的话再看,那就不管了, 我们讲的是在用,那么现在呢?在这个 z e t x 就是这个地方底下这个 z e t x 这个位置 x 这个名字上,这次呢,达宝双击,两次激发双击,然后他就会打开一个新的界面来生成一个默认的工程, 这个就是拼机器,他这个软件比较大,他会做一个工程,打开没有,是不是这个界面打开没有 打,打开之后呢?那么这个界面的代表了这个东西,就代表了我们芯片,因为太小看不见,怎么办呢?用鼠标滚轮向上滚,看到了吧?越滚越大吧, 能滚开吧?向下就是缩滚轮,向下就是缩小,向上就是放大,这个没问题了吧? ok 吧,那我们来介绍一下这个软件的界面, 那么这个软件现在看在他的上册,第一个叫拼 out, cthew greece, 这什么意思呢?就是管脚的配置, cthew 的 race 就是配置,然后第二个的 cloud cthew 的 rishan, 这什么意思啊? 时钟配置。第三个不是 jack management, 什么意思呢?工程管理。第四个兔工具,在工具上面有一个粘嘴,不要点啊,粘嘴就千万不要点层层代码。那么现在我们先干什么呢?我们先存盘,我们现在第一件 先做这个 project management, 给这个工程得找个地方吧,得给名字吧。第一个工程叫什么名?再提示大家不要有中文,记住我的话,那么随便给,比如说我们今天叫太子的, 比如说我一般呢,习惯上用用日期,比如说今天是二零一九年四月十四号 a 版本, 那我就这么写,或者利用功能,比如说你以后写什么功能,把这功能写到这,用英文或者汉语拼音拼。第二个 project location 放在什么位置?这个知道吧? 就是自己选,选一个自己放的位置,但是记住千万不要有中文,还是那句话,对吧?而且一定要有个文件夹,不要放在根部路,明白意思吧?自己造个文件夹,然后放在这文件夹里面,对吧?这个做了吗? ok 吧, 然后再往下,再往下,很重要的一个参数是这个 to chin ide, 这个工具就是我们在进行切入式编程的时候,大家把这下拉菜单打开,看到这里是不是有非常多的东西啊?我们现在用的谁呢?是 mdkr v 五,那么这个是干什么的?这个工程他可以生成很多种工具需要用的代码, 那么我们现在市面上最流行的学千融系统就是两个软件,一个现在是我们用的 mdkr, 这是 ko 公司 ko 数 ko 版本,再有一个就是这个 ewaim vv 八这个版,这个软件也非常牛, 每一个软,这两个软件,软件如果是没破解商业版的话,一个软件大概折合人民币一万多块钱啊,大概一万多块钱是非常好用的,实际上是最用。那么像电信学院,他们学 学这个软,学这个课呢,一般他们是用这个 ewam 这个软件来这个这个 ewm 这个软件来用,那么咱们计算机学员因为是我一直在讲,所以说我一直用,是啊,哎啊啊, mdkm 这个威武版本,这个版本用的啊,好选这个 mdkmv 五 这个东西没有什么对错之分,就是都能用啊,都是 ok 的啊,就自己习惯,我比较习惯用这个软件,然后接下来 剩下的参数我们用没默认配置就可以了,他就指的是你的对战区,你的这个版本号等等, ok 吧,这个好,做好了吧?然后存盘,存盘,第一种方法按一下 ctrl s, 键盘上的 ctrl s 就是快捷键,那么他就存盘了,是不是存上了,那么怎么知道存上了呢?你看在你这个软件的,在你这个软 建的这个窗口的右上角,这工程这上面,如果他上面有个星号,就表示你修改了没有存盘,明白意思吧?你比如说我这个地方,我现在 a 吧,我改成 b, 存完盘之后看第二个参数还没买完,第二个叫什么?左侧第二个叫什么呀?点点一下扣的展的瑞特什么呀?代码生成,那么在这里有一个非常默认选项不要动,有一个非常重要的选项,就是在第二个展的瑞特 fails, 那么生成文件里面,把第一个选项一定要选上,这个一定要打上勾, jandread, 然后以来最深 s 和 pear 就是什么呢? 点 c 文件和点 h 文件为每一个终端,那么这个参数是干什么用的?大家都知道,学 c 元知道元程序是什么呀?点 c 吧,点 h 是什么文件? 点 a 是什么键? h e a d 叫什么文件呢?头文件,头文件是放什么的?你比如说大家学数学的时候, mace 点 a 式引数学库的时候,对吧?次撸串库是死俊,点 h 那是干什么用的?里面什么东西? 里面是大量已经定义好的大量的函数声明,是不是概念吧?对不对?你调那麦斯点 skr, 求那个开根号,那不人家已经做完了吗?对不对?人家把它放到这个库里面来调,但这个头呢?就是换句话说,大量的函数的声明都要放在头文件里面,这是个套路,明白意思吧? 一个点 c 配合一个点点 h 文件,对吧?点 c 文件里面你写的大量的函数的定义比赛,那么它的声明迪克莱尔一定放在什么文件里面呢?点 h 文件里面,明白意思吧?这样的话别人才能够引到你的程序。好了,这个选上没有?选上了吧?选上来。