3450|1

374

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

(5)基于GD32L233C-START的低功耗远程数据监控系统 [复制链接]

本帖最后由 wenyangzeng 于 2022-3-12 16:50 编辑

【GD32L233C-START 评测】(5)基于GD32L233C-START的低功耗远程数据监控系统

 

      本次评测是《评测2-4》的综合,集片内资源LPUART、LPTIMER、硬件过采样ADC、低功耗而成的低功耗远程数据监控系统。体验了GD32L233C独特的低功耗特性。使用了拓普微HMT070E TD-1D智能模块作为终端,而GD32L233C-START通过LPUART与HMT070E TD-1D智能模块进行远程通讯。

 


     GD32L233C工作于deepsleep深度睡眠模式,低功耗定时器LPTIMER大约每2秒左右中断一次,唤醒CPU。唤醒后启动一次硬件过采样ADC,读取芯片内部温度传感器的温度值,计算成具有2位小数的浮点小数,通过低功耗串口LPUART发送至HMT070E TD-1D智能模块,在LCD屏上显示温度值。接着再次进入deepsleep睡眠模式。LED1在CPU唤醒后点亮,进入睡眠模式后熄灭。
    LPUART发送一次温度数据的命令格式是:
0xaa,0x44,0x00,0x02,0x00,0x00,0x41,0xa7,0x04,0x14,0xcc,0x33,0xc3,0x3c
其中字节6到字节9是浮点小数数据。

     本次评测达到预期效果。由于GD32L233C-START 没有预留IDD接口,无法测量整机耗电,本想割断PCB铜箔引出,但担心万一失败就会中断评测工作,故未实施。希望日后有所改进。

    感谢EEWORLD, 感谢兆易创新提供给我一次难得锻炼机会和平台。使我在这次评测过程深刻体会了GD32L233C这款Cortex-M23低功耗芯片的许多优异性能。

 

代码

#include "gd32l23x.h"
#include "systick.h"
#include <stdio.h>
#include "gd32l233r_eval.h"
#include "math.h"
#include <stdio.h>
#include "stdlib.h"

#define ADC_TEMP_CALIBRATION_VALUE          REG16(0x1FFFF7F8)
#define LPUART_RDATA_ADDRESS      ((uint32_t)&LPUART_RDATA)

uint16_t adc_value = 0U;
float temperature;
int32_t value;
uint8_t rxbuffer[256];
uint8_t Tx_Buffer[15]={0xaa,0x44,0x00,0x02,0x00,0x00,0x41,0xa7,0x04,0x14,0xcc,0x33,0xc3,0x3c};
uint8_t tx_count = 0;
__IO uint8_t rx_count = 0;
__IO uint8_t receive_flag = 0;
__IO uint8_t ADC_EN=0;

void gpio_config(void);
void rcu_config(void);
void adc_config(void);
void lpuart_config(void);
void lptimer_config(void);
void nvic_config(void);
void Get_ADC(void);
int f_bin(float dat);

int main(void)
{uint8_t i;
   systick_config();
   gd_eval_led_init(LED1);
   gd_eval_key_init(KEY_WAKEUP, KEY_MODE_GPIO);
    rcu_config();	
   gpio_config();
    adc_config();
	for(i=0;i<3;i++)
	{
	adc_software_trigger_enable(ADC_INSERTED_CHANNEL);
	value = (int32_t)ADC_TEMP_CALIBRATION_VALUE;
	}
	lpuart_config();
	lptimer_config();
	nvic_config();
     while(1) {
		 gd_eval_led_off(LED1);
		 pmu_to_deepsleepmode(PMU_LDNPDSP_LOWDRIVE, WFI_CMD, PMU_DEEPSLEEP);
		 Get_ADC();
    }
}

void rcu_config(void)
{
   rcu_periph_clock_enable(RCU_PMU);
   rcu_periph_clock_enable(RCU_GPIOA);
   rcu_periph_clock_enable(RCU_GPIOC);
   rcu_periph_clock_enable(RCU_ADC);
   rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);
  rcu_osci_on(RCU_IRC32K);
   rcu_osci_stab_wait(RCU_IRC32K);
   rcu_lptimer_clock_config(RCU_LPTIMERSRC_IRC32K);
   rcu_periph_clock_enable(RCU_LPTIMER);
}

void gpio_config(void)
{
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
    gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_4);
}

void adc_config(void)
{
    adc_channel_length_config(ADC_INSERTED_CHANNEL, 1);
    adc_inserted_channel_config(0U, ADC_CHANNEL_16, ADC_SAMPLETIME_239POINT5);
    adc_external_trigger_source_config(ADC_INSERTED_CHANNEL, ADC_EXTTRIG_INSERTED_NONE);
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
    adc_special_function_config(ADC_SCAN_MODE, DISABLE);
    adc_channel_16_to_19(ADC_TEMP_CHANNEL_SWITCH, ENABLE);
    adc_external_trigger_config(ADC_INSERTED_CHANNEL, ENABLE);
    adc_oversample_mode_config(ADC_OVERSAMPLING_ALL_CONVERT, ADC_OVERSAMPLING_SHIFT_8B, ADC_OVERSAMPLING_RATIO_MUL256);
    adc_oversample_mode_enable();
    adc_enable();
    delay_1ms(1U);
    adc_calibration_enable();
}

void lpuart_config(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_LPUART);
    gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_2);
    gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_3);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);

    lpuart_deinit();
    lpuart_word_length_set(LPUART_WL_8BIT);
    lpuart_stop_bit_set(LPUART_STB_1BIT);
    lpuart_parity_config(LPUART_PM_NONE);
    lpuart_baudrate_set(115200U);
    lpuart_receive_config(LPUART_RECEIVE_ENABLE);
    lpuart_transmit_config(LPUART_TRANSMIT_ENABLE);
    lpuart_enable();
}

void nvic_config(void)
{
   nvic_irq_enable(LPTIMER_IRQn, 1U);
   exti_init(EXTI_29, EXTI_INTERRUPT, EXTI_TRIG_RISING);
    exti_interrupt_flag_clear(EXTI_29);
}

void lptimer_config(void)
{
    lptimer_parameter_struct lptimer_structure;
    lptimer_deinit();
    lptimer_struct_para_init(&lptimer_structure);
    lptimer_structure.clocksource      = LPTIMER_INTERNALCLK;
    lptimer_structure.prescaler        = LPTIMER_PSC_16;
    lptimer_structure.extclockpolarity = LPTIMER_EXTERNALCLK_RISING;
    lptimer_structure.extclockfilter   = LPTIMER_EXTERNALCLK_FILTEROFF;
    lptimer_structure.triggermode      = LPTIMER_TRIGGER_SOFTWARE;
    lptimer_structure.extriggersource  = LPTIMER_EXTRIGGER_GPIO;
    lptimer_structure.extriggerfilter  = LPTIMER_TRIGGER_FILTEROFF;
    lptimer_structure.outputpolarity   = LPTIMER_OUTPUT_NOTINVERTED;
    lptimer_structure.outputmode       = LPTIMER_OUTPUT_PWMORSINGLE;
    lptimer_structure.countersource    = LPTIMER_COUNTER_INTERNAL;
    lptimer_init(&lptimer_structure);
    lptimer_register_shadow_disable();
    lptimer_timeout_disable();
    lptimer_inputremap(LPTIMER_INPUT0_GPIO, LPTIMER_INPUT1_GPIO);
    lptimer_interrupt_flag_clear(LPTIMER_INT_FLAG_CMPVM | LPTIMER_INT_FLAG_CARM);
    lptimer_interrupt_enable(LPTIMER_INT_CMPVM | LPTIMER_INT_CARM);
    lptimer_countinue_start(9999U, 5000U);
    while(lptimer_counter_read() == 0) {
    }
}
void Get_ADC(void)
{ uint8_t i;
	gd_eval_led_on(LED1);
	delay_1ms(1);
	adc_software_trigger_enable(ADC_INSERTED_CHANNEL);
	value = (int32_t)ADC_TEMP_CALIBRATION_VALUE;
	temperature = ((float)((int32_t)ADC_IDATA0-value ) * 3.3f / 4095 * 1000 / 4.3f) + 25;

	f_bin(temperature);
	for (i=0;i<14;i++)
		{
		lpuart_data_transmit((uint8_t)Tx_Buffer);
			while(RESET == lpuart_flag_get(LPUART_FLAG_TBE));
		}
		delay_1ms(5);		
}

void LPTIMER_IRQHandler()
{
    if(RESET != exti_interrupt_flag_get(EXTI_29)) {
        exti_interrupt_flag_clear(EXTI_29);
			ADC_EN=1;
    }
    if(RESET != lptimer_interrupt_flag_get(LPTIMER_INT_FLAG_CMPVM)) {
        lptimer_interrupt_flag_clear(LPTIMER_INT_FLAG_CMPVM);
      ADC_EN=1;
			SystemInit();
    }
		
    if(RESET != lptimer_interrupt_flag_get(LPTIMER_INT_FLAG_CARM)) {
        lptimer_interrupt_flag_clear(LPTIMER_INT_FLAG_CARM);
			 ADC_EN=1;
       SystemInit();
    }
}

 

 

视频

南方的春天气候宜人。

 


 

HEX文件

Demo.rar (8.9 KB, 下载次数: 15)

HEX文件谨慎写入片中,以免因CPU深度睡眠下再次写入遇到困难!

此帖出自GD32 MCU论坛

最新回复

期待后续更新   详情 回复 发表于 2022-3-23 14:22
点赞 关注
 

回复
举报

76

帖子

2

TA的资源

一粒金砂(中级)

沙发
 

期待后续更新

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表