一.点亮LED
1.1 硬件部分:C8T6核心板+面包板,led灯若干,3.3v接面包板正极,GND接面包板负极,led正极接面包板正极,负极接PA8口
(可以大致认为:led灯如果要亮,需满足存在导通压差,即为led正负极两端电压不能一致)
插入额外补充知识:
GPIO_Mode_Out_PP:推挽模式,高低电平输出能力均有
当led正极接面包板正极,那么负极电平为低电平:亮
当led负极接面包板负极,那么正极电平为高电平:亮
当led负极接面包板负极,那么正极电平为高电平:不亮
当led正极接面包板正极,那么负极电平为高电平:不亮
1.2核心函数:
GPIO_SetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin)*
给所指定的引脚输出高电平:参数一:GPIOX,参数二:引脚名
Eg:GPIO_SetBits(GPIOA, GPIO_Pin_8)** 指定GPIOA的8号引脚输出高电平(PA8输出高电平)
#include “stm32f10x.h” // Device header
#include “Delay.h”
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while(1)
{
//GPIO_SetBits(GPIOA,GPIO_Pin_8);
//Delay_ms(200);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
//Delay_ms(200);
}
}
现象:(推挽模式下)LED不亮 ()
GPIO_ResetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin)*
参数同上,区别是此函数是指定输出引脚电平为低电平
#include “stm32f10x.h” // Device header
#include “Delay.h”
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while(1)
{
//GPIO_SetBits(GPIOA,GPIO_Pin_8);
//Delay_ms(200);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
//Delay_ms(200);
}
}
现象:led亮
GPIO_WriteBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, BitAction BitVal)*
给指定GPIO口输出电平,参数一:GPIOx,参数二:指定引脚口,参数三:高/低 电平(Bit_SET/Bit_RESET)
对比前两个函数:函数名不一样,多了一个参数,可以理解为通过参数三,让此函数可以替代前两个函数,实现高低电平输出
Eg:当led正极接面包板正极,负极接PA8时
#include “stm32f10x.h” // Device header
#include “Delay.h”
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while(1)
{
//GPIO_WriteBit(GPIOA,GPIO_Pin_8,);
//Delay_ms(200);
GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET);
//Delay_ms(200);
}
}
现象:led亮 (将Bit_RESET改为Bit_SET)——led不亮
此时,将led正极接PA8,负极接面包板负极
#include “stm32f10x.h” // Device header
#include “Delay.h”
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while(1)
{
//GPIO_WriteBit(GPIOA,GPIO_Pin_8,);
//Delay_ms(200);
GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET);
//Delay_ms(200);
}
}
现象:led亮 (将Bit_RESET改为Bit_RESET)——led不亮
那么在上述三个亮灭函数的基础上,如何让led实现闪烁?