STM32/활용

STM32로 DS1302제어하기(3편)

원원 2023. 1. 24. 20:14

안녕하세요. 2편에서 단순히 초만 읽었는데, 3편에서는 시간,분,초를 설정하고 시간, 분, 초를 읽어보겠습니다

 

 

 

-읽기

void readTime(uint8_t *time)
{
  //array : 0: seconds, 1: minutes, 2: hours

  //seconds read
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 1);
  commandWrite(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin, 0x81);
  time[0] = commandRead(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin);
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 0);

  // minutes read
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 1);
  commandWrite(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin, 0x83);
  time[1] = commandRead(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin);
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 0);

  // hours read
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 1);
  commandWrite(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin, 0x85);
  time[2] = commandRead(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin);
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 0);
}

2편에서 만들었던 commandWirte함수와 commandRead함수를 이용해서 시간,분,초를 읽고 배열에 저장했습니다

 

-쓰기

쓰기를 하기전에 먼저 만들어야 할 함수가 있습니다. 위의 그림에서 seconds를 write하려면 값을 bit6~bit4는 10의자리, bit3~bit0은 1의자리를 write해야합니다. 

uint8_t decToformat(uint8_t c)
{
  return (c/10)<<4 | (c%10);
}

decToformat(20)을 하면 0x20가 return 됩니다.

그리고 hours 설정하는걸 보면 12시간기준 or 24시간기준을 선택할수있는데 여기서는 24시간기준으로 시간을 설정하겠습니다.

void setTime(uint8_t hours, uint8_t minutes, uint8_t seconds)
{
  //second
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 1);
  commandWrite(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin, 0x80);
  commandWrite(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin, decToformat(seconds));
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 0);
  //minutes
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 1);
  commandWrite(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin, 0x82);
  commandWrite(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin, decToformat(minutes));
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 0);
  //hours
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 1);
  commandWrite(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin, 0x84);
  commandWrite(SCLK_GPIO_Port, SCLK_Pin, I_O_GPIO_Port, I_O_Pin, decToformat(hours));
  HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, 0);
}

결과

시간을 설정하고 uart로 값을 출력했습니다

 

시간/분/초 외에도 년도,월,요일도 같은 방식으로 설정 가능합니다

소스코드:https://github.com/yhunterr/STM32F103RB_DS1302/tree/main/DS1302_SECOND

'STM32 > 활용' 카테고리의 다른 글

STM32로 DS1302제어하기(2편)  (1) 2023.01.07
STM32로 DS1302제어하기(1편)  (0) 2023.01.04