// 注:使用华大半导体HC32L130系列单片机。其中定时部分省略
bl0937.h
#ifndef _BL_0937_HPP_ #define _BL_0937_HPP_ // 注:BL0937可测量电压电流 或 功率 struct _bl0937_ { // // 以下参数需要在初始化前做好配置 en_gpio_port_t _port; // port类型 en_gpio_pin_t _pin; // pin脚 IRQn_Type _irqn_type; // 端口中断类型 en_gpio_irqtype_t _gpio_irqtype; // 中断触发类型 uint8_t _cntu_times; // 每次测量持续多长时间:单位:10ms,此项固定为100(1s) // 以上参数需要在初始化前做好配置 // boolean_t _is_begin; // 已经开始测量频率 _lc_io_ uint32_t _freq; _lc_io_ uint8_t _flag; }; extern boolean_t bl0937_init(struct _bl0937_* bl); extern boolean_t bl0937_begin(struct _bl0937_* bl); extern boolean_t bl0937_end(struct _bl0937_* bl); // 注:此函数既可以做功率检测,也可做电压电流检测。只要改填相关系数值即可 extern boolean_t bl0937_power(struct _bl0937_* bl, float32_t* res, uint16_t _freq, float32_t coef, float32_t itc); #define INT_OP_4_BL0937_10MS(mp) \ if (0 < mp->_flag) \ {\ --mp->_flag; \ } #endif
讯享网
bl0937.c
讯享网#include "BaseDef.h" #include "Bl0937.h" #include "Gpio.h" boolean_t bl0937_init(struct _bl0937_* bl) { stc_gpio_cfg_t gpio_cfg; gpio_cfg.enDir = GpioDirIn; // 端口方向配置->输入 gpio_cfg.enDrv = GpioDrvL; // 端口驱动能力配置->低驱动能力 gpio_cfg.enPd = GpioPdDisable; // 端口下拉配置->失能 gpio_cfg.enPu = GpioPuDisable; // 端口上拉配置->失能 gpio_cfg.enOD = GpioOdDisable; // 端口开漏输出配置->开漏输出关闭 gpio_cfg.enCtrlMode = GpioAHB; // 端口输入/输出值寄存器总线控制模式配置->AHB Gpio_Init(bl->_port, bl->_pin, &gpio_cfg); bl->_is_begin = lc_false; return TRUE; } boolean_t bl0937_begin(struct _bl0937_* bl) { if (bl->_is_begin) { return lc_false; } if (bl->_flag >0) { return lc_false; } bl->_freq = 0; bl->_is_begin = TRUE; bl->_flag = bl->_cntu_times; Gpio_EnableIrq(bl->_port, bl->_pin, bl->_gpio_irqtype); EnableNvic(bl->_irqn_type, IrqLevel3, TRUE); return TRUE; } boolean_t bl0937_end(struct _bl0937_* bl) { if (!bl->_is_begin) { return lc_false; } bl->_is_begin = lc_false; Gpio_DisableIrq(bl->_port, bl->_pin, bl->_gpio_irqtype); return TRUE; } boolean_t bl0937_power(struct _bl0937_* bl, float32_t* res, uint16_t _freq, float32_t coef, float32_t itc) { *(res) = (coef)*(float32_t)_freq+itc; *(res) = (itc)>=*(res) ? 0 : *(res); return TRUE; } void PortX_IRQHandler(void) { if (Gpio_GetIrqStatus(GET_BL0937()->_port, GET_BL0937()->_pin)) { Gpio_ClearIrq(GET_BL0937()->_port, GET_BL0937()->_pin); ++GET_BL0937()->_freq; } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/33515.html