FW 심화 과정/[2] STM32심화실습

0811 PWM / FND

천숭이 2022. 8. 11. 18:32

cubeMX 에서 설정한 핀

 

< UART >

PC10핀 - UART3_TX,  PC11핀 - UART3_RX 연결해서 보드와의 UART 송수신이 가능하게 설정한다.

 

코드1. 조이스틱을 led 컨트롤

		// 0809 joystick -> LED control
		if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13, GPIO_PIN_SET);
		
		if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_7) != GPIO_PIN_SET)
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13, GPIO_PIN_SET);
		
		else
			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13, GPIO_PIN_RESET);

조이스틱과 연결된 핀 GPIOA의 입력에 따라서 GPIOD와 연결된 LED핀의 동작이 결정된다.

GPIO_PIN_SET = 1 = HIGH,

GPIO_PIN_RESET = 0  = LOW 이다.

 

코드2. uart

		// 0810 uart
		uint8_t c; 
		HAL_UART_Receive(&huart3, &c, sizeof(c), (uint32_t)-1);   // uart 신호 받기
		HAL_UART_Transmit(&huart3, &c, sizeof(c), (uint32_t)-1);  // 터미널로 출력
		
		HAL_Delay(100);
		HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);

HAL_UART_Receive(해당하는 구조체 주소, 받는 변수의 크기, 무제한 기다림);

HAL_UART_Transmit 매개변수도 동일

HAL_GPIO_TogglePin(출력핀, 핀번호);    :  신호를 반전시킴. 반짝반짝 거림

 

 

< PWM >

폭의 너비를 변형하면서 출력값의 세기를 조절하는 방법

ARR로 frequency가 결정되고, CCR로 빛의 밝기가 결정된다

 

pwm으로 led의 밝기를 조절하기 위해서는 ccr을 변경하면서 빛의 밝기를 조정해야 한다. 두가지 방법!

// 1. TIM4 -> CCR1
직접적으로 구조체의 멤버변수를 사용해 조절해준다
// 2. use MACRO
미리 구현된 함수 __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, i); 를 사용한다

 

 

 

 

한 클럭에서 HIGH가 차지하는 비율이 Duty Cycle.

Duty Cycle이 클수록 세기가 크다

 

코드3. +를 누르면 led의 밝기가 점점 강해지고, -를 누르면 led의 밝기가 점점 약해진다

		if (c == '+' | c == '1')
		{
			for (int i=499;i<1000;i++)
			{
				__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, i);
				HAL_Delay(3);
			}		
		}
		
		else if(c == '-' | c == '2')
		{
			for (int i=1000;i>499;i--)
			{
				__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, i);
				HAL_Delay(3);
			}					
		}

 

 

 

 

 

< FND >

 

코드4. FND 0~9 출력을 위한 함수와 변수를 미리 만들어준다

# define D0	GPIO_PIN_13
# define D1	GPIO_PIN_4
# define D2	GPIO_PIN_5
# define D3	GPIO_PIN_6
# define D4	GPIO_PIN_11
# define D5	GPIO_PIN_12
# define D6	GPIO_PIN_12
# define D7	GPIO_PIN_11

void display_fnd(int pos, int value)  // value : 0~9
{
	// initialize
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13 |GPIO_PIN_4 |GPIO_PIN_5 |GPIO_PIN_6|GPIO_PIN_11 |GPIO_PIN_12, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11 |GPIO_PIN_12 , GPIO_PIN_SET);
	
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);
	
	if (value == 0)  // -> G=1 H=1
	{
		HAL_GPIO_WritePin(GPIOD, D0|D1|D2|D3|D4|D5, GPIO_PIN_RESET);
	}
	else if (value == 1)
	{
		HAL_GPIO_WritePin(GPIOD, D1|D2, GPIO_PIN_RESET);
	}
	else if (value == 2)
	{
		HAL_GPIO_WritePin(GPIOD, D0|D1|D3|D4, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOE, D6, GPIO_PIN_RESET);
	}
	else if (value == 3)
	{
		HAL_GPIO_WritePin(GPIOD, D0|D1|D2|D3, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOE, D6, GPIO_PIN_RESET);
	}
	else if (value == 4)
	{
		HAL_GPIO_WritePin(GPIOD, D1|D2|D5, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOE, D6, GPIO_PIN_RESET);
	}
	else if (value == 5)
	{
		HAL_GPIO_WritePin(GPIOD, D0|D2|D3|D5, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOE, D6, GPIO_PIN_RESET);
	}
	else if (value == 6)
	{
		HAL_GPIO_WritePin(GPIOD, D2|D3|D4|D5, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOE, D6, GPIO_PIN_RESET);
	}
	else if (value == 7)
	{
		HAL_GPIO_WritePin(GPIOD, D0|D1|D2, GPIO_PIN_RESET);
	}
	else if (value == 8)
	{
		HAL_GPIO_WritePin(GPIOD, D0|D1|D2|D3|D4|D5, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOE, D6, GPIO_PIN_RESET);
	}
	else if (value == 9)
	{
		HAL_GPIO_WritePin(GPIOD, D0|D1|D2|D5, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOE, D6, GPIO_PIN_RESET);
	}
	
	if (pos == 1) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
	else if (pos == 2) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
	else if (pos == 3) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_SET);
	else if (pos == 4) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET);

}