// STM32 Nucleo-L031K6 HAL Blink + printf() example
// Simulation: https://wokwi.com/projects/367244067477216257
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stm32l0xx_hal.h>
// Define the GPIO
#define LED_PORT GPIOA
#define LED_GPIO_CLK RCC_APB2Periph_GPIOA
#define BLU_PIN GPIO_PIN_0
#define GRE_PIN GPIO_PIN_1
#define RED_PIN GPIO_PIN_2
// 定义寄存器控制方法
#define digitalHi(p, i) {p -> BSRR = i;}
#define digitalLo(p, i) {p -> BRR = i;}
#define digitalToggle(p, i) {p -> ODR ^= i;}
// 定义LED IO 控制
#define BLU_ON digitalHi(LED_PORT, BLU_PIN)
#define BLU_OFF digitalLo(LED_PORT, BLU_PIN)
#define BLU_TOGGLE digitalToggle(LED_PORT, BLU_PIN)
#define GRE_ON digitalHi(LED_PORT, GRE_PIN)
#define GRE_OFF digitalLo(LED_PORT, GRE_PIN)
#define GRE_TOGGLE digitalToggle(LED_PORT, GRE_PIN)
#define RED_ON digitalHi(LED_PORT, RED_PIN)
#define RED_OFF digitalLo(LED_PORT, RED_PIN)
#define RED_TOGGLE digitalToggle(LED_PORT, RED_PIN)
/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */
//红
#define LED_RED \
RED_ON;\
BLU_OFF\
GRE_OFF
//绿
#define LED_GREEN \
RED_OFF;\
GRE_ON\
BLU_OFF
//蓝
#define LED_BLUE \
RED_OFF;\
GRE_OFF\
BLU_ON
//黄(红+绿)
#define LED_YELLOW \
RED_ON;\
GRE_ON\
BLU_OFF
//紫(红+蓝)
#define LED_PURPLE \
RED_ON;\
GRE_OFF\
BLU_ON
//青(绿+蓝)
#define LED_CYAN \
RED_OFF;\
GRE_ON\
BLU_ON
//白(红+绿+蓝)
#define LED_WHITE \
RED_ON;\
GRE_ON\
BLU_ON
//黑(全部关闭)
#define LED_RGBOFF \
RED_OFF;\
GRE_OFF\
BLU_OFF
// GPIO 初始化
void GPIO_Config(){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = BLU_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GRE_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = RED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &GPIO_InitStructure);
GPIO_SetBits(LED_PORT, BLU_PIN);
GPIO_SetBits(LED_PORT, GRE_PIN);
GPIO_SetBits(LED_PORT, RED_PIN);
}
#define SOFT_DELAY Delay(0x0FFFFF);
void Delay(__IO uint32_t nCount);
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
while (1)
{
BLU_ON; // 亮
SOFT_DELAY;
BLU_OFF; // 灭
GRE_ON; // 亮
SOFT_DELAY;
GRE_OFF; // 灭
RED_ON; // 亮
SOFT_DELAY;
RED_OFF; // 灭
/*轮流显示 红绿蓝黄紫青白 颜色*/
RED_ON;
SOFT_DELAY;
LED_GREEN;
SOFT_DELAY;
LED_BLUE;
SOFT_DELAY;
LED_YELLOW;
SOFT_DELAY;
LED_PURPLE;
SOFT_DELAY;
LED_CYAN;
SOFT_DELAY;
LED_WHITE;
SOFT_DELAY;
LED_RGBOFF;
SOFT_DELAY;
}
}
void Delay(__IO uint32_t nCount) //简单的延时函数
{
for (; nCount != 0; nCount--);
}