forked from gary/BCU
2
0
Fork 0

添加rtc功能,使用内部LSI时钟

This commit is contained in:
ahu_gq 2025-05-17 19:31:57 +08:00
parent 56b02e6abb
commit 69cf524761
10 changed files with 6033 additions and 8245 deletions

View File

@ -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");

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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;
}

View File

@ -274,7 +274,7 @@ void DMA1_Stream5_IRQHandler(void)
{
}
void DMA1_Channel6_IRQHandler(void)
void DMA1_Channe6_IRQHandler(void)
{
}

View File

@ -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=2491Hz计数频率
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);
}

View File

@ -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