외부 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);
// }
//
// }
//
//}
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 |