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);
}
'FW 심화 과정 > [2] STM32심화실습' 카테고리의 다른 글
0819 조도센서, i2c, RTOS로 설계 실습 (0) | 2022.08.19 |
---|---|
FreeRTOS 코드 백업 (0) | 2022.08.19 |
0816 조도센서 / 가속도온도 센서 실습 (MPU-6000) (0) | 2022.08.16 |
0809 CubeMX 시작 (0) | 2022.08.09 |
0808 까지 main 코드 백업 (0) | 2022.08.09 |
0809 함수 및 라이브러리 생성 (0) | 2022.08.09 |