关于stm32点灯
因为使用的芯片就母版可能不是一样的,这里我使用的是stm32f103c8t6来进行讲解
首先要点亮一个灯,就需要知道灯是一个外设,就涉及到gpio的一些知识点
第一步就是要对板子原理图上的硬件连接进行一定的了解,下面这是我使用的板子的硬件连接图
我如果想要实现这个灯的一个亮灭编程,其实就是对PA1这个io口的一个高低电平的切换,通过上面这个图可以知道,如果我们使用
低电平灯就会亮,如果使用高电平灯就会灭。所以现在可以明显的知道要涉及到的一些知识点。
1.GPIO的一些知识点
1.1GPIO的知识点的应用
GPIO的全称:** General Purpose Input/Output 通用输入输出口
1.2关于GPIO的一些细节描述
共有ABCDEFG,7组GPIO端口
每个端口GPIOx有16个IO口:pin 0-15
例如:GPIOA pin0-15 GPIOB pin0-15
每个IO口可配置为8种状态:
输入浮空GPIO_Mode_IN_FLOATING:浮空输入状态,IO口状态完全由外部输入决定。如果悬空时,读到的IO口状态是不确定的,一般用于标准的通讯协议如 I2C、USART 的接收端。(而如果做按键的话是不行的,但是我们的板子上外部接有上拉电阻)。
输入上拉GPIO_Mode_IPU:内部接一个上拉电阻,使得外部没有输入时有个确定的高电平,同时也能够增强驱动能力。按键则常是配置成这样的模式
输入下拉GPIO_Mode_IPD:内部有个下拉电阻,使得外部没有输入时有个确定的低电平。
模拟输入GPIO_Mode_AIN:关闭了施密特触发器,不为转变数字量,不接上拉下拉。常用于ADC采集模拟信号
通用开漏输出GPIO_Mode_Out_OD:IO输出0,N-MOS管导通,接地,低电平;IO输出1,悬空;它具*“线与”*特性,即很多个开漏模式 引脚连接到一起时,只有当所有引脚都输出高阻态,才能由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于接地,使得整条线路都为低电平。
通用推挽输出GPIO_Mode_Out_PP:IO输出0,N-MOS管导通,接地,低电平;IO输出1,P-MOS管导通,接VCC,高电平;所以拥有较强的驱动能力
复用开漏输出GPIO_Mode_AF_OD:用作复用功能时的配置,使用权让给片上外设芯片,例如IIC的数据线和时钟线,使用的是其*线与*的特性。
复用推挽输出GPIO_Mode_AF_PP:用作复用功能时的配置,例如USART,SPI
1.3stm32的一个I/O端口位的基本结构
1.4关于GPIO**在架构中的位置以及相关寄存器**
下面附上一个基本架构图
2.相关代码以及功能实现
项目所要用到的一些文件和一些代码
首先是先建立一个文件夹,存放点灯的代码。
涉及到相关的代码还有main.c,led.c,led.h等代码,和一些固件库函数
led.c的相关代码
#include "led.h"
#include "stm32f10x.h"
#include "stdint.h"
//LED的初始化
void LED_Init()
{
GPIO_InitTypeDef led_initstruct; //定义gpio的结构体
//初始化时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
led_initstruct.GPIO_Pin=GPIO_Pin_1 ; //初始化引脚口(需要对应自己板子上的)
led_initstruct.GPIO_Speed=GPIO_Speed_2MHz;//选择频率
led_initstruct.GPIO_Mode=GPIO_Mode_Out_PP;//选择推挽输出模式
GPIO_Init(GPIOA,&led_initstruct ); //对结构体进行初始化
}
led.h相关代码
void LED_Init(void);
main.c
//一个软件延时函数 大约是1ms
void delay(uint16_t time)
{
uint16_t i=0;
while(time--)
{
i=12000;
while(i--);
}
}
int main()
{
LED_Init(); //led的初始化
while(1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1); //灯亮
// delay(1000);
GPIO_SetBits(GPIOA, GPIO_Pin_1); //灯暗
// delay(1000);
}
}
通过上面的一些代码就可以用stm32控制灯的亮灭。