画完了板子。
开源自己设计的STC核心板,集成STC32和STC8一次性学习两款芯片-CSDN博客文章浏览阅读663次,点赞12次,收藏8次。官方提供的最小系统图也就是俩电容,一个10uf以上,一个100nf,虽然说10uf以上,但是10uf应该也可以,我是因为手头上22uf的电容比较多,所以用的22uf,大家也可以根据自己的库存去决定,反正打板出来焊盘大小都是一样的,一样封装的都是可以随便替换。一个STC8G1K08A-SOP8的官方推荐零售价是0.59 + 0.1,所以小伙伴们买的时候注意价格,我买的时候是0.75,因为价格差的不多并且是从经常买的店铺里卖的,所以就不管这点差价了,总之大家买的时候别买价格太离谱的。https://blog.csdn.net/m0_63235356/article/details/144374813?spm=1001.2014.3001.5501
搭完了环境。
【STC库函数】环境搭建&使用官方例程-CSDN博客文章浏览阅读142次,点赞11次,收藏4次。官方提供的最小系统图也就是俩电容,一个10uf以上,一个100nf,虽然说10uf以上,但是10uf应该也可以,我是因为手头上22uf的电容比较多,所以用的22uf,大家也可以根据自己的库存去决定,反正打板出来焊盘大小都是一样的,一样封装的都是可以随便替换。一个STC8G1K08A-SOP8的官方推荐零售价是0.59 + 0.1,所以小伙伴们买的时候注意价格,我买的时候是0.75,因为价格差的不多并且是从经常买的店铺里卖的,所以就不管这点差价了,总之大家买的时候别买价格太离谱的。https://blog.csdn.net/m0_63235356/article/details/144326761?spm=1001.2014.3001.5501今天我们正式开始STC库函数的使用学习。
学习一款芯片,绕不开的就是GPIO,所以我们从GPIO的使用开始。
因为STC32和STC8的GPIO物理结构差不多,所以我下面就以STC32的手册为例,简单讲讲STC的GPIO口。
因为我们这个系列使用的是库函数,所以寄存器方面的内容就不讲了。
STC的GPIO口一共是有四种工作模式:准双向口,推挽输出,高阻输入,开漏模式。
无论是哪种模式,GPIO都能承受20mA的灌电流(不包括高阻输入),但是整体芯片的工作电流不要超过90mA。
推挽开漏高阻大家应该都比较熟悉,我们就简单看看准双向口的物理结构,需要注意的是如果我们的GPIO是准双向工作模式,那么在我们输入数据之前需要先锁存为‘1’,也就是让它先输出高电平。
接下来看看库函数怎么使用。
关于GPIO,STC32G12K128的头文件是STC32G_GPIO.h,STC8G1K08A的头文件则是STC8G_H_GPIO.h。
我们还需要把对应的.c文件添加进工程中参与编译。
接下来看看第一个函数GPIO_Inilize。
一共俩参数,参数一指定GPIO的组号,参数二是结构体变量的指针。
结构体的成员就俩,一个是指定GPIO的工作模式,另一个是指定GPIO的端口号。
非常简单,只需要用这个函数配置完GPIO口就能直接使用了。
组号是GPIO_Pn,端口号是GPIO_Pin_n,其中n是具体的数字,比如说P01这个GPIO就是GPIO_P0和GPIO_Pin_1。
接下来是工作模式,刚刚说了工作模式是四种,分别是对应下面这些。
然后如果我们要修改GPIO的输出呢?
我们直接给Pnn赋值即可,比如说我用的GPIO口还是P01,也就是第0分组的第1端口,那么我要让它输出1,就直接P01 = 1,如果要读取,那么直接把P01拿去用就行。
事不宜迟,我们赶快点个灯吧,把下面的代码编译烧录到STC32里,如果是STC8则把头文件和GPIO口给改掉,把延时函数的时间改为250以内(不够的话可以多调用几次),以及把main函数里WTST和CKCON那两行删掉即可。
在烧录的时候记得在烧录软件上选择24MHz,它默认是11.0592MHz的。
#include "STC32G_GPIO.h"
#include "STC32G_Delay.h"void GPIO_Init(void){GPIO_InitTypeDef initer;initer.Mode = GPIO_OUT_PP; // 选择推挽输出initer.Pin = GPIO_Pin_1;GPIO_Inilize(GPIO_P0,&initer);
}void main(void){WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快EAXSFR(); //扩展SFR(XFR)访问使能 CKCON = 0; //提高访问XRAM速度GPIO_Init();while(1){// 每隔一秒翻转一次P01口的电平.P01 = !P01;delay_ms(1000);}return ;
}
烧完然后在对应的引脚接个LED(记得加限流电阻),就可以看到现象了。
delay_ms函数就是库函数提供的延时函数,头文件是STC32G_Delay.h,因为头文件里就它一个函数,并且就是简单的延时函数,就不展开介绍了,需要注意的是它单次延时的范围是1~65535,而STC8的延时范围是1~255,所以如果我们需要延时更长的时间,就需要多调用几次了。
然后可能会有小伙伴有疑问,main函数前三行是做什么的,刚刚好像没有提到吧。
这三行其实我们可以不用管,每个程序都给它加上就行,STC8的话只需要加上第二行。
可以简单分析一下这三行。
首先是WTST,这其实是个寄存器,用来设置程序读取等待时钟数的。
默认是7,但我们最好是改成0,因为我们的工作频率是默认的24MHz,如果不改的话,那么使用延时函数就会比我们预计的时间更长。
第二行看起来像函数的东西,实际上是宏定义,还是操作寄存器的。
目的是拓展SFR(即特殊功能寄存器)区。
第三行的CKCON和WTST也是类似的,我们最好也是改为0。
如果不改的话就会发现延时的时间会比我们预计的更长,并且运行的速度也会更慢,因此我们最好还是在程序的开头加上。
GPIO相关的函数就上面一个,但是我们也有其他宏定义可以使用。
参数都是一个GPIO的端口号,如果我们要将P12设置为推挽输出,那么我们只需要调用P1_MODE_OUT_PP(GPIO_Pin_2)这样几句就可以了,其他组号的GPIO也是同理,STC8也是这些宏定义,也就是说STC32和STC8之间的代码可以无缝切换(记得换头文件)。
可以看得出开头那个函数好像没啥用,咱用宏定义可以更简单的实现,并且宏定义还有其他更精细的设置,比如说内部上拉电阻的设置,施密特触发的设置,电平转换速度等等。
要说有函数有什么好处的话,就是下面这种情况。
#define MY_GPIO GPIO_P0
#define MY_PIN GPIO_Pin_1GPIO_InitTypeDef initer;
initer.Mode = GPIO_OUT_PP;
initer.Pin = MY_PIN;GPIO_Inilize(MY_GPIO,&initer);
如果我们实现某个功能的GPIO要更换,那么自己宏定义+函数的这种方式更方便,可是STC的库函数也就提供了这一个函数,我要设置其他细节参数还是得用宏定义,所以感觉GPIO库里那唯一一个函数还是挺鸡肋的,一般我们都用宏定义去对GPIO进行配置就行。
最后再次简单看看手册,因为宏定义里有什么上拉电阻施密特什么的我们刚刚没有提到。
上拉电阻在这里。
GPIO口的输出速度通过PxSR寄存器来设置。
GPIO的驱动电流通过PxDR寄存器来控制。
然后施密特触发器在开漏模式这里。
今天的内容就到这边了。具体GPIO各个配置的用法,我们在后续的使用中再详细分析应该如何配置。