貌似视频讲的内容与视频标题有一点不匹配,所以这一章将要记录的是[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。
//配置时钟
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.c
与OLED.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的官方文档。