STM32人门篇——跑马灯、蜂鸣器和按键

软件部分

重点:

写一个跑马灯程序的步骤:

1.使能IO时钟,调用函数RCC_AHB1PeriphClockCmd();

2.初始化IO口模式。调用函数GPIO_Init();

3.操作IO口,输出高低电平。

   GPIO_SetBits(); 设置1

   GPIO_ResetBits(); 设置0

写一个蜂鸣器的步骤与跑马灯类似,所以这个大致的步骤十分重要。

这两个实验中用到的固件库介绍:

 其中 stm32f4xx_rcc.h 头文件在每个实验中都要引入,因为系统时钟配置函数(ABH1)以及相关的外设时 钟使能函数都在这个其源文件 stm32f4xx_rcc.c 中。stm32f4xx_usart.h 和 misc.h 头文件和对应的 源文件在我们 SYSTEM 文件夹中都需要使用到,所以每个实验都会引用。stm32f4xx_syscfg.h 和对应的源文件虽然本实验也没有用到,但是后面很多实验都要使用到,所以我们不妨也添加进来。

温馨提示:在配置32的外设的时候,任何时候都要先使能该外设的时钟。

硬件部分(注意图片中的注释)

跑马灯部分:

STM32人门篇——跑马灯、蜂鸣器和按键_第1张图片

如图片所示,由于LED在一般情况下是处于高电平状态,所以判断为上拉输出。

还有一点跑马灯比较简单,注意一下LED是输出就好,在编写程序的时候是写PFout(9)等等

蜂鸣器部分:

STM32人门篇——跑马灯、蜂鸣器和按键_第2张图片

如图所示,注意蜂鸣器硬件结构中R16的作用。

下拉输出(推挽输出):因为BEEP正常情况下是低电平。

温馨提示:每个文件中记得把用到的头文件引入。

还有要注意的是,蜂鸣器同样是输出PFout(8);


按键:

1.编程:步骤与跑马灯和蜂鸣器的类似;注意一点要区分的是按键时输入外设,所以编程勿把PEin写成习惯的想跑马灯和蜂鸣器一样的out了。

这里引用一段很重要的代码———按键支持连续按和不连续按的合成写法:

u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//保存键值 uchar key_up
	if(mode)key_up=1;  //标志没有按键按下		  
	if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
	{
		delay_ms(10);//延时,消抖
		key_up=0;//标志已经有按键按下
		if(KEY0==0)return 1;
		else if(KEY1==0)return 2;
		else if(KEY2==0)return 3;
		else if(WK_UP==1)return 4;//主函数中以switch函数引入
	}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; 	    
 	return 0;//无按键按下
}
//u16 unsigned short 短整型变量;  //u32 unsigned int 整型变量;  //u8 unsigned char 字符型变量;

static函数:申明的局部变量,存在静态的存储区,其申明的局部变量,具有记忆功能。


2.硬件:

STM32人门篇——跑马灯、蜂鸣器和按键_第3张图片

因为在初始化函数部分判断上下拉输入很重要,这里引入以下判断上拉输入和下拉输入的方法:

STM32人门篇——跑马灯、蜂鸣器和按键_第4张图片

判断方法多样,但是我感觉图中第三种方法也很不错的。此处,可以拿这些方法去验证以下前篇博文中LED和蜂鸣器的输出方式。以及以后在遇到新硬件的时候对初始化函数的编写都可以用这些方法判断。


3.error:

我在写跑马灯、蜂鸣器和现在的按键来看,遇到最难解决的error就是:

..\OBJ\Template.axf:Error: L6200E: Symbol INTX_ENABLE multiply defined (by key.o and sys.o),

在遇到这个问题时候 看大.o文件可能大部分我们都是比较懵,下面讲一下我的几个基本操作有80~90%的可能性可以解决:

1.查看是以下是不是以及把头文件全部引入到源文件中;

2.在Manage Project Items...里面加入相应文件;

3.删去重复定义的部分(这个操作最有效!)



      




你可能感兴趣的:(STM32人门篇——跑马灯、蜂鸣器和按键)