mqtt上传数据的方式使用DMA,避免占用cpu
This commit is contained in:
parent
dcb4f440df
commit
3c6b5eec89
|
@ -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
|
@ -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起作用了,解决蓝牙小概率会消失的问题
|
||||||
// {
|
// {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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=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.
|
//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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue