寒假伊始,拿到了心(hua)心(le)念(qian)念的开发板,开始了学习
首先,什么是单片机?在我理解来说,单片机由一块微型芯片和他控制的一系列电子器件共同组成。然后经过查询资(bai)料(du),得知单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统,也就是那个小芯片。
第一周主要学习了通过GPIO控制LED闪烁以及扫描键盘判断按钮事件。
我画了一个流程图大概说明GPIO的使用方法,如下:
点击可查看大图
例如,我需要设置PE8为上拉输出:
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能GPIOE时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//指定针脚8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置反转速度
GPIO_Init(GPIOE,&GPIO_InitStructure);//对GPIOE初始化
到这一步我已经大概知道一些GPIO的基本用法了,那么我该怎么去点亮开发板上的LED小灯,让他实现跑马灯的效果呢?
初步的思路是,先初始化LED小灯对应的GPIO接口,然后用GPIO_SetBits()函数去点亮小灯。那么我们可以直接在Main.C中直接初始化LED小灯的接口参数,也可以利用头文件,然后再在Main.C中调用。附上两种思路的代码:(点击按钮查看)
//直接在Main.C中初始化LED小灯
#include "stm32f10x.h"
#include "delay.h"
void led_init(){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
//PB9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
//PE0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_0);
//PE1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_1);
}
int main(void)
{
led_init();
delay_init();
while(1){
//打开PE1,关闭PB9
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOE,GPIO_Pin_1);
delay_ms(500);
//打开PB9,关闭PE0
GPIO_ResetBits(GPIOE,GPIO_Pin_0);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
delay_ms(500);
//打开PE0,关闭PE1
GPIO_ResetBits(GPIOE,GPIO_Pin_1);
GPIO_SetBits(GPIOE,GPIO_Pin_0);
delay_ms(500);
}
}
//调用头文件的方法
//led.h
#ifndef _led_h
#define _led_h
void led_init();
#endif
//led.c
//在这里面初始化LED小灯
#include"led.h"
#include"stm32f10x.h"
void led_init(){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
//PB9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
//PE0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_0);
//PE1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_1);
}
//Main.C
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"//引用上面写好的led.c
int main(void)
{
led_init();
delay_init();
while(1){
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOE,GPIO_Pin_1);
delay_ms(500);
GPIO_ResetBits(GPIOE,GPIO_Pin_0);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
delay_ms(500);
GPIO_ResetBits(GPIOE,GPIO_Pin_1);
GPIO_SetBits(GPIOE,GPIO_Pin_0);
delay_ms(500);
}
}
到这一步我们已经可以实现跑马灯效果了,效果图如下:
但是从上面的代码可以看出来,我们的代码并不是很简洁,可以说非常冗长,且可读性较差,所以我们需要对代码的结构进行优化。利用宏定义,我们可以直接在头文件中定义一些方法,然后直接在Main.C中调用,具体实现代码如下:
//led.h
#ifndef _led_h
#define _led_h
void led_init();
#define led0on GPIO_SetBits(GPIOB,GPIO_Pin_9)//定义led0on为PB9输出
#define led0off GPIO_ResetBits(GPIOB,GPIO_Pin_9)//定义led0off为PB9置零
#define led1on GPIO_SetBits(GPIOE,GPIO_Pin_0)//定义led1on为PE0输出
#define led1off GPIO_ResetBits(GPIOE,GPIO_Pin_0)//定义led1off为PE0置零
#define led2on GPIO_SetBits(GPIOE,GPIO_Pin_1)//定义led2on为PE1输出
#define led2off GPIO_ResetBits(GPIOE,GPIO_Pin_1)//定义led2off为PE1置零
#endif
//led.c同上不变
//main.c
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
int main(void)
{
led_init();
delay_init();
while(1){
led0off;
led2on;
delay_ms(500);
led1off;
led0on;
delay_ms(500);
led2off;
led1on;
delay_ms(500);
}
}
以上,完成了第一个单片机的小程序设计并对他进行了结构优化。
Comments | NOTHING