임베디드시스템/STM32
[STM32] LED BLINK BUTTON
KHJ_940803
2021. 11. 11. 14:51
목표 :
1. 버튼 1 : 누를 때 마다 왼-> 오, 오-> 왼 으로 1개씩 이동하며 LED를 점등한다.
2. 버튼 2 : 누를 때 마다 왼-> 오, 오-> 왼 으로 1개씩 채워지며 LED를 점등한다.
3 버튼 3 : LED점등 중 누르면 일시 정지, 일시 정지 중 누르면 이어서 LED 점등 한다.
개발 툴 : STM32CubeIDE
개발 보드 : NUCLEO-F411RE
PC Uart 통신 툴 : Comport master
개발 기간 : 2021년 10월 12일
소스 코드 :
#include "button.h"
#include "led_onoff.h"
extern volatile int Tms_counter;
uint32_t i;
void led_blink_down() // led를 반대 순서대로 채워지면서 점등 된다. (7 -> 0)
{
for (int i = 0; i < 8; i++) // led 가 총 8개 이기에 for 문에 8이 들어간다.
{
led_all_off(); // led를 우선 다끈다.
HAL_GPIO_WritePin(GPIOB, 0x80 >> i, GPIO_PIN_SET); // GPIO_PIN_SET 은 해당 핀에 3.3v를 흘려준다.
//0x80 >> 0 : GPIOB는 총 8개의 핀이 있다. 그중 번호가 큰 7번핀의 불을 킨다.
//0x80 >> i : GPIOB의 7-i 번의 불을 킨다. 즉 for문이 진행 됨에 따라 i의 값은 증가하고 7,6,5...1,0 번의 led가 점등 될 것이다.
HAL_Delay(100); // 딜레이
}
}
void led_blink_up()// led를 순서대로 채워지면서 점등 된다. (0 ->7)
{
for (int i = 0; i < 8; i++)
{
led_all_off();
HAL_GPIO_WritePin(GPIOB, 0x01 << i, GPIO_PIN_SET);
//GPIOB의 7-i 번의 불을 킨다. 즉 for문이 진행 됨에 따라 i의 값은 증가하고 7,6,5...1,0 번의 led가 점등 될 것이다.
HAL_Delay(100);
}
}
void led_all_off() // 모든 led 끈다. GPIO_PIN_RESET : 0v 를 해당 핀에 흘린다.
{
HAL_GPIO_WritePin(GPIOB, 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_PIN_RESET);
}
void led_all_on() // 모든 led 점등. GPIO_PIN_RESET : 3.3v 를 해당 핀에 흘린다.
{
HAL_GPIO_WritePin(GPIOB, 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_PIN_SET);
}
void led_onup()
{
unsigned char led[] ={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
for (int i = 0; i < 8; i++)
{
led_all_off();
HAL_GPIO_WritePin(GPIOB, led[i] , GPIO_PIN_SET);
HAL_Delay(500);
}
}
void led_ondown()
{
unsigned char led[] ={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
for (int i = 0; i < 8; i++)
{
led_all_off();
HAL_GPIO_WritePin(GPIOB, led[i] , GPIO_PIN_SET);
HAL_Delay(500);
}
}
int led_bt_pro_flag = 0;
int prev_int =0;
int i_up = 0;
void led_total_onoff_systick() {
if(i_up ==8)
{
i_up=0;
}
if (led_bt_pro_flag == 0) {
led_all_off();
HAL_GPIO_WritePin(GPIOB, 0x01 << i_up, GPIO_PIN_SET);
if (Tms_counter > 200) {
i_up++;
Tms_counter = 0;
}
if (getButtonState(BUTTON1_GPIO_Port, BUTTON1_Pin, &prevButton1State)) {
led_bt_pro_flag = 1;
i_up = 0;
led_all_off();
}
if (getButtonState(BUTTON2_GPIO_Port, BUTTON2_Pin, &prevButton2State)) {
led_bt_pro_flag = 2;
i_up = 0;
led_all_off();
}
if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin, &prevButton3State)) {
prev_int = led_bt_pro_flag;
led_bt_pro_flag = 4;
i_up =0;
led_all_off();
}
} else if (led_bt_pro_flag == 1) {
led_all_off();
HAL_GPIO_WritePin(GPIOB, 0x80 >> i_up, GPIO_PIN_SET);
if (Tms_counter > 200) {
i_up++;
Tms_counter = 0;
}
if (getButtonState(BUTTON1_GPIO_Port, BUTTON1_Pin,
&prevButton1State)) {
led_bt_pro_flag = 0;
i_up = 0;
led_all_off();
}
if (getButtonState(BUTTON2_GPIO_Port, BUTTON2_Pin,
&prevButton2State)) {
led_bt_pro_flag = 2;
i_up = 0;
led_all_off();
}
if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin,
&prevButton3State)) {
prev_int = led_bt_pro_flag;
led_bt_pro_flag = 4;
i_up = 0;
led_all_off();
}
} else if (led_bt_pro_flag == 2) {
HAL_GPIO_WritePin(GPIOB, 0x01 << i_up, GPIO_PIN_SET);
if (Tms_counter > 200) {
i_up++;
Tms_counter = 0;
if(i_up == 8 ) led_all_off();
}
if (getButtonState(BUTTON1_GPIO_Port, BUTTON1_Pin, &prevButton1State)) {
led_bt_pro_flag = 0;
i_up = 0;
led_all_off();
}
if (getButtonState(BUTTON2_GPIO_Port, BUTTON2_Pin, &prevButton2State)) {
led_bt_pro_flag = 3;
i_up = 0;
led_all_off();
}
if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin, &prevButton3State)) {
prev_int = led_bt_pro_flag;
led_bt_pro_flag = 4;
led_all_off();
i_up = 0;
}
}
else if (led_bt_pro_flag == 3) {
HAL_GPIO_WritePin(GPIOB, 0x80 >> i_up, GPIO_PIN_SET);
if (Tms_counter > 200) {
i_up++;
Tms_counter = 0;
if(i_up == 8 ) led_all_off();
}
if (getButtonState(BUTTON1_GPIO_Port, BUTTON1_Pin, &prevButton1State)) {
led_bt_pro_flag = 0;
led_all_off();
i_up = 0;
}
if (getButtonState(BUTTON2_GPIO_Port, BUTTON2_Pin, &prevButton2State)) {
led_bt_pro_flag = 2;
led_all_off();
i_up = 0;
}
if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin, &prevButton3State)) {
prev_int = led_bt_pro_flag;
led_bt_pro_flag = 4;
led_all_off();
i_up = 0;
}
} else if (led_bt_pro_flag == 4) {
led_all_off();
if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin, &prevButton3State)) {
led_bt_pro_flag = prev_int;
}
}
}
동작 영상 :