添加rtc功能,使用内部LSI时钟
This commit is contained in:
parent
56b02e6abb
commit
69cf524761
|
@ -62,7 +62,6 @@ void task_100ms_handler(uint32_t base_time)
|
|||
bms_poll_run_status(base_time);
|
||||
bms_poll_sop(base_time);
|
||||
bms_poll_soh(base_time);
|
||||
task_mqtt_handler(base_time);
|
||||
is_first_run = true;
|
||||
}
|
||||
|
||||
|
@ -141,6 +140,7 @@ void poll_10ms_task_init(void)
|
|||
{
|
||||
|
||||
uint8_t i = 0;
|
||||
uint32_t time = 0;
|
||||
bms_init_fdb();
|
||||
// ???????? ????????ôÒ???????? ??500ms???????????????? ??1300ms(???)
|
||||
KIT_PRINTF("bmu init start \r\n");
|
||||
|
@ -164,6 +164,13 @@ void poll_10ms_task_init(void)
|
|||
|
||||
bms_init_sop();
|
||||
bms_init_iso();
|
||||
drv_rtc_init();
|
||||
|
||||
/*²âÊÔrtc´úÂë
|
||||
drv_set_date_time(2025, 5, 17,19,25, 0);
|
||||
time = drv_rtc_get_tick();
|
||||
*/
|
||||
|
||||
// bsp_create_task(&poll_100ms_task, (uint8_t *)"100ms");,THis was originally commented.
|
||||
bsp_create_task(&poll_100ms_task, (uint8_t *)"100ms");
|
||||
bsp_create_task(&bms_poll_bmu_task, (uint8_t *)"100ms");
|
||||
|
|
|
@ -10,14 +10,14 @@
|
|||
<TargetName>stm32f407</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<pArmCC>5050106::V5.05 update 1 (build 106)::ARMCC</pArmCC>
|
||||
<pCCUsed>5050106::V5.05 update 1 (build 106)::ARMCC</pCCUsed>
|
||||
<pArmCC>5060750::V5.06 update 6 (build 750)::ARMCC</pArmCC>
|
||||
<pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
|
||||
<uAC6>0</uAC6>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
<Device>STM32F407ZGTx</Device>
|
||||
<Vendor>STMicroelectronics</Vendor>
|
||||
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
|
||||
<PackID>Keil.STM32F4xx_DFP.2.14.0</PackID>
|
||||
<PackURL>http://www.keil.com/pack/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
|
@ -186,8 +186,6 @@
|
|||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>2</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<nBranchProt>0</nBranchProt>
|
||||
<hadIRAM2>1</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
|
@ -354,7 +352,7 @@
|
|||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<ClangAsOpt>4</ClangAsOpt>
|
||||
<uClangAs>0</uClangAs>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
|
@ -473,7 +471,7 @@
|
|||
<NoWarn>2</NoWarn>
|
||||
<uSurpInc>2</uSurpInc>
|
||||
<useXO>2</useXO>
|
||||
<ClangAsOpt>0</ClangAsOpt>
|
||||
<uClangAs>2</uClangAs>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
|
@ -882,7 +880,7 @@
|
|||
<NoWarn>2</NoWarn>
|
||||
<uSurpInc>2</uSurpInc>
|
||||
<useXO>2</useXO>
|
||||
<ClangAsOpt>0</ClangAsOpt>
|
||||
<uClangAs>2</uClangAs>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
|
@ -1068,7 +1066,7 @@
|
|||
<TargetCommonOption>
|
||||
<Device>STM32F407VGTx</Device>
|
||||
<Vendor>STMicroelectronics</Vendor>
|
||||
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
|
||||
<PackID>Keil.STM32F4xx_DFP.2.14.0</PackID>
|
||||
<PackURL>http://www.keil.com/pack/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
|
@ -1237,8 +1235,6 @@
|
|||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>2</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<nBranchProt>0</nBranchProt>
|
||||
<hadIRAM2>1</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
|
@ -1405,7 +1401,7 @@
|
|||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<ClangAsOpt>4</ClangAsOpt>
|
||||
<uClangAs>0</uClangAs>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1247,8 +1247,8 @@ void bcu_modbus_set_time_to_bms_msg(uint8_t *buf)
|
|||
tm_hour = READ_BT_INT16U(buf,addr);
|
||||
tm_min = READ_BT_INT16U(buf,addr);
|
||||
tm_sec = READ_BT_INT16U(buf,addr);
|
||||
drv_rtc_set_time(tm_hour, tm_min, tm_sec);
|
||||
drv_rtc_set_date(tm_year, tm_mon, tm_mday);
|
||||
// 设置日期时间:year = 2000~2099
|
||||
drv_set_date_time(tm_year,(uint8_t)tm_mon, (uint8_t)tm_mday, (uint8_t)tm_hour, (uint8_t)tm_min, (uint8_t)tm_sec);
|
||||
}
|
||||
|
||||
BspMdExCode bcu_modbus_485_0x10_fun(uint16_t start_addr, uint16_t reg_num, uint8_t *buf, uint16_t *len)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -10,14 +10,14 @@
|
|||
<TargetName>stm32f407</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<pArmCC>5050106::V5.05 update 1 (build 106)::ARMCC</pArmCC>
|
||||
<pArmCC>5060750::V5.06 update 6 (build 750)::ARMCC</pArmCC>
|
||||
<pCCUsed>5050106::V5.05 update 1 (build 106)::ARMCC</pCCUsed>
|
||||
<uAC6>0</uAC6>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
<Device>STM32F407VGTx</Device>
|
||||
<Vendor>STMicroelectronics</Vendor>
|
||||
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
|
||||
<PackID>Keil.STM32F4xx_DFP.2.14.0</PackID>
|
||||
<PackURL>http://www.keil.com/pack/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
|
@ -186,8 +186,6 @@
|
|||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>2</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<nBranchProt>0</nBranchProt>
|
||||
<hadIRAM2>1</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
|
@ -354,7 +352,7 @@
|
|||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<ClangAsOpt>4</ClangAsOpt>
|
||||
<uClangAs>0</uClangAs>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
|
@ -558,13 +556,4 @@
|
|||
<files/>
|
||||
</RTE>
|
||||
|
||||
<LayerInfo>
|
||||
<Layers>
|
||||
<Layer>
|
||||
<LayName>bcu_bootloader</LayName>
|
||||
<LayPrjMark>1</LayPrjMark>
|
||||
</Layer>
|
||||
</Layers>
|
||||
</LayerInfo>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -322,7 +322,7 @@ uint8_t drv_mqtt_publish(char* str,uint16_t length)
|
|||
uint8_t drv_mqtt_publish_no_respose(char* str,uint16_t length)
|
||||
{
|
||||
// snprintf(cmd, sizeof(cmd), "AT+QMTPUB=0,1,2,0,%s,%d,%s",MQTT_TOPIC, length, str);
|
||||
snprintf(cmd, sizeof(cmd), "AT+QMTPUB=0,1,2,0,\"%s\",%d,\"%s\"", MQTT_TOPIC, length, str);
|
||||
snprintf(cmd, sizeof(cmd), "AT+QMTPUB=0,1,2,0,\"%s\",%d,\"%s\"", MQTT_TOPIC, length, str);
|
||||
drv_wireless_send_string(cmd);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -274,7 +274,7 @@ void DMA1_Stream5_IRQHandler(void)
|
|||
{
|
||||
}
|
||||
|
||||
void DMA1_Channel6_IRQHandler(void)
|
||||
void DMA1_Channe6_IRQHandler(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -52,10 +52,11 @@ void drv_rtc_disable_init_mode(void)
|
|||
RTC->WPR = 0xFF; //使能RTC寄存器写保护
|
||||
}
|
||||
|
||||
|
||||
#define RCC_BDCR_RTCSEL_LSI (0x2U << 8) // RTCSEL[1:0] = 10, 选择 LSI 作为 RTC 时钟
|
||||
//由于低速时钟起振较慢,其他任务初始化后再初始化RTC
|
||||
bool drv_rtc_init(void)
|
||||
{
|
||||
#if 0
|
||||
bool res = false;
|
||||
uint32_t dly = 0;
|
||||
//if((RCC->BDCR & RCC_BDCR_RTCEN_POS) != RCC_BDCR_RTCEN_POS)
|
||||
|
@ -89,6 +90,38 @@ bool drv_rtc_init(void)
|
|||
//PWR->CR &= ~PWR_CR_DBP_POS;
|
||||
}
|
||||
return res;
|
||||
#endif
|
||||
|
||||
/* 1. 使能PWR和备份域访问 */
|
||||
RCC->APB1ENR |= RCC_APB1ENR_PWREN; // 开启PWR时钟
|
||||
PWR->CR |= PWR_CR_DBP; // 允许访问备份域
|
||||
|
||||
/* 2. 启用LSI并等待稳定 */
|
||||
RCC->CSR |= RCC_CSR_LSION; // 启动内部低速时钟LSI
|
||||
while ((RCC->CSR & RCC_CSR_LSIRDY) == 0); // 等待LSI准备好
|
||||
|
||||
/* 3. 选择LSI作为RTC时钟 */
|
||||
RCC->BDCR &= ~RCC_BDCR_RTCSEL; // 清除RTC时钟选择
|
||||
RCC->BDCR |= RCC_BDCR_RTCSEL_LSI; // 选择LSI为RTC时钟
|
||||
RCC->BDCR |= RCC_BDCR_RTCEN; // 使能RTC
|
||||
|
||||
/* 4. 解锁RTC寄存器 */
|
||||
RTC->WPR = 0xCA; // 先写入第一解锁码
|
||||
RTC->WPR = 0x53; // 再写入第二解锁码
|
||||
|
||||
RTC->ISR |= RTC_ISR_INIT; // 进入初始化模式
|
||||
while ((RTC->ISR & RTC_ISR_INITF) == 0); // 等待初始化完成
|
||||
|
||||
/* 5. 设置RTC预分频器(LSI约为40kHz) */
|
||||
RTC->PRER = (127 << 16) | (249); // Async=127, Sync=249,1Hz计数频率
|
||||
|
||||
RTC->CR &= ~RTC_CR_FMT; // 设置为24小时格式
|
||||
|
||||
RTC->ISR &= ~RTC_ISR_INIT; // 退出初始化模式
|
||||
|
||||
/* 6. 锁定写保护 */
|
||||
RTC->WPR = 0xFF;
|
||||
|
||||
}
|
||||
|
||||
//ampm:AM/PM,0=AM/24H,1=PM.
|
||||
|
@ -180,6 +213,7 @@ bool drv_rtc_get_date(int32_t *year, int32_t *month, int32_t *day)
|
|||
|
||||
uint32_t drv_rtc_get_tick(void)
|
||||
{
|
||||
#if 0
|
||||
struct tm tmp;
|
||||
uint32_t res = 0;
|
||||
|
||||
|
@ -195,6 +229,24 @@ uint32_t drv_rtc_get_tick(void)
|
|||
}
|
||||
|
||||
return res;
|
||||
|
||||
#endif
|
||||
|
||||
uint16_t year;
|
||||
uint8_t month, date, hour, min, sec;
|
||||
|
||||
drv_get_date_time(&year, &month, &date, &hour, &min, &sec);
|
||||
|
||||
struct tm rtc_tm;
|
||||
rtc_tm.tm_year = year - 1900;
|
||||
rtc_tm.tm_mon = month - 1;
|
||||
rtc_tm.tm_mday = date;
|
||||
rtc_tm.tm_hour = hour;
|
||||
rtc_tm.tm_min = min;
|
||||
rtc_tm.tm_sec = sec;
|
||||
rtc_tm.tm_isdst = -1; // 不使用夏令时
|
||||
|
||||
return kit_time_get_stamp(1970, &rtc_tm);
|
||||
}
|
||||
|
||||
bool drv_rtc_set_tick(uint32_t tick)
|
||||
|
@ -271,3 +323,54 @@ bool drv_rtc_set_ms(uint16_t ms)
|
|||
return res;
|
||||
}
|
||||
|
||||
// 设置日期时间:year = 2000~2099
|
||||
void drv_set_date_time(uint16_t year, uint8_t month, uint8_t date,uint8_t hour, uint8_t min, uint8_t sec)
|
||||
{
|
||||
if (year < 2000 || year > 2099) return; // 超出 RTC 范围
|
||||
if (month == 0 || month > 12 || date == 0 || date > 31) return;
|
||||
if (hour > 23 || min > 59 || sec > 59) return;
|
||||
|
||||
uint8_t yr = year - 2000;
|
||||
|
||||
// 解锁写保护
|
||||
RTC->WPR = 0xCA;
|
||||
RTC->WPR = 0x53;
|
||||
|
||||
// 进入初始化模式
|
||||
RTC->ISR |= RTC_ISR_INIT;
|
||||
while ((RTC->ISR & RTC_ISR_INITF) == 0);
|
||||
|
||||
// 设置时间(BCD格式)
|
||||
RTC->TR = ((hour / 10) << 20) | ((hour % 10) << 16) |
|
||||
((min / 10) << 12) | ((min % 10) << 8) |
|
||||
((sec / 10) << 4) | (sec % 10);
|
||||
|
||||
// 设置日期(BCD格式)
|
||||
RTC->DR = ((yr / 10) << 20) | ((yr % 10) << 16) |
|
||||
((month / 10) << 12) | ((month % 10) << 8) |
|
||||
((date / 10) << 4) | (date % 10);
|
||||
|
||||
RTC->ISR &= ~RTC_ISR_INIT; // 退出初始化模式
|
||||
|
||||
// 上锁
|
||||
RTC->WPR = 0xFF;
|
||||
}
|
||||
|
||||
// 获取当前时间
|
||||
void drv_get_date_time(uint16_t *year, uint8_t *month, uint8_t *date,uint8_t *hour, uint8_t *min, uint8_t *sec)
|
||||
{
|
||||
uint32_t tr = RTC->TR;
|
||||
uint32_t dr = RTC->DR;
|
||||
|
||||
*hour = ((tr >> 20) & 0x3) * 10 + ((tr >> 16) & 0xF);
|
||||
*min = ((tr >> 12) & 0x7) * 10 + ((tr >> 8) & 0xF);
|
||||
*sec = ((tr >> 4) & 0x7) * 10 + (tr & 0xF);
|
||||
|
||||
uint8_t yr_l = ((dr >> 20) & 0xF) * 10 + ((dr >> 16) & 0xF);
|
||||
*year = 2000 + yr_l;
|
||||
|
||||
*month = ((dr >> 12) & 0x1) * 10 + ((dr >> 8) & 0xF);
|
||||
*date = ((dr >> 4) & 0x3) * 10 + (dr & 0xF);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -18,6 +18,11 @@ bool drv_rtc_set_ms(uint16_t ms);
|
|||
uint16_t drv_rtc_get_ms(void);
|
||||
uint32_t drv_rtc_get_tick(void);
|
||||
|
||||
// 获取当前时间
|
||||
void drv_get_date_time(uint16_t *year, uint8_t *month, uint8_t *date,uint8_t *hour, uint8_t *min, uint8_t *sec);
|
||||
// 设置日期时间:year = 2000~2099
|
||||
void drv_set_date_time(uint16_t year, uint8_t month, uint8_t date,uint8_t hour, uint8_t min, uint8_t sec);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue