貌似视频讲的内容与视频标题有一点不匹配,所以这一章将要记录的是[3-3][3-4]的内容

信息

来扯一点C语言的知识,

  • 在stm32里面的定义int8_t和int16_t等同于C语言里面的char和short,
  • 关于宏定义,用法是
/*可以给任何字符改名*/
#define 宏名 宏值
/*只能给变量类型命名*/
typedef unsigned char uint8_t;
  • 结构体,这个你接触的比较多,不讲了,不过typedef一般用于简化结构体的命名这个你倒是应要知道一下
  • 枚举enum,有点类似于python的键值对,

外设封装 链接到标题

封装LED 链接到标题

就是去编写.h与.c文件,存储在./Hardware里面,从而使得我们可以调用

提示
这部分封装其实在PID学习的时候我是直接用的,不过在这里虽然可以借鉴,但是不能直接用,因为对应的输出引脚是不同的,我们这里的LEDs使用的pin_1与pin_2。
简单来说就是将主程序的代码封装到.c与.h中,其中.h对函数的声明指他可以被全局使用。
//配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//配置端口
//先配置号端口的三个参数
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 |GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
LED_Init()
#include "stm32f10x.h"

void LED_Init(void)
{
    //配置时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    //配置端口
    //先配置号端口的三个参数
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 |GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
}
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
同样也可以去封装开灯和关灯,不再赘述,自己去操作,并且我懒得封装了,下面的使用直接用源码

封装按键 链接到标题

.c以及.h文件的操作与上面类似,不再赘述,这里就直接给出核心代码了

void Key_Init(void)
{
    //由于stm32板子卡在面包板的位置与视频示意图不同,所以我对引脚进行了调整,用10与0号来代替视频所说的11与1号引脚
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOA时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_10; //PB1和PB11引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式
    GPIO_Init(GPIOB, &GPIO_InitStructure); 
}
uint8_t Key_GetNum(void)
{
    uint16_t KeyNum=0;
    /*下面为读取GPIO端口的部分*/
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0) 
    {
        Delay_ms(20); //消抖延时20ms
        while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0); //等待按键释放
        {
            Delay_ms(20); //消抖延时20ms
            KeyNum = 1; //按键1被按下
        }
    }
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) == 0) 
    {
        Delay_ms(20); //消抖延时20ms
        while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) == 0); //等待按键释放
        {
            Delay_ms(20); //消抖延时20ms
            KeyNum = 2; //按键1被按下
        }
    }
    return KeyNum;
}
信息
实现按一下取反的操作需要用到GPIO_ReadOutputDataBit这个函数,

蜂鸣器 链接到标题

一样的封装思路

光敏传感器 链接到标题

也是一样,初始化函数、读取函数, 一定要自己去试试,思路都是一样的,可以举一反三。

注释
突然发现我似乎一直没有把外设的.h文件放到main.c里面去,但是我在编译的时候没有报错,真所谓一个bug是bug,多个bug能work,

程序示例 链接到标题

烟雾报警器 链接到标题

结合了蜂鸣器与光敏传感器的使用,这里只给出主函数了

Buzz_Init(); //蜂鸣器初始化
LightSensor_Init(); //光敏初始化
while (1)
{
    if(LightSensor_GetNum() == 1) //光敏传感器检测到光线
    {
        Buzz_On(); //蜂鸣器响
    }
    else //光敏传感器未检测到光线
    {
        Buzz_Off(); //蜂鸣器不响
    }
}

OLED显示屏 链接到标题

实际上这是一个debug工具,也是一个比较成熟的外设了,因此关于电平寄存器的少一点,而调用函数的多一点。 所以关于外设直接可以无脑使用已经封装好的OLED.cOLED.h以及OLED_Font.h这三个文件。当然,注意驱动的是哪些引脚,自己调整函数的即可

提示
OLED_Font.h这个文件是字库,如果想要使用自定义的文字也可以自己创造.

于是我们就可以安心写第一个显示程序

OLED_Init();	//初始化OLED
OLED_ShowChar(1, 1, 'H');	//显示字符'H'
OLED_ShowString(1, 3, "Hello!");	//显示字符串"Hello!"
OLED_ShowNum(2, 1, 12345678, 8);	//显示数字12345678
while (1)
{
    
}

在线调试工具 链接到标题

相当于是单片机里面的设置断点运行了,(不过在有ai之后我貌似好像根究没有用过调试工具了),以后有兴趣也可以去keil的官方文档。