本帖最后由 地瓜patch 于 2025-1-21 20:49 编辑
MM32F3273使用高性能的 Arm® Cortex-M3 为内核的 32 位微控制器,最高工作频率可达 120MHz,内置高速存储器,丰富的 I/O 端口和多种外设。
- 512KB Flash,128KB SRAM
- 3 个 12 位的 ADC、2 个 12 位的DAC、2 个比较器
- 2 个 16 位通用定时器、2 个 32 位通用定时器、2 个 16 位基本定时器和 2 个 16 位高级定时器
- 2 个 I2C 接口、3 个 SPI 接口、3 个 I2S 接口和 8 个 UART 接口
- 1 个 USB OTG 全速接口
- 1 个 CAN 接口
- 1 个 SDIO 接口
- 工作电压为 2.0V - 5.5V
- 工作温度范围(环境温度)-40℃ - 85℃ 工业级和-40℃ - 105℃ 扩展工业级(后缀为V)
- 多种省电工作模式支持低功耗应用的需求

void RTC_Calendar_Sample(void)
{
printf("\r\nTest %s", __FUNCTION__);
RTC_Configure();
while (1)
{
PLATFORM_LED_Toggle(LED1);
PLATFORM_DelayMS(100);
}
}
void RTC_Configure(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5B5B)
{
RCC_LSICmd(ENABLE);
while (RESET == RCC_GetFlagStatus(RCC_FLAG_LSIRDY))
{
__NOP();
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
RTC_SetPrescaler(40000);
RTC_WaitForLastTask();
printf("\r\n%s", __FUNCTION__);
BKP_WriteBackupRegister(BKP_DR1, 0x5B5B);
}
else
{
printf("\r\nNeed't to configure RTC.");
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
}
NVIC_InitStruct.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
RTC_LoadDefault();
}
void RTC_SetDateTime(uint16_t Year, uint8_t Month, uint8_t Day, uint8_t Hour, uint8_t Minute, uint8_t Second)
{
uint32_t TotalSecond = 0;
uint16_t y = 0;
uint8_t m = 0;
if ((Year >= 1970) && (Year <= 2099))
{
for (y = 1970; y < Year; y++)
{
if (RTC_LeapYear(y) == 1)
{
TotalSecond += 31622400; /* Total Seconds Of Leap Year */
}
else
{
TotalSecond += 31536000; /* Total Seconds Of Normal Year */
}
}
for (m = 0; m < (Month - 1); m++)
{
TotalSecond += RTC_DayOfMonth[m] * 86400; /* Total Seconds Of Month */
if ((RTC_LeapYear(Year) == 1) && (m == 1))
{
TotalSecond += 86400;
}
}
TotalSecond += (uint32_t)(Day - 1) * 86400; /* Total Seconds Of Day */
TotalSecond += (uint32_t)Hour * 3600; /* Total Seconds Of Hour */
TotalSecond += (uint32_t)Minute * 60; /* Total Seconds Of Minute */
TotalSecond += Second;
RCC_APB1PeriphClockCmd(RCC_APB1ENR_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RTC_SetCounter(TotalSecond);
RTC_WaitForLastTask();
RTC_UpdateCalendar();
}
else
{
printf("\r\nError Date & Time!!!\r\n");
}
}
void RTC_UpdateCalendar(void)
{
static uint32_t PreTotalDay = 0;
uint32_t TotalSecond = 0;
uint32_t TotalDay = 0;
uint16_t Year = 1970;
uint8_t Month = 0;
TotalSecond = RTC_GetCounter();
TotalDay = TotalSecond / 86400;
if (PreTotalDay != TotalDay)
{
PreTotalDay = TotalDay;
while (TotalDay >= 365)
{
if (RTC_LeapYear(Year) == 1)
{
if (TotalDay >= 366)
{
TotalDay -= 366;
}
else
{
break;
}
}
else
{
TotalDay -= 365;
}
Year++;
}
RTC_Calendar.year = Year;
while (TotalDay >= 28)
{
if ((Month == 1) && (RTC_LeapYear(RTC_Calendar.year) == 1))
{
if (TotalDay >= 29)
{
TotalDay -= 29;
}
else
{
break;
}
}
else
{
if (TotalDay >= RTC_DayOfMonth[Month])
{
TotalDay -= RTC_DayOfMonth[Month];
}
else
{
break;
}
}
Month++;
}
RTC_Calendar.month = Month + 1;
RTC_Calendar.day = TotalDay + 1;
RTC_Calendar.week = RTC_GetWeek(RTC_Calendar.year, RTC_Calendar.month, RTC_Calendar.day);
}
RTC_Calendar.hour = (TotalSecond % 86400) / 3600;
RTC_Calendar.minute = ((TotalSecond % 86400) % 3600) / 60;
RTC_Calendar.second = ((TotalSecond % 86400) % 3600) % 60;
}
|