안녕하세요. 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로 ADC기능을 사용하여 그래프 표시하기 (0) | 2024.12.30 |
---|---|
STM32로 DS1302제어하기(2편) (1) | 2023.01.07 |
STM32로 DS1302제어하기(1편) (0) | 2023.01.04 |