공부방/ARM_STM32 노진호교수님_필기

240424 과제

맘스터치보단파파이스 2024. 4. 24. 10:24

외부 CLK이 안정적이라서 쓴다.

 

/*
 * apMain.c
 *
 *  Created on: Apr 23, 2024
 *      Author: kccistc
 */

#include "apMain.h"


ledState_t ledstate = POWER_ON;
button_t button1, button2, button3;
led_t led1, led2, led3;




unsigned int sec1ms1;

void sys_init() {
	button_init(&button1, GPIOC, GPIO_PIN_10);
	button_init(&button2, GPIOC, GPIO_PIN_11);
	button_init(&button3, GPIOC, GPIO_PIN_12);

	led_init(&led1, GPIOC, GPIO_PIN_8);
	led_init(&led2, GPIOC, GPIO_PIN_6);
	led_init(&led3, GPIOC, GPIO_PIN_5);

}
int apMain()
{

	sys_init();
	while(1)
	{
		apRun();
	}
}

void apRun()
{
	switch(ledstate)
	{
	case POWER_ON:
		powerOnStateRun();
		break;
	case STATE1:
		state1StateRun();
		break;
	case STATE2:
		state2StateRun();
		break;
	case STATE3:
		state3StateRun();
		break;
	default:
		break;
	}
}

void powerOnStateRun()
{
	//이벤트 처리 루틴
	if(button_getState(&button1)==ACT_RELEASED){
		ledstate = STATE1;
	}
	else if(button_getState(&button2)==ACT_RELEASED){
		ledstate = STATE2;
	}
	else if(button_getState(&button3)==ACT_RELEASED){
		ledstate = STATE3;
	}

	//상태 동작 루틴
	//led1, led2, led3 500ms blink
	static uint32_t prevTime = 0;
	uint32_t curTime = HAL_GetTick();
	if(curTime - prevTime < 500){ // non_blocking 동작 방식
		return;
	}
	prevTime = curTime;

	led_toggle(&led1);
	led_toggle(&led2);
	led_toggle(&led3);

}

void state1StateRun()
{
	//이벤트 처리 루틴
	if(button_getState(&button2)==ACT_RELEASED){
		ledstate = STATE2;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
	}
	else if(button_getState(&button3)==ACT_RELEASED){
		ledstate = STATE3;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
	}

	//상태 동작 루틴
	//led1, 200ms blink
	static uint32_t prevTime = 0;
	uint32_t curTime = HAL_GetTick();
	if(curTime - prevTime < 200){ // non_blocking 동작 방식
		return;
	}
	prevTime = curTime;

	led_toggle(&led1);
	led_off(&led2);
	led_off(&led3);

}
void state2StateRun()
{
	//이벤트 처리 루틴
	if(button_getState(&button1)==ACT_RELEASED){
		ledstate = STATE1;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
	}
	else if(button_getState(&button3)==ACT_RELEASED){
		ledstate = STATE3;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
	}

	//상태 동작 루틴
	//led2, led3, 100ms blink
	static uint32_t prevTime = 0;
	uint32_t curTime = HAL_GetTick();
	if(curTime - prevTime < 100){ // non_blocking 동작 방식
		return;
	}
	prevTime = curTime;

	led_off(&led1);
	led_toggle(&led2);
	led_toggle(&led3);

}
void state3StateRun()
{
	//이벤트 처리 루틴
	if(button_getState(&button1)==ACT_RELEASED){
		ledstate = STATE1;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
	}
	else if(button_getState(&button2)==ACT_RELEASED){
		ledstate = STATE2;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
	}

	//상태 동작 루틴
	//led1, led3, 1s blink
	static uint32_t prevTime = 0;
	uint32_t curTime = HAL_GetTick();
	if(curTime - prevTime < 1000){ // non_blocking 동작 방식
		return;
	}
	prevTime = curTime;

	led_toggle(&led1);
	led_off(&led2);
	led_toggle(&led3);

}


///////////////////////////////////////////////////////////////////////////////
//내가 한 과제
//int apMain()
//{
//	int btn_state = 0;
//	sys_init();
//
//	while (1) {
//
//		switch(btn_state){
//		case 0:
//			if(sec1ms1>=500){
//				sec1ms1=0;
//
//				led_toggle(&redLed);
//				led_toggle(&yellowLed);
//				led_toggle(&greenLed);
//			}
//
//
//			break;
//		case 1:
//
//			if(sec1ms1>=200){
//				sec1ms1=0;
//
//				led_toggle(&redLed);
//			}
//
//			break;
//		case 2:
//
//			if(sec1ms1>=100){
//				sec1ms1=0;
//
//				led_toggle(&yellowLed);
//				led_toggle(&greenLed);
//
//			}
//
//			break;
//		case 3:
//
//			if(sec1ms1>=1000){
//				sec1ms1=0;
//
//				led_toggle(&redLed);
//				led_toggle(&greenLed);
//
//			}
//			break;
//
//		}
//
//
//		if (button_getState(&redButton) == ACT_RELEASED) {
//			btn_state = 1;
//			led_off(&redLed);
//			led_off(&yellowLed);
//			led_off(&greenLed);
//
//		}
//		else if (button_getState(&yellowButton) == ACT_RELEASED) {
//			btn_state = 2;
//			led_off(&redLed);
//			led_off(&yellowLed);
//			led_off(&greenLed);
//		}
//		else if (button_getState(&greenButton) == ACT_RELEASED) {
//			btn_state = 3;
//			led_off(&redLed);
//			led_off(&yellowLed);
//			led_off(&greenLed);
//		}
//
//	}
//
//}

non_blocking 동작 방

void apRun()
{
	switch(ledstate)
	{
	case POWER_ON:
		powerOnStateRun();
		break;
	case STATE1:
		state1StateRun();
		break;
	case STATE2:
		state2StateRun();
		break;
	case STATE3:
		state3StateRun();
		break;
	default:
		break;
	}
}

void powerOnStateRun()
{
	//이벤트 처리 루틴
	if(button_getState(&button1)==ACT_RELEASED){
		ledstate = STATE1;
	}
	else if(button_getState(&button2)==ACT_RELEASED){
		ledstate = STATE2;
	}
	else if(button_getState(&button3)==ACT_RELEASED){
		ledstate = STATE3;
	}

	//상태 동작 루틴
	//led1, led2, led3 500ms blink
	static uint32_t prevTime = 0;
	uint32_t curTime = HAL_GetTick();
	if(curTime - prevTime < 500){ // non_blocking 동작 방식
		return;
	}
	prevTime = curTime;
	LCD_writeStringXY(0, 0, "POWER ON");

	led_toggle(&led1);
	led_toggle(&led2);
	led_toggle(&led3);

}

void state1StateRun()
{
	//이벤트 처리 루틴
	if(button_getState(&button2)==ACT_RELEASED){
		ledstate = STATE2;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
		return;
	}
	else if(button_getState(&button3)==ACT_RELEASED){
		ledstate = STATE3;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
		return;
	}

	//상태 동작 루틴
	//led1, 200ms blink
	static uint32_t prevTime = 0;
	uint32_t curTime = HAL_GetTick();
	if(curTime - prevTime < 200){ // non_blocking 동작 방식
		return;
	}
	prevTime = curTime;

	LCD_writeStringXY(0, 0, "state1 ON");
	led_toggle(&led1);
	led_off(&led2);
	led_off(&led3);

}
void state2StateRun()
{
	//이벤트 처리 루틴
	if(button_getState(&button1)==ACT_RELEASED){
		ledstate = STATE1;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
		return;
	}
	else if(button_getState(&button3)==ACT_RELEASED){
		ledstate = STATE3;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
		return;
	}

	//상태 동작 루틴
	//led2, led3, 100ms blink
	static uint32_t prevTime = 0;
	uint32_t curTime = HAL_GetTick();
	if(curTime - prevTime < 100){ // non_blocking 동작 방식
		return;
	}
	prevTime = curTime;

	LCD_writeStringXY(0, 0, "state2 ON");
	led_off(&led1);
	led_toggle(&led2);
	led_toggle(&led3);

}
void state3StateRun()
{
	//이벤트 처리 루틴
	if(button_getState(&button1)==ACT_RELEASED){
		ledstate = STATE1;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
		return;
	}
	else if(button_getState(&button2)==ACT_RELEASED){
		ledstate = STATE2;
		led_off(&led1);
		led_off(&led2);
		led_off(&led3);
		return;
	}

	//상태 동작 루틴
	//led1, led3, 1s blink
	static uint32_t prevTime = 0;
	uint32_t curTime = HAL_GetTick();
	if(curTime - prevTime < 1000){ // non_blocking 동작 방식
		return;
	}
	prevTime = curTime;


	LCD_writeStringXY(0, 0, "state3 ON");
	led_toggle(&led1);
	led_off(&led2);
	led_toggle(&led3);

}

'공부방 > ARM_STM32 노진호교수님_필기' 카테고리의 다른 글

240425_dirver_UltraSonic  (0) 2024.04.25
240424 LCD & ULTRASONIC & INTERRUPTS  (0) 2024.04.24
240423 UART2_LCD  (1) 2024.04.23
240423 LOWLEVEL  (0) 2024.04.23
240422 input switch 과제  (0) 2024.04.23