【STC库函数】GPIO通用输入输出口的使用

ops/2024/12/15 23:21:19/

画完了板子。

开源自己设计的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各个配置的用法,我们在后续的使用中再详细分析应该如何配置。


http://www.ppmy.cn/ops/142233.html

相关文章

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的,所以在IDE中使用Git也是非常常用的,接下来以IDEA为例,其他的VS code ,Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…

【提升工作能力:五大关键要素】

提升工作能力:五大关键要素 在职场中,工作能力强的员工往往能够更高效地完成任务,赢得同事的尊重和领导的信任。那么,如何提升自己的工作能力呢?根据上述内容,我们可以将提升工作能力的关键要素归纳为以下…

蜂鸟视图:工业设备更新与技术改造的“数字化引擎”

引言 近年来,随着工业和信息化部发布的《工业重点行业领域设备更新和技术改造指南》,石油、化工、钢铁、航空等行业对数字化转型的需求日益迫切。设备更新与技术改造不仅是提升企业核心竞争力的关键手段,也是推动行业整体智能化升级的重要路径…

【我的开源】ESCurlGen 一款 ElasticSearch curl 命令生成器

由于经常编写复杂的 Elasticsearch 查询,并通过代码生成查询条件,我发现每次使用 curl 请求 Elasticsearch 时,手动复制配置信息并构建 curl 命令的过程非常繁琐,尤其是在管理多个环境的情况下更为不便。因此,我利用 A…

xilinx搭建axi转avalon通用寄存器读写模块

1,axi转avalon bridge配置 2,block design结构 3,reg_ctrl.v代码 注意M_AVALON_address要右移两位 module reg_ctrl (input clk ,input rst ,input [7:0] M_AVALON_address …

四十四:HTTP/1.1发展中遇到的问题

引言 HTTP/1.1作为一种广泛使用的应用层协议,自1997年发布以来,成为了互联网通信的重要基石。然而,随着互联网的迅速发展和应用场景的不断扩展,HTTP/1.1在设计和实现过程中暴露出了一些问题。这些问题限制了协议的性能和适应性&a…

黑马 Cpp qt相关笔记

什么是QT QT是一个跨平台的C图像用户界面应用程序框架QT在1991年由奇趣科技开发QT的优点 跨平台,几乎支持所有平台接口简单,容易上手一定程度上简化了内存回收机制有很好的社区氛围可以进行嵌入式开发 QWidget QT注意事项 命名规范 类名 首字母大写,单…

[C#与C++交互] 跨进程通信NamedPipes

目录 1、前言 2、什么是命名管道? 3、实现步骤 4、示例代码 4.1 C 服务器代码 4.2 C# 客户端代码 5、运行步骤 6、注意事项 7、应用场景 8、优缺点 9、总结 1、前言 在 C# 和 C 应用程序之间进行数据交换时,命名管道(Named Pipes…