目录

  • 一、前言
  • 二、必要资料
    • 1、C语言类型
    • 2、片上资源/外设
    • 3、引脚定义
    • 4、系统结构
  • 三、GPIO初始化
    • 1、首先使用RCC开启GPIO的时钟
    • 2、其次使用GPIO_Init函数初始化GPIO
    • 3、最后使用输入或输出的函数控制GPIO口
  • 四、delay,oled函数的调用
    • 1、delay
    • 2、oled

一、前言

前几天系统地将32单片机学习了一下,学习的视频是bilibili的江科大自化协c8t6的教学,为了方便以后使用,在这里和b站视频联动写下一篇笔记,以便自己查阅资料和调用函数。

二、必要资料

1、C语言类型

  • int在51单片机中是16位的,在STM32中32位的,如果要用16位的数据要用short来表示
  • float和double都是带符号的,没有不带符号的
  • 枚举enum的使用,类似于struct结构体,只是赋值且引用是有范围限制的


2、片上资源/外设

3、引脚定义

  • 不要轻易使用PA15,PB3,PB4,他们是作为调试端口的

4、系统结构


性能:AHB>APB2>APB1(注意关注这三者里面的外设,其实后两者性能差不多)

三、GPIO初始化

1、首先使用RCC开启GPIO的时钟

从APB2总线,引出RCC_APB2PeriphClockCmd(GPIO口的名字,状态),如使GPIOA 使能:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2、其次使用GPIO_Init函数初始化GPIO

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

第一个参数 GPIO_TypeDef* GPIOx 通过x选定GPIO, 如:GPIOA
第二个参数 GPIO_InitTypeDef* GPIO_InitStruct是GPIO的结构体地址 如:&GPIO_InitStructure

  • struct 关键字,定义结构体变量
    用途:数据打包,不同类型的变量打包(可以数组,数组是同一个类型打包)

  • #define 新名字 旧名字(无脑式定义)
    typedef 旧名字 新名字(定义 长变量类型名);
    因为结构体变量类型较长,所以通常用typedef更改变量类型名

    比如:

    将结构体变量 struct{…} 换一个别名叫GPIO_InitTypeDef

我们把GPIO_InitTypeDef取个名字叫GPIO_InitStructure放到void GPIO_Init()上面并且在void GPIO_Init()中取地址&GPIO_InitStructure

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructurevoid GPIO_Init(GPIOA,GPIO_InitTypeDef* GPIO_InitStruct)

由上面struct{…}结构体知道GPIO_InitStructure 有三个参数分别用.引出:
(也可以用->直接指向结构体成员即可,就不必用*取地址和.引出结构体)

GPIO_InitStructure.GPIO_Mode
GPIO_InitStructure.GPIO_Pin
GPIO_InitStructure.GPIO_Speed

第一个Mode有8种模式

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_PP_OD(Out Push Pull) //推挽输出
GPIO_Mode_AF_OD(Atl Open Drain) //复用开漏
GPIO_Mode_AF_PP(Atl Push Pull) //复用推挽

  • 开漏 高电平没有驱动能力
  • 推挽 高低电平都有驱动能力

第二个GPIO_InitStructure.GPIO_Pin 的选择

第三个GPIO_InitStructure.GPIO_Speed的选择

我们一般选50MHz

最后结果如下:

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);

这样我们就把GPIOA 上所有引脚都初始化好了。

3、最后使用输入或输出的函数控制GPIO口

————————————————————————————————————————————————end
这里总共涉及了RCC和GPIO两个外设

★常用的三个RCC外设

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

★读写GPIO的8个函数

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t 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);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

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

     GPIO_ResetBits(GPIOA, GPIO_Pin_0); //将PA0口置0Delay_ms(500);GPIO_SetBits(GPIOA, GPIO_Pin_0);//将PA0口置1Delay_ms(500);GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//Bit_RESET设置低电平Delay_ms(500);GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);Delay_ms(500);GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);//强制转换BitAction类型 0 1GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);Delay_ms(500);

例2:读取GPIO上 电平操作

GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);//读取PB13上引脚输入 一般是接一个按键 读它的输入 即是否按下
GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)//读取PA1上引脚输出 一般接光敏传感器 读它的AO口输出  即是否被遮挡

例3:灯的函数使用

//灯的打开
void LED1_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
//灯的熄灭
void LED1_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
//灯的翻转
void LED1_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
}

四、delay,oled函数的调用

1、delay

Delay_us();
Delay_ms();
Delay_s();

Delay.h

#ifndef __DELAY_H
#define __DELAY_Hvoid Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);#endif

2、oled


上述代码添加.c和.h文件后可以直接调用

01、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及GPIO初始化参数配置】相关推荐

  1. 02、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及EXTI外部中断初始化参数配置】

    ----------接着上一篇笔记写 四.返回值函数 五.EXTI外部中断 1.配置RCC 2.配置GPIO 3.配置AFIO 4.配置EXTI 5.配置NVIC 中断函数 四.返回值函数 uint8 ...

  2. 04、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及利用TIM输出比较配置PWM】

    ----------接着上一篇笔记写 八.OC输出比较 九.PWM配置 1.RCC开启时钟 2.配置时基单元 3.配置输出比较单元 4.配置GPIO 5.运行控制 输出比较的函数介绍 十.重映射(重映 ...

  3. b站江科大自化协51单片机入门教程笔记(2)

    文章目录 6-1 矩阵键盘 6-2 矩阵键盘密码锁 7-1 定时器 7-2 按键控制LED流水灯 & 定时器时钟 独立按键模块 定时器模块 8-1 串口通信 8-2 串口向电脑发送数据 &am ...

  4. b站江科大自化协51单片机入门教程笔记(1)

    文章目录 1 综述 2-1 点亮一个LED 2-2 LED闪烁 2-3 LED流水灯 2-4 LED流水灯PLus 3-1 独立按键控制LED亮灭 3-2 独立按键控制LED状态 3-3 独立按键控制 ...

  5. 一份标准的STM32工程模板都需要哪些文件?(B站江科大自化协)

    大家好,我是烟火.目前BMS软件工程师在职,利用自由时间,输出一些基础知识合集,一方面巩固,另一方面写博客作为成长记录. 人间清醒: 明明有能力可以变成更优秀的人 遇见更好的人 过更喜欢的生活 如果因 ...

  6. 17、江科大stm32视频学习笔记——USART串口协议和USART串口外设

    目录 1.通信接口 2. 硬件电路 3.电平标准 4.串口参数及时序 5.USART简介 6.USART工作 (1)写操作 (2)读操作 (3)帧头和帧尾的添加和除由电路自动执行 (4)硬件数据控制流 ...

  7. 7、江科大stm32视频学习笔记——中断的应用:对射式红外传感器计次旋转编码器计次

    目录 1.标志位函数 2. 初始化的中断的步骤 3.对射式红外传感器计次 (1)接线图 (2)CountSensor.c (3)main.c 4.旋转编码器计次 (1)接线图(旋转编码器接在PB1.P ...

  8. 51单片机入门(江科大)之个人笔记

    目录 P3.单片机及开发板介绍 P4.点亮一个小灯泡 P5.LED闪烁 P6.LED流水灯 P7.独立按键控制LED亮灭 P8.独立按键控制LED状态 P9.独立按键控制LED显示二进制 P10.独立 ...

  9. 14、江科大stm32视频学习笔记——AD单通道和AD多通道代码

    目录 一.程序现象 1.AD单通道 2.AD多通道 二.原理图 三.AD单通道 1.AD.c(单次转换非扫描) 2.改为连续转换非扫描 3.main.c 四.AD双通道(单次转换非扫描) 1.思路 2 ...

最新文章

  1. 初学MyBatis-Plus
  2. 2位图灵奖得主、7位院士等一众AI大佬云集共议数字化转型 | CNCC 2021
  3. JSPatch defineProtocol 实现详解
  4. C++实现基数排序(附完整源码)
  5. 2.3微秒的特征点匹配
  6. NullInjectorError:No provider for MyNewService
  7. Linux 命令积累 fuser lsof mtr
  8. 2017双11交易系统TMF2.0技术揭秘,实现全链路管理
  9. 表单表格-为什么标签需要语义化
  10. java collection 常用类_分析Collection常用的实现类
  11. c++简单程序实现——小公主养成记
  12. 伍斯特理工学院计算机研究生,伍斯特理工学院计算机工程硕士排名第52(2020年TFE Times排名)...
  13. linux中查看ruby版本号,Ruby 版本常量
  14. 电脑休眠唤醒后无法显示WIFI列表
  15. C Runtime Library 与 STL
  16. 对中国四大名著--红楼梦 使用jieba进行分词处理 排除去停词 统计完整词频并按降序排列 前20词绘制词云图
  17. Android开发、adb、monkey测试
  18. multiple definition of `main'
  19. 通达OA 工作流电子签章 盖章Or手写
  20. Aras Innovator Method集成Visual Studio

热门文章

  1. [历年IT笔试题]2014京东校园招聘-软件开发笔试题
  2. mysql 5.7.17 zip_win10下mysql 5.7.17 zip压缩包版安装教程
  3. 使用ARCHPR明文攻击爆破压缩包
  4. [Python公开课]零基础玩转Python基础篇----第四节:Python的字符串
  5. TexturePacker图集拆分
  6. OSS: cURL error: Empty reply from server (52)
  7. ecg 幅度_ECG(心电图)
  8. 明明白白学通C语言 二维码版 pdf
  9. 【rk3399】AIO-3399J Linux_SDK Recovery按键无法进入Loader模式
  10. oracle trim函数用法详解