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白话文教程固件库点灯的主要内容,如果未能解决你的问题,请参考以下文章