STM32白话文教程固件库点灯

Posted 404detective

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32白话文教程固件库点灯相关的知识,希望对你有一定的参考价值。

学过51再上手32比较简单,但又不简单。
简单在于对单片机编程有一定的了解
困难在于初识固件库

万事开头难,当你看的多了,也就会用了。
本教程的目的就是教你会用,应用总比理论便于理解,也容易激发兴趣。

我的教程一向偏于应用,避开理论。
让你很容易理解并快速上手,学会去使用它。
抛开那些千篇一律的教程,那些摆满了令人头大的原理图。
里面的内容固然重要,但直接给你一坨,你都不知道怎么去看。

有谁照着例程输出了一路PWM,却不知怎么再多输出几路。
有谁照着例程采集了一路ADC,却不知怎么再多采集几路。
如果是你,我建议你别走。

如果你还没有配置好环境,并且你用的是keil4来学习C51,你可以看看这个。
如何让keil4同时编译c51和stm32单片机源码无需卸载无需修改配置文件

言归正传,开始点灯。

还记得51怎么点灯吗?

首先我们要知道LED2、LED3对应的引脚。(看下原理图)

共阳极发光二极管 让PB5、PE5输出低电平 就会导通

51中我们是不是会这样写(伪代码)
PB5=0;
PE5=0;
但在32中用固件库的写法则为
GPIO_ResetBits(GPIOB,GPIO_Pin_5)GPIO_ResetBits(GPIOE,GPIO_Pin_5)GPIO_ResetBits(GPIOX,GPIO_Pin_N);
则为设置PXN引脚为输出/输入为0(低电平)
GPIO_SetBits(GPIOX,GPIO_Pin_N);
则为设置PXN引脚为输出/输入为1(高电平)

但是!32还要进行时钟使能和配置引脚、设置输入或输出模式。

时钟使能:

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  //打开PB口时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
  //打开PE口时钟
  
  你用哪一组IO口,就要使能哪一个时钟
  PB5、PE5引脚我们用到了B和E组

配置GPIO口:

第一步: 创建一个结构体( 其实叫类比较好?)

GPIO_InitTypeDef GPIO_InitStructure;

觉得又臭又长?
你也可以写成GPIO_InitTypeDef a;
和你当初写int a;一样
自己以后还能看得懂就行
你甚至可以把GPIO_InitTypeDef改成别的
就像你觉得unsigned int太长用typedef定义成了u32
但没必要不是吗

不了解类的看这
这就好比我创建了一个学生类的表格
创建学生类 学生伍;
学生伍.姓名= ;
学生伍.性别= ;
学生伍.学号= ;
应用表格(B班学生,&学生伍)

第二步: 在配置某一个引脚(学生)中我们填入:

1.引脚(姓名)
2.端口速度(学号)
3.输入/输出模式(性别)

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	//引脚号为5
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	//速度 一般为50MHz
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	//推挽(PP)输出(Out)

第三步: 初始化

把这个引脚应用在B、E组
(引脚属性一模一样,所以可以直接这样应用)

  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_Init(GPIOE, &GPIO_InitStructure);

要是E组还有个引脚号为6呢?

  那就是这个样子 
  没有必要再去写端口速度和输入输出了
  因为还是用原来的赋值
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

最后让PB5、PE5输出低电平

while(1){
	GPIO_ResetBits(GPIOE,GPIO_Pin_5)
	GPIO_ResetBits(GPIOE,GPIO_Pin_5)
}

END


以下为main.c

/*-------------------------------------------------------------------------------
文件名称:main.c
文件描述:LED2、LED3亮
---------------------------------------------------------------------------------*/
#include "stm32f10x.h"

void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  //打开PB口时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//打开PE口时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
	//PB5,PE5引脚设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	//端口速度
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	//端口模式,此为输出推挽模式
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	//初始化对应的端口
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_Init(GPIOE, &GPIO_InitStructure);
}

int main(void)
{
	LED_Init(); //初始化LED 默认为亮 setbits为灭	
	while(1)
	 {
		GPIO_ResetBits(GPIOE,GPIO_Pin_5);
		GPIO_ResetBits(GPIOE,GPIO_Pin_5);
	 } 
}

和51一对比,无非是多了时钟使能和引脚初始化。

附录:

我们应该养成习惯,把每个功能写在不同的.c文件里,并且在.h里简化,最后再在main.c中引用。

下面涉及C语言知识不多说了

/*---------------------------------
文件名称:main.c
文件描述:LED2亮,LED3灭
----------------------------------*/
#include "stm32f10x.h"
#include "LED.h"

int main(void)
{
	LED_Init(); //初始化LED 默认为亮 setbits为灭
	 {
		LED2_ON;//LED2亮
		LED3_OFF;//LED3灭
	 } 
}

/*-----------------------
文件名称:LED.c
-------------------------*/
#include "LED.h"

void LED_Init(void)
{
	  GPIO_InitTypeDef GPIO_InitStructure;
	  //打开PB口时钟
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
		//打开PE口时钟
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
		//PB5,PE5引脚设置
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
		//端口速度
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		//端口模式,此为输出推挽模式
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		//初始化对应的端口
	  GPIO_Init(GPIOB, &GPIO_InitStructure);
	  GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/*-----------------------
文件名称:LED.h
-------------------------*/
#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

#define LED2_OFF GPIO_SetBits(GPIOE,GPIO_Pin_5)
#define LED2_ON GPIO_ResetBits(GPIOE,GPIO_Pin_5)
#define LED2_REV GPIO_WriteBit(GPIOE, GPIO_Pin_5,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5))))

#define LED3_OFF GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define LED3_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define LED3_REV GPIO_WriteBit(GPIOB, GPIO_Pin_5,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5))))

void LED_Init(void);

#endif

以上是关于STM32白话文教程固件库点灯的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32点亮LED灯程序

基于STM32F103入门1——点亮LED灯

STMF4-1-固件库点灯

第9章 初识STM32固件库

第9章 初识STM32固件库—零死角玩转STM32-F429系列

STM32固件库和Keil里面的Lib库是啥关系