一、单片机介绍
stm32系列单片机大差不差,小编将以stm32l431为例讲解一些基本操作,原理图如下:
(一)跑马灯操作
1.在单片机原理图找到led灯相应引脚(红灯:PC9;绿灯:PC6;蓝灯:PB2)
2.设置管脚模式:管脚PC9、PC6、PB2均设为GPIO_Output模式
3.配置led连接的相应cpu管脚,默认是高电平(灯灭)
4.配置时钟树
5.配置代码相关选项(Project Manager——>Code Generator)
6.生成代码
7.修改程序及编译
修改main.c文件中的while循环代码,添加的代码如下:
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);//红灯亮
HAL_Delay(500);//亮的时间500ms
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);//红灯灭
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
烧录成功后将会看到红、绿、蓝三个LED灯交替闪烁
(二)代码优化
接下来将会运用C语言知识对代码进行优化,使代码更容易理解
1.在图形化界面对led的每个GPIO管脚重新命名:这样RedLed、GreenLed、BlueLed均有了意义
2.生成代码,可在gpio.c中查看
3.led操作函数封装
在gpio.c上面添加两个led控制函数的定义
void turn_led(int which,int status)
{
GPIO_PinState level;
level = (OFF==status)?GPIO_PIN_SET:GPIO_PIN_RESET;
switch(which)
{
case RedLed:
HAL_GPIO_WritePin(RedLed_GPIO_Port,RedLed_Pin,level);
break;
case GreenLed:
HAL_GPIO_WritePin(GreenLed_GPIO_Port,GreenLed_Pin,level);
break;
case BlueLed:
HAL_GPIO_WritePin(BlueLed_GPIO_Port,BlueLed_Pin,level);
break;
}
}
void blink_led(int which,uint32_t interval){
turn_led(which,ON);
HAL_Delay(interval);
turn_led(which,OFF);
HAL_Delay(interval);
}
4.头文件gpio.h添加led控制函数turn_led()和blink_led()的声明及相关枚举、宏定义;
enum/*枚举*/
{
RedLed,
GreenLed,
BlueLed,
LedMax,
};
#define OFF 0
#define ON 1
extern void turn_led(int which,int status);
extern void blink_led(int which,uint32_t interval);
//which表示要控制的灯:RedLed、GreenLed或BlueLed;interval指闪烁时间间隔,单位为毫秒
5.修改main.c中while循环代码,实现跑马灯功能
blink_led(BlueLed,500);
blink_led(RedLed,500);
blink_led(GreenLed,500);
以上为本期内容