当前位置:   article > 正文

STM32学习笔记(江科大)-01:GPIO输入输出、OLED_硬件电路输入输出

硬件电路输入输出

注:学习STM32过程中的知识点记录,目前关于江科大STM32的学习笔记较少,因初学STM32,知识缺陷较多,故写下此笔记,记录在学习过程中自认为较为重要的知识点,分享给大家。希望本笔记能对大家有所帮助,大家共同学习进步!!!

纯手打,制作不易,不喜勿喷,谢谢大家!!!

持续更新中......

本节程序:led闪烁、流水灯、蜂鸣器、按键控制led、光敏传感器控制蜂鸣器

目录

课前知识点

一、GPIO输入输出

1、GPIO输出

2、操作stm32的GPIO三个步骤

3、八种模式

4、输入输出函数控制GPIO

5、几种使用库函数的方法

6、C语言知识

7、函数分文件编写(模块化编程)

8、初始化函数结构

9、读写IO口的函数

10、各模块电路图

二、OLED调试

1、常用程序调试方法

2、OLED显示屏

3、OLED驱动函数

4、Keil自带的调试模式

三、GPIO外设配置

硬件电路:

核心代码:


课前知识点

MCU:
微控制单元(Microcontroller Unit;MCU) ,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、PC外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影。

嵌哥:单片机-数据结构-实时操作系统
操作系统的定义是介于应用层和目标硬件之间提供中间层软件的一种软件;它提供出应用层和目标硬件之间的一个抽象层;职责在于去管理分配 CPU 的资源,包括 CPU 、内存和外设等。
操作系统是管理计算机硬件与软件资源的系统软件程序。管理与配置内存,决定优先次序等。

7c49ecaf4add49d88d45212e99098dbd.jpeg

优先级高的事情可以先处理,优先级一样的事情交叉处理。

2863e4a12e6e45ca9cd77d7c93adbfc1.jpeg
使用库函数:
第一种是打开.h文件最后,看一下都有哪些函数,再按右键转到定义看具体用法。
第二种是打开资料中的库函数用户手册,有所有函数的介绍和使用方法。
第三种是百度搜索程序。

将硬件电路与用于提供项目解决方案的软件编程技术集成的电子系统称为嵌入式系统(专用系统)

Vdd正极;Vss负极
.c源文件  .h头文件。

现在很多单片机和芯片都采用高电平弱驱动,低电平强驱动的规则。

❗️输出的高低点平有效取决于哪个引脚连接io口,哪个引脚连接电源正负极。(如led)

使用标准外设库:库函数将寄存器封装到函数里面,通过调用库函数就可以实现寄存器操作。库函数间接配置寄存器。
库函数使用的是读写位设置和位清除寄存器来控制gpio端口的方法。

5a6618b418b74e7095046d53178acb4a.jpeg

添加头文件路径:

4c8cc5f71ecf48fc8c862a7d88ab9446.jpeg

stm32f103c8t6,48个引脚,通过程序配置外设,完成想要的功能。
1、rcc时钟系统  2、定时器  3、外部中断  4、I2C 5、UART串口   6、SPI 7、ADC 8、基于定时器的PWM  
高低电平 通信协议时序图  基本原理图 信号怎么走  
文件最后一行必须是空行,否则会报错。
c语言不支持写二进制数,只能写十六进制数。
进制是一种计数的方式,常用的有二进制、八进制、十进制、十六进制。任何数据在计算机内存中都是以二进制的形式存放的。

32单片机供电电压一般为3.3V。

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。(给数据类型起新名字)

电流:由高到低

A15、B3、B4、别用,是调试端口。

对GPIO库函数、中断部分库函数、复位和时钟设置的库函数要比较熟悉,因为平时经常会用到。

不显示提示代码时按ctrl+alt+空格。

工程架构:
stm32f10x_conf.h是用来配置头文件的包含关系的,conf文件include了所有的库函数头文件,只需要包含这一个头文件,就相当于包含了所有的库函数头文件。就可以任意调用库函数。
主动执行部分:startup_xx.s文件为启动文件,定义了中断向量表,中断服务函数等,中断服务函数中有复位中断,是整个程序的入口。复位中断函数主要第一个是调用SystemInit函数(定义在system_xx.c,设置微控制器的启动,初始化嵌入式闪存接口,锁相环,更新系统内核的时钟变量。),第二个是调用main函数。启动文件里还定义了stm32所有的其它中断,达到触发条件后会自动执行。中断的定义是在stm32f10x_it.c里面的。
另外,stm32f10x.h是外设寄存器描述,core_cm3.c是内核寄存器描述。里面是寄存器和寄存器每一位的名字还有地址信息等。不过直接操作寄存器很麻烦,所以提供了库函数文件,misc.c及stm32f10x_adc.c等,这些函数封装了寄存器的操作,提供了人性化的函数调用方式。

《STM32F103xxx参考手册》前九章


一、GPIO输入输出

led、按键、蜂鸣器

1、GPIO输出


        寄存器是一种特殊的存储器,内核可以通过APB2总线对寄存器进行读写。这样就可以完成输出电平和读取电平的功能了。寄存器的每一位对应一个引脚。输出寄存器写1,对应引脚就会输出高电平。写0输出低电平。读取同理。因为32单片机是32位的,所以内部寄存器都是32位的,但端口只有16位,所以只有低16位有端口。
        推挽输出支持高低电平驱动,而开漏输出只支持低电平驱动。
        led灯长脚接正极短脚接PA0口,或者短脚接负极长脚接PA0口(但换成开漏时,不亮了,说明高电平没有驱动能力。)都可以闪烁。


2、操作stm32的GPIO三个步骤


第一是使用RCC开启GPIO的时钟(使用到的GPIO外设都需要开启)。
第二步是GPIO_Init函数初始化GPIO。
第三步是使用输出或者输入的函数控制GPIO口。
用到的外设有RCC和GPIO。RCC中常用的函数有AHB、APB1及APB2。


3、八种模式


GPIO_Mode_AIN(Analog IN)//模拟输入 
GPIO_Mode_IN_FLOATING  //浮空输入
GPIO_Mode_IPD (In Pull Down) //下拉输入
GPIO_Mode_IPU (In Pull Up) //上拉输入
GPIO_Mode_OUT_OD(Out Open Drain) //开漏输出
GPIO_Mode_OUT_PP(Out Push Pull) //推挽输出
GPIO_Mode_AF_OD(Atl Open Drain) //复用开漏
GPIO_Mode_AF_PP(Atl Push Pull) //复用推挽

输入:获取IO口的状态
        输入中的上下拉电阻起到了给输入提供一个默认的输入电平的作用。(输入引脚什么都不接时,输入引脚处于浮空状态,输入电平极易受外界干扰而改变,所以加上上下拉电阻)
        接入上拉电阻时,当引脚悬空可以保证引脚的高电平状态。同理,下拉电阻可以默认为低电平的输入方式。阻值很大,是一种弱上拉和弱下拉,目的是尽量不影响正常的输入操作。
        模块始终接在端口上时,上下拉或者浮空输入都可以,因为IO口始终是接入的那个电平值,比如光敏传感器不遮挡时始终低电平。
‼️为了防止电平打架,最好是上拉和下拉与模块的默认电平一致。

2a89ce65598f4c9c994efbbadc4535cf.jpeg

73b173afada342bba4e5b9e1b964086a.jpeg

2a633248911f4204a3affc5bd7387c9e.jpeg

03b7f4b517d741038005a7f11c35d828.jpeg

861c302f51c647d5914bae31380ddc3a.jpeg

5c5aae18e8bf41bd90b40675635d350a.jpeg

8eef5a54152143e1be234bc341ac7095.jpeg

d0d7df69eaca44d8a9d3916bd9fe4708.jpeg

fa33106e651c4e8586727b4d589182fb.jpeg

c4d0a74611084e378a73df463e7d869b.jpeg

04d8cc767bab461890a2fe89d6962358.jpeg

3427c1c4aa4f42508029058e1f3ed23d.jpeg

4、输入输出函数控制GPIO


GPIO_SetBits :  拉高引脚输出电平 //1
GPIO_ResetBits :拉低引脚输出电平 //0


5、几种使用库函数的方法


第一种是打开.h文件最后,看一下都有哪些函数,再按右键转到定义看具体用法。
第二种是打开资料中的库函数用户手册,有所有函数的介绍和使用方法。
第三种是百度搜索程序。


6、C语言知识


(1)

2722a23fa69a4f31b12b1116b181a4bc.jpeg

(2)新版库函数的使用方式是用stdint关键字如:int8_t、uint_8t等。

(3)宏定义关键字:#define 等于用一个字符串代替一个数字。
定义:#define ABC 123 
‼️宏定义不需要加分号,任何名字都可以换。
引用:时 int a =ABC;相当于int a=123;

(4)typedef可以将一个比较长的变量类型换个名字,便于使用。
特点:新名字uint8_t在右边。只能给变量类型换名字。且一定加分号。
定义:typedef usigned char uint8_t;
‼️typedef需要加分号,且只能给变量类型换名字。给变量类型换名字一般用typedef,因为会自动检查。
引用:unit8_t a;等效于usigned char a;

(5)结构体。关键字:struct。结构体不是定义一个变量,而是定义一种数据类型。
用于数据打包,不同类型变量的集合。
struct{char x;int y;float z;}StructName;
结构体是一种组合数据类型,在函数之间的数据传递中通常用的是地址传递而不是值传递。所以可以把.替换为箭头。

62515e2508324d11a1a9c34fdebf51aa.jpeg
(6)枚举:关键字:enum
 作用:定义一个取值受限的整型变量,用于限制变量取值范围,避免出现星期八的情况。宏定义的集合(枚举值不是必须复制给枚举变量,int a=枚举值也可以)。
如果枚举中数是按顺序增加的,1、2、3等,后面的数值就可以省略。
定义:
enum{FALSE=0,TRUE=1}EnumName;
因为枚举变量类型较长,所以通常用typedef更改变量类型名。
如typedef enum
  {FALSE=0,
     TRUE=1}EnumName_t;
引用:EnumName=FALSE;
EnumName=TRUE;

8d41aa9fdfc64ba483b62083ff452ee3.jpeg

(7)数组:char a【10】;10个char型数据。int b【5】;定义5个int型数据。


7、函数分文件编写(模块化编程)

一般要在.h文件中提供一个防止头文件重复包含的代码:
每个.h文件需要先写:
#ifndef __文件名_H
#define  __文件名_H

#endif

8、初始化函数结构

ee0347c6801e4d4fb78e9ff35115100f.jpeg


9、读写IO口的函数


GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); ‼️读取单个端口
GPIO_ReadInputData(GPIO_TypeDef* GPIOx);  ‼️读取整个寄存器
GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);‼️根据第三个参数的值决定高低电平,bit_reset或者bit_set
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);‼️可以同时对16个端口写入操作,第二个参数比如写0x0001,对应二进制0000 0000 0000 0001(十六位分别对应十六个端口,并且低电平0点亮led。~0x0001为第一个led点亮,其它都熄灭)

10、各模块电路图


光敏传感器:光越强阻值越低,端口电压被下拉到低电平。遮挡光线阻值变高!
DO接IO口 
N1是传感器代表的可变电阻,随光线、温度等变化。
左边为滤波电容,防止信号抖动,一端接地一端接到电路中
AO端电压随上下拉电阻阻值变化,哪个阻值小电压就偏向哪一端(串联电路V=IR)串联分压

17c5599b2a71442ca6931bcd0e125caa.jpeg

95372273fa2c47ef8d0faf5aac302e4f.jpeg

e95abeca69bd450ab78c2cd1bafcfd3a.jpeg

按键:

4f2f5266ff0946f4bfbfe7b733ae49ce.jpeg

0c1dabfcce9e4c36998c55fd64f75b0e.jpeg

1为输入高电平

5a4f3051f9fb4c1abcfe38d1ff69e4e6.jpeg


二、OLED调试


1、常用程序调试方法

1d6cab5bb97a428884a995c389ce51fa.jpeg

串口调试可以借助强大的电脑调试,不仅可以显示单独的参数而且可以显示曲线、图形、图像等,还可以自己做一个软件实现强大的用户交互界面。
显示屏调试可以对不断变化的数据可以覆盖刷新显示,而且oled屏可以始终接在单片机上。可以直接把显示屏当作产品的一部分。但是显示屏的屏幕太小,显示内容有限。


2、OLED显示屏

03d50c51c62f484ba7ae76ae61a23742.jpeg

4针脚的一般用I2C通信协议,七针脚的一般用SPI通信协议。

ef9b71d5a7264822adf2e24059d25435.jpeg

驱动函数模块用的是GPIO口模拟的I2C通信,所以这两个端口就可以接在任意的GPIO口上。

8f18832e4f0149f99502091f9df22b67.jpeg

也是接在GPIO口上。GPIO模拟的通信协议。


3、OLED驱动函数

b9ca78a031fd4d16a0c15d971bb657e2.jpeg

如果长度参数比实际多,就会在前面补0;如果少,自动省略高位。
如果想清除部分字符,只需要在相应位置使用string打印上空格。
把oled分成了4行16列的小区块。
向下是1234行,向右是1-16列。
stm32的引脚上电后,如果不初始化,默认是浮空输入的模式,引脚不会输出电平。
OLED的配置文件都给了,添加进程序后直接改一下端口就可以使用。

267a0d3cbafb40968e3ecc7db814f28b.jpeg

4、Keil自带的调试模式

0ff1194cb6334bbc8aeb2fcb74462946.jpeg

92bd382fcbc741aab0dc74733c9e54e8.jpeg
‼️不能在调试模式下直接修改程序。

三、GPIO外设配置

这里只做简单描述。
本节程序:LED闪烁、流水灯、蜂鸣器、按键控制LED、光敏传感器控制蜂鸣器
配置简单,只需要上电加初始化。
学会按键配置。
因为按键接的是io口和GND,所以用上拉输入按键按下时才能导通。
❗️按键需要来一个松手检测while(),确保松手时才会触发电平转换!

上拉电阻:
e27ba25819b0434e850ec6f47ade1a3a.jpeg

硬件电路:

5ee93fb796694677806a82bea951a2e2.jpeg

核心代码:

18819378f27941f5a14fce8acbc95928.jpeg

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/869394
推荐阅读
相关标签
  

闽ICP备14008679号