32单片机学习——点灯点灯

1.发牢骚

我,又来点灯啦!51的相关博客会在寒假更新完,32就先不着急,慢慢玩吧,主要是还想玩玩arduino,最近想了想还是慢慢来吧,才大一里,马路戏院商店天空海阔,任你行。

今天的博客就是讲一下通过stm32f103c8t6最小系统板点亮一个led灯和led流水灯的实现。

2.点灯步骤

操作stm32的GPIO分三步,

第一步,使用RCC开启GPIO时钟;

第二步,使用GPIO_Init函数初始化GPIO;

第三部,使用输出或者输入函数控制GPIO;

为啥要开启时钟呢,可以这样去理解,时钟就是心脏,然后GPIO就是各个器官,器官固然重要,但是没有心脏是工作不了的!配置时钟就是安装心脏。专业的来说,时钟就是系统核心,STM32微控制器的时钟信号,以驱动微控制器在内部的不同部分,包括GPIO。如果没有先配置好时钟,其他模块就不会有正确的时钟信号去驱动它们,导致无法正常工作。

3.硬件连接

1.硬件器材

下载器用的DAP---LINK(也可以用ST---LINK),

stm32f103c8t6最小系统板,面包板,跳线,LED灯

2.LED灯连接图

这个是接线图,我们按照接线图来接,LED灯接在A0管脚。

下面是实物图

4.正式点灯

【1】我看不懂的函数们

我们这里用了RCC和GPIO两个外设,我们先找到RCC的库,看有哪些函数

RCC函数

然后你一看,哇好多函数,咋办里,不要担心,这只是一部分,虽然看上去有好多啊,我也觉得,但是我们用到的只有下面的几个:

cpp 复制代码
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);

这三个是我们经常用到的,我们一个一个来学

AHB外设时钟
cpp 复制代码
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

这个函数的作用是启用或禁用AHB外设时钟的,有两个参数。

第一个参数是选择哪个外设

这里就是提供的选择,stm32互联型设备可以在第一个列表选择,非互联的可以在第二个列表选择,就是英语看的很头疼

第二个参数就是对你选中的这个外设输入启用或禁用,就是使能或不使能。

APB2外设时钟
cpp 复制代码
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

这个函数同样是有两个参数的,第一个参数是选择哪个外设,第二个参数是选择使能或不使能

APB1外设时钟
cpp 复制代码
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

这个除了名字和外设和APB2不一样,其余都是一样的,我把函数解释贴在这里

GPIO库函数

这里我们用到的GPIO库函数不多,以下几条

这里只对其进行一个大概的解释,就不一一列举,有兴趣的可以自行参照函数库

cpp 复制代码
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
/* 参数是GPIOA,GPIOB等,调用这个函数,所制定的GPIO口就会被复位  */

void GPIO_AFIODeInit(void);
/* 这个函数可以复位AFIO外设 */

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
/* 用结构体参数初始化GPIO口的值,需要先创建一个结构体,赋值结构体来配置外设参数 */

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
/* 把结构体变量赋一个默认值 */

// 下面这四个函数是GPIO的读取函数
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);

//  下面四个是GPIO的写入函数
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);

以上就是我们今天要用到的函数的介绍,关键在于英文能不能看懂,其实有点c基础的话,就什么难度

【2】点灯咯~~

通过查看函数,我们可以知道,我们的GPIOA是在RCC_APB2上连接的

首先调用这个函数RCC_APB2PeriphClockCmd

cpp 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
//选择GPIOA,ENABLE

接着调用GPIO_Init()

cpp 复制代码
GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = 
	GPIO_InitStructure.GPIO_Pin = 
	GPIO_InitStructure.GPIO_Speed = 
	GPIO_Init(GPIOA, )
//这里结构体变量都没有配置

GPIO的8种工作模式

GPIO_Mode_AIN = 0x0,//模拟输入

GPIO_Mode_IN_FLOATING = 0x04,//浮空输入

GPIO_Mode_IPD = 0x28,//下拉输入

GPIO_Mode_IPU = 0x48,//上拉输入

GPIO_Mode_Out_OD = 0x14,//开漏输出

GPIO_Mode_Out_PP = 0x10,//推挽输出

GPIO_Mode_AF_OD = 0x1C,//复用开漏

GPIO_Mode_AF_PP = 0x18//复用推挽

我们点灯用推挽输出。

最后配置完成后我们代码是这个

cpp 复制代码
    GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//结构体指针

下面开始输出了

调用函数GPIO_ResetBits

这个函数可以控制P0端口低电平,函数定义如下:

我们的配置如下 :

cpp 复制代码
GPIO_ResetBits(GPIOA,GPIO_Pin_0);//低电平点亮

从而我们得到完整代码

cpp 复制代码
#include "stm32f10x.h"                  // Device header
int main(void)
{
	/* GPIO初始化 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/*配置完成后,我们开始输出 */
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);//这里是低电平点亮
	
	while(1)
	{}
}

编译下载后,结果

灯,亮了,亮了,亮了啊,我cao可算亮了!

终于点完了,好开心,可以睡觉了!!

5.结语

困死了,睡觉睡觉~~

相关推荐
Nu11PointerException1 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
@小博的博客4 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生5 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
scan16 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
懒惰才能让科技进步6 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
love_and_hope6 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen6 小时前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)6 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
Qingniu016 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
hong1616887 小时前
跨模态对齐与跨领域学习
学习