forked from gary/BCU
2
0
Fork 0

mqtt上传数据的方式使用DMA,避免占用cpu

This commit is contained in:
Carl 2025-05-19 11:40:39 +08:00
parent dcb4f440df
commit 3c6b5eec89
6 changed files with 3846 additions and 4098 deletions

View File

@ -67,7 +67,7 @@ void task_100ms_handler(uint32_t base_time)
cout100ms++; cout100ms++;
bms_poll_iso(base_time); bms_poll_iso(base_time);
// bms_poll_adc(); THis was originally commented. // bms_poll_adc(); THis was originally commented.
// bms_poll_adc(base_time); bms_poll_adc(base_time);
bms_poll_statistic(base_time); bms_poll_statistic(base_time);
bms_poll_run_status(base_time); bms_poll_run_status(base_time);
bms_poll_sop(base_time); bms_poll_sop(base_time);
@ -111,7 +111,7 @@ void poll_1ms_task_init(void)
bms_init_gpio(); bms_init_gpio();
bms_init_eeprom(); bms_init_eeprom();
// bms_init_adc(); THis was originally commented. // bms_init_adc(); THis was originally commented.
// bms_init_adc(); bms_init_adc();
bms_init_tag(); bms_init_tag();
bms_init_run(); bms_init_run();
bms_init_comm(); bms_init_comm();
@ -175,6 +175,9 @@ void poll_10ms_task_init(void)
bms_init_sop(); bms_init_sop();
bms_init_iso(); bms_init_iso();
drv_rtc_init();
// bsp_create_task(&poll_100ms_task, (uint8_t *)"100ms");,THis was originally commented. // 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(&poll_100ms_task, (uint8_t *)"100ms");
bsp_create_task(&bms_poll_bmu_task, (uint8_t *)"100ms"); bsp_create_task(&bms_poll_bmu_task, (uint8_t *)"100ms");

File diff suppressed because it is too large Load Diff

View File

@ -984,7 +984,7 @@ void protocol_build_json(uint16_t groupId)
if (json_str) if (json_str)
{ {
drv_mqtt_publish_no_respose(json_str, strlen(json_str)); drv_mqtt_publish_no_respose(json_str, strlen(json_str));
bsp_task_delay_ms(10); bsp_task_delay_ms(100);
cJSON_free(json_str); cJSON_free(json_str);
} }
@ -1042,6 +1042,7 @@ void protocol_build_volt_json(uint8_t i)
if (json_str) if (json_str)
{ {
drv_mqtt_publish_no_respose(json_str, strlen(json_str)); drv_mqtt_publish_no_respose(json_str, strlen(json_str));
bsp_task_delay_ms(100);
cJSON_free(json_str); cJSON_free(json_str);
} }
@ -1099,6 +1100,7 @@ void protocol_build_temp_json(uint8_t i)
if (json_str) if (json_str)
{ {
drv_mqtt_publish_no_respose(json_str, strlen(json_str)); drv_mqtt_publish_no_respose(json_str, strlen(json_str));
bsp_task_delay_ms(100);
cJSON_free(json_str); cJSON_free(json_str);
} }
@ -1170,7 +1172,10 @@ void mqtt_publish_bms_data(uint32_t basetime)
// 定期检测是否蓝牙断连-- // 定期检测是否蓝牙断连--
if (!drv_at_send_cmd("AT+QBLESTAT", "ADVERTISING\0", WIFI_TIMEOUT)) if (!drv_at_send_cmd("AT+QBLESTAT", "ADVERTISING\0", WIFI_TIMEOUT))
{ {
drv_ble_init(); if (!drv_at_send_cmd("AT+QBLESTAT", "CONNECTED\0", WIFI_TIMEOUT))
{
drv_ble_init();
}
} }
// else //@wangk add 5-20,这段注释可以证明上述if起作用了解决蓝牙小概率会消失的问题 // else //@wangk add 5-20,这段注释可以证明上述if起作用了解决蓝牙小概率会消失的问题
// { // {

View File

@ -14,7 +14,7 @@ char wifiName[40] = "BLUESUNESS", wifiPassWord[40] = "bluesun009", bleName[40] =
char cmd[1000] = {0}; //降低栈空间使用 char cmd[1000] = {0}; //降低栈空间使用
#define TX_DMA_BUFFER_SIZE 800 #define TX_DMA_BUFFER_SIZE 1000
uint8_t dma_tx_buffer[TX_DMA_BUFFER_SIZE]; uint8_t dma_tx_buffer[TX_DMA_BUFFER_SIZE];
volatile uint8_t dma_tx_busy = 0; volatile uint8_t dma_tx_busy = 0;
@ -72,6 +72,7 @@ void drv_wireless_send_string(const char *str)
void drv_wireless_send_string_dma(const char *str) void drv_wireless_send_string_dma(const char *str)
{ {
bsp_task_delay_ms(100);
if (dma_tx_busy) return; // 正在发送,丢弃或排队视情况处理 if (dma_tx_busy) return; // 正在发送,丢弃或排队视情况处理
uint16_t len = 0; uint16_t len = 0;
@ -356,8 +357,8 @@ 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); snprintf(cmd, sizeof(cmd), "AT+QMTPUB=0,1,2,0,\"%s\",%d,\"%s\"", MQTT_TOPIC, length, str);
drv_wireless_send_string(cmd); // 未使用DMA // drv_wireless_send_string(cmd); // 未使用DMA
// drv_wireless_send_string_dma(cmd); // 使用DMA drv_wireless_send_string_dma(cmd); // 使用DMA
// kit_time_dly_ms(100); // kit_time_dly_ms(100);
return 0; return 0;
} }

View File

@ -52,15 +52,16 @@ void drv_rtc_disable_init_mode(void)
RTC->WPR = 0xFF; //使能RTC寄存器写保护 RTC->WPR = 0xFF; //使能RTC寄存器写保护
} }
#define RCC_BDCR_RTCSEL_LSI (0x2U << 8) // RTCSEL[1:0] = 10, 选择 LSI 作为 RTC 时钟
//由于低速时钟起振较慢其他任务初始化后再初始化RTC //由于低速时钟起振较慢其他任务初始化后再初始化RTC
bool drv_rtc_init(void) bool drv_rtc_init(void)
{ {
#if 0
bool res = false; bool res = false;
uint32_t dly = 0; uint32_t dly = 0;
//if((RCC->BDCR & RCC_BDCR_RTCEN_POS) != RCC_BDCR_RTCEN_POS) //if((RCC->BDCR & RCC_BDCR_RTCEN_POS) != RCC_BDCR_RTCEN_POS)
{ {
KIT_DEBUG_PRINTF("rtc init\r\n"); KIT_PRINTF("rtc init\r\n");
RCC->APB1ENR |= RCC_APB1Periph_PWR; RCC->APB1ENR |= RCC_APB1Periph_PWR;
//使能允许写入RTC和后备寄存器 //使能允许写入RTC和后备寄存器
PWR->CR |= PWR_CR_DBP; PWR->CR |= PWR_CR_DBP;
@ -71,11 +72,11 @@ bool drv_rtc_init(void)
bsp_task_delay_ms(10); bsp_task_delay_ms(10);
if(dly++ > 500) if(dly++ > 500)
{ {
KIT_DEBUG_PRINTF("rtc fail \r\n"); KIT_PRINTF("rtc fail \r\n");
return res; return res;
} }
} }
KIT_DEBUG_PRINTF("rtc dly %d\r\n", dly); KIT_PRINTF("rtc dly %d\r\n", dly);
RCC->BDCR |= (RCC_RTCCLKSource_LSE | RCC_BDCR_RTCEN_POS); RCC->BDCR |= (RCC_RTCCLKSource_LSE | RCC_BDCR_RTCEN_POS);
//RTC配置使用默认配置 //RTC配置使用默认配置
//设置同步分频系数和异步分频系数默认为1Hz = 32768/(同步分频 + 1)/(异步分频 + 1) //设置同步分频系数和异步分频系数默认为1Hz = 32768/(同步分频 + 1)/(异步分频 + 1)
@ -89,6 +90,38 @@ bool drv_rtc_init(void)
//PWR->CR &= ~PWR_CR_DBP_POS; //PWR->CR &= ~PWR_CR_DBP_POS;
} }
return res; 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. //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) uint32_t drv_rtc_get_tick(void)
{ {
#if 0
struct tm tmp; struct tm tmp;
uint32_t res = 0; uint32_t res = 0;
@ -189,10 +223,30 @@ uint32_t drv_rtc_get_tick(void)
{ {
tmp.tm_mon--; tmp.tm_mon--;
tmp.tm_year = (tmp.tm_year > 2018) ? (tmp.tm_year - 1900) : 119; tmp.tm_year = (tmp.tm_year > 2018) ? (tmp.tm_year - 1900) : 119;
res = kit_time_get_stamp(2019, &tmp); res = mktime(&tmp);
//res = kit_time_get_stamp(2019, &tmp);
} }
return res; 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) bool drv_rtc_set_tick(uint32_t tick)
@ -269,3 +323,54 @@ bool drv_rtc_set_ms(uint16_t ms)
return res; 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); uint16_t drv_rtc_get_ms(void);
uint32_t drv_rtc_get_tick(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 #ifdef __cplusplus
} }
#endif #endif