반응형

https://youtube.com/live/YhnQJ5wZIKQ

[STM32#02] STM32F103RB NUCLEO보드에서 디지털출력 함수인 HAL_GPIO_WritePin()과 디지털입력함수인 HAL_GPIO_ReadPin()에 대해서 알아보기!(녹칸다 내맘대로 STM32)

심심한녹칸다의 내맘대로 STM32시리즈이다!

STM32시리즈의 모든 자료는 구글 슬라이드에 작성하고 모두에게 공유되어있음!
https://docs.google.com/presentation/d/1myA5iYbjuKsLWLqtRLKAiRfwUwvqB1d1RGjiMIIgp3I/edit?slide=id.g38606a02edc_2_164#slide=id.g38606a02edc_2_164

이번편인 디지털입출력에 대해서 알아보도록 한다!
디지털출력은 LED를 제어하고, 디지털입력은 버튼의 누름상태를 확인하는 것으로 한다!
버튼을 누르면 LED가 제어되는 예제를 만들어보는 것이다!

 

LED 회로도

버튼 회로도


1.STM32에 LED 8개를 연결하고, LED를 1초 간격으로 On/Off를 반복하는데 HAL함수에서 토글시키는 함수를 이용해서 작동시키오!

while (1)
 {
	//모든 LED가 토글 제어된다!
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3); //PB3
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13); //PB13
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5); //PB5
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_14); //PB14
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4); //PB4
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_15); //PB15
	  HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4); //PC4
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_7); //PB7
	//1초 쉰다
   HAL_Delay(1000);
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }

ex1.zip
0.00MB

 

2.홀수번쨰 LED와 짝수번째 LED가 서로 번갈아 가면서 토글제어 되도록 토글제어 함수를 이용해서 구현하시오!

/* USER CODE BEGIN 2 */
 //짝수번째 LED를 켠상태로 출발한다!
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET); //PB13
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET); //PB14
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET); //PB15
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET); //PB7
 /* USER CODE END 2 */
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
	//모든 LED가 토글 제어된다!
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3); //PB3
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13); //PB13
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5); //PB5
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_14); //PB14
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4); //PB4
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_15); //PB15
	  HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4); //PC4
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_7); //PB7
	//1초 쉰다
   HAL_Delay(1000);
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }

ex2.zip
0.00MB

 

3.LED1번을 시작으로 1초간격으로 LED8까지 시계방향으로 순차적으로 빙글빙글 돌면서 LED를 켜시오!(가장 허접한 방법) (깜빡하고 예제파일 저장을 안함)

while (1)
 {
	//LED1만 ON, 나머지는 OFF
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET); //PB3
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //PB13
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //PB5
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //PB14
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //PB4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //PB15
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //PC4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET); //PB7
	//1초 쉰다
   	HAL_Delay(1000);
 	  //LED2만 ON, 나머지는 OFF
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); //PB3
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET); //PB13
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //PB5
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //PB14
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //PB4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //PB15
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //PC4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET); //PB7
	//1초 쉰다
	HAL_Delay(1000);
	//LED3만 ON, 나머지는 OFF
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); //PB3
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //PB13
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET); //PB5
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //PB14
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //PB4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //PB15
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //PC4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET); //PB7
	//1초 쉰다
	HAL_Delay(1000);
	//LED4만 ON, 나머지는 OFF
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); //PB3
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //PB13
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //PB5
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET); //PB14
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //PB4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //PB15
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //PC4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET); //PB7
	//1초 쉰다
	HAL_Delay(1000);

	//LED5만 ON, 나머지는 OFF
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); //PB3
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //PB13
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //PB5
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //PB14
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); //PB4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //PB15
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //PC4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET); //PB7
	//1초 쉰다
	HAL_Delay(1000);
	//LED6만 ON, 나머지는 OFF
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); //PB3
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //PB13
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //PB5
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //PB14
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //PB4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET); //PB15
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //PC4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET); //PB7
	//1초 쉰다
	HAL_Delay(1000);
	//LED7만 ON, 나머지는 OFF
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); //PB3
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //PB13
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //PB5
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //PB14
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //PB4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //PB15
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET); //PC4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET); //PB7
	//1초 쉰다
	HAL_Delay(1000);
	//LED8만 ON, 나머지는 OFF
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); //PB3
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //PB13
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //PB5
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //PB14
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //PB4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //PB15
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //PC4
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET); //PB7
	//1초 쉰다
	HAL_Delay(1000);
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }


4.예제3을 for루프를 이용해서 아주 현명하게 해결해보시오!  (깜빡하고 예제파일 저장을 안함)

//포트그룹을 배열로 만드는데 8개니까 배열 8개 만들기~
 GPIO_TypeDef *mygroup[8];
 //핀번호가 8개니가 8개 만들기~
 uint16_t mypin[8];
 mygroup[0] = GPIOB;
 mygroup[1] = GPIOB;
 mygroup[2] = GPIOB;
 mygroup[3] = GPIOB;
 mygroup[4] = GPIOB;
 mygroup[5] = GPIOB;
 mygroup[6] = GPIOC;
 mygroup[7] = GPIOB;
 mypin[0] = GPIO_PIN_3;
 mypin[1] = GPIO_PIN_13;
 mypin[2] = GPIO_PIN_5;
 mypin[3] = GPIO_PIN_14;
 mypin[4] = GPIO_PIN_4;
 mypin[5] = GPIO_PIN_15;
 mypin[6] = GPIO_PIN_4;
 mypin[7] = GPIO_PIN_7;
 /* USER CODE END 2 */
 /* Infinite loop */

 /* USER CODE BEGIN WHILE */
 while (1)
 {
	//i는 현재 LED가 켜져야할 번호
	for(int i = 0; i<8 ; i++){
		//i가 0이라면 LED1면 켜져야 하는상황이고 현재 LED1은 배열의 번호가 0인 상황이다!
		//i가 1이라면 배열의 번호는 1인 녀석만 켜져야하고 나머지는 꺼져야한다!
		//i가 2이라면 배열 번호 2인 녀석이 켜져야한다
		//i가 j라면 배열번호 j인 녀석만 켜지고 나머지는 꺼져야한다!
		for(int j = 0;j<8;j++){
			if(i == j){
				HAL_GPIO_WritePin(mygroup[j],mypin[j],GPIO_PIN_SET);
			}else{
				HAL_GPIO_WritePin(mygroup[j],mypin[j],GPIO_PIN_RESET);
			}
		}
		HAL_Delay(1000);
	}
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }


5.STM32에 붙어있는 버튼 1번을 누르면 LED 1번이 켜지고, 버튼 2번을 누르면 LED1번이 꺼지는 예제를 구현하시오!

while (1)
 {
	//PB1을 누른게 감지된다면~
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET){
	   //PB3에 연결된 LED를 ON한다
	   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
	}
	//PA8을 누른게 감지된다면~
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8) == GPIO_PIN_RESET){
	   //PB3에 연결된 LED를 OFF한다
	   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
	}
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }

ex5.zip
0.00MB

 

6.STM32에 버튼 8개를 다 연결하고, 버튼1을 누르면 LED1이 토글되고, 버튼2를 누르면 LED2가 토글되는 방식으로 순서대로 8개의 LED를 8개의 버튼으로 토글제어하시오!

while (1)
 {
	//PB1/PB3, PA8/PB13, PB2/PB5, PB6/PB14, PC5/PB4, PC7/PB15, PA11/PC4, PA12/PB7
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_14);
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
	if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
	if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_7) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_15);
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4);
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_7);
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }

ex6.zip
0.00MB

 

7.PB1에 연결된 버튼을 누를때마다 LED가 1번부터 8번방향으로 이동하고, PA8에 연결된 버튼을 누르면 반대방향으로 LED를 켜지도록 하시오!

/* USER CODE BEGIN 2 */
 //현재 켜져있어야할 LED의 번호
 int led_num = 0;
 //포트그룹을 배열로 만드는데 8개니까 배열 8개 만들기~
	GPIO_TypeDef *mygroup[8];
	//핀번호가 8개니가 8개 만들기~
	uint16_t mypin[8];
	mygroup[0] = GPIOB;
	mygroup[1] = GPIOB;
	mygroup[2] = GPIOB;
	mygroup[3] = GPIOB;
	mygroup[4] = GPIOB;
	mygroup[5] = GPIOB;
	mygroup[6] = GPIOC;
	mygroup[7] = GPIOB;
	mypin[0] = GPIO_PIN_3;
	mypin[1] = GPIO_PIN_13;
	mypin[2] = GPIO_PIN_5;
	mypin[3] = GPIO_PIN_14;
	mypin[4] = GPIO_PIN_4;
	mypin[5] = GPIO_PIN_15;
	mypin[6] = GPIO_PIN_4;
	mypin[7] = GPIO_PIN_7;
	//시작할때 LED1을 켜놓고 시작한다!
	HAL_GPIO_WritePin(mygroup[0],mypin[0],GPIO_PIN_SET);
 /* USER CODE END 2 */
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */

 while (1)
 {
	//PB1을 누르면 LED가 시계방향으로 하나씩 켜진다
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET){
		led_num++;
		//led번호는 8번이 되면 0으로 초기화한다!
		if(led_num > 7){
			led_num = 0;
		}
		//LED1~LED8까지의 작동상태를 설정한다
		for(int i = 0;i<8;i++){
			//i와 led_num이 같은 녀석만 켜지고 나머지는 꺼진다
			if(i == led_num){
				//ON
				HAL_GPIO_WritePin(mygroup[i],mypin[i],GPIO_PIN_SET);
			}else{
				//OFF
				HAL_GPIO_WritePin(mygroup[i],mypin[i],GPIO_PIN_RESET);
			}
		}
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
	//PA8을 누르면 LED가 반시계방향으로 하나씩 켜진다
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8) == GPIO_PIN_RESET){
		led_num--;
		//LED번호를 하나씩 내리다가 0이되면 제일 마지막번호인 7인된다
		if(led_num < 0){
			led_num = 7;
		}
		for(int i = 0;i<8;i++){
			//i와 led_num이 같은 녀석만 켜지고 나머지는 꺼진다
			if(i == led_num){
				//ON
				HAL_GPIO_WritePin(mygroup[i],mypin[i],GPIO_PIN_SET);
			}else{
				//OFF
				HAL_GPIO_WritePin(mygroup[i],mypin[i],GPIO_PIN_RESET);
			}
		}
		HAL_Delay(200);//0.2초 동안의 스파크는 무시하겠다!
	}
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }

ex7.zip
0.00MB

반응형
Posted by 덕력킹
,