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

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函数

  

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

 

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外设时钟
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

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

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

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

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

APB2外设时钟 
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

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

 

APB1外设时钟 
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

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

 

 

 GPIO库函数

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

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

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

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
//选择GPIOA,ENABLE

接着调用GPIO_Init()

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//复用推挽

我们点灯用推挽输出。 

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

    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端口低电平,函数定义如下:

我们的配置如下 :

GPIO_ResetBits(GPIOA,GPIO_Pin_0);//低电平点亮

从而我们得到完整代码

#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.结语

困死了,睡觉睡觉~~ 

 

 

 

 

 

 

 

 

 

 

 

物联沃分享整理
物联沃-IOTWORD物联网 » 32单片机学习——点亮LED灯

发表评论