STM32入门(三)LED闪烁&流水灯

上节我们已经会点亮STM32板子上的灯,现在我们尝试去点亮外面的灯。

就用PA0口吧,基本的库函数还是跟上一节一样的,只不过多了DeLay延时函数;

只要在工程再多添加system文件,放入Delay.c与Delay.h两个延时函数库文件,然后在点击keil魔术棒,在c++选项添加好system的头文件路径。

然后还要添加头文件#include"Delay.h"

代码如下:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{
	
		GPIO_InitTypeDef GPIO_InitStruct;            //结构体定义
		GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;           //推免输出
		GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;                  //GPIO端口
		GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;         //输出50MHZ
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能时钟
		GPIO_Init(GPIOA,&GPIO_InitStruct);              //GPIO初始化
		GPIO_ResetBits( GPIOA, GPIO_Pin_0);           //GPIO输出低电平
	  GPIO_SetBits( GPIOA, GPIO_Pin_0);                 //GPIO输出高电平
	while(1)
	{
		//写法一:这里列举了几种函数
		GPIO_ResetBits( GPIOA, GPIO_Pin_0);//输出低电平
		Delay_ms(100);
	    GPIO_SetBits( GPIOA, GPIO_Pin_0);
		Delay_ms(100);
	
		GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_RESET);//输出低电平
		Delay_ms(100);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_SET);
		Delay_ms(100);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)0);//(BitAction)0是枚举类型强制转换,
		Delay_ms(100);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)1);
		Delay_ms(100);
	}

 这样就可以闪烁了,这里补充一个就是如果把LED的管脚反过来,把正的一脚插到PA0也可以点亮的,这证明了推免输出模式下,高低电平都是驱动有效的。开漏模式下仅有低电平有效,如果改为开漏输出模式即    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;那么管脚置反后LED是不会闪烁的,只接受低电平点亮;

2.流水灯

我们已经会让一个灯闪烁了,现在尝试一下流水灯的操作;接线图:

 代码的写法可以在函数参数里面用或的操作写出⑦个GPIO端口。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{
	
		GPIO_InitTypeDef GPIO_InitStruct;           
		GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
		GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    //用或的方式来写,并列出7个GPIO端口
		GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
		GPIO_Init(GPIOA,&GPIO_InitStruct);     
	while(1)
	{
		GPIO_ResetBits( GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);   
	// ResetBits的参数可以是GPIO的多种组合,也是或的方式;GPIO输出低电平
		Delay_ms(100);
	  GPIO_SetBits( GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); 
    Delay_ms(100);		
	// GPIO输出高电平
	}
	
}

 可以右键点击GPIO_SetBits();访问函数定义内容来看参数说明,可见参数二是可以用Any种组合方式来写的;

 3.最后介绍一种位移的方式的闪烁操作,通过与非,

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{
		GPIO_InitTypeDef GPIO_InitStruct;           
		GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
		GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
		GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
		GPIO_Init(GPIOA,&GPIO_InitStruct);     
	while(1)
	{
		GPIO_Write(GPIOA,~0x0001);//0000 0000 0000 0001
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0002);//0000 0000 0000 0010
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0004);//0000 0000 0000 0100
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0008);//0000 0000 0000 1000
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0010);//0000 0000 0001 0000
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0020);//0000 0000 0010 0000
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0040);//0000 0000 0100 0000
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0080);//0000 0000 1000 0000
		Delay_ms(100); }
	}

这是GPIO_Pin_X的定义,联系之前的寄存器操作,给某一位置0,要用与非的操作,是一样的;

这个我们用了GPIO_Write();函数,跳转到函数定义页面可以看到参数就是输出寄存器ODR的值

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半重积分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值