adc修改:单通道、单词转换、扫描模式、规则组

添加tmp75、mb85rc64
This commit is contained in:
dufresne 2025-09-15 17:03:37 +08:00
parent feccee151f
commit df00792cd4
25 changed files with 1249 additions and 160 deletions

View File

@ -6,6 +6,12 @@
"gd32f4xx_adc.h": "c",
"drv_adc.h": "c",
"gd32f4xx.h": "c",
"gd32f4xx_dma.h": "c"
"gd32f4xx_dma.h": "c",
"tmp75.h": "c",
"gd32f4xx_misc.h": "c",
"rtthread.h": "c",
"rthw.h": "c",
"delay_us.h": "c",
"core_cm4.h": "c"
}
}

View File

@ -0,0 +1,8 @@
{
"folders": [
{
"name": "Project",
"path": "Project"
}
]
}

View File

@ -358,6 +358,8 @@
<state>$PROJ_DIR$\..\rtthread\include\libc</state>
<state>$PROJ_DIR$\..\rtthread\include</state>
<state>D:\git\newPtz\drivers</state>
<state>D:\git\newPtz\drivers\tmp75</state>
<state>D:\git\newPtz\drivers\mb85rc64</state>
</option>
<option>
<name>CCStdIncCheck</name>
@ -2198,18 +2200,30 @@
</group>
<group>
<name>drivers</name>
<group>
<name>mb85rc64</name>
<file>
<name>$PROJ_DIR$\..\drivers\mb85rc64\mb85rc64.c</name>
</file>
</group>
<group>
<name>tmp75</name>
<file>
<name>$PROJ_DIR$\..\drivers\tmp75\tmp75.c</name>
</file>
</group>
<file>
<name>$PROJ_DIR$\..\drivers\delay_us.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\delay_us.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_adc.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_adc.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_usart.c</name>
</file>

View File

@ -2871,18 +2871,30 @@
</group>
<group>
<name>drivers</name>
<group>
<name>mb85rc64</name>
<file>
<name>$PROJ_DIR$\..\drivers\mb85rc64\mb85rc64.c</name>
</file>
</group>
<group>
<name>tmp75</name>
<file>
<name>$PROJ_DIR$\..\drivers\tmp75\tmp75.c</name>
</file>
</group>
<file>
<name>$PROJ_DIR$\..\drivers\delay_us.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\delay_us.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_adc.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_adc.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_usart.c</name>
</file>

View File

@ -0,0 +1,20 @@
# For more options, open this url: https://clang.llvm.net.cn/docs/ClangFormatStyleOptions.html
---
BasedOnStyle: Microsoft
IndentWidth: 4
UseTab: Never
TabWidth: 4
ColumnLimit: 0
---
Language: Cpp
AccessModifierOffset: -4
NamespaceIndentation: All
FixNamespaceComments: false
BreakBeforeBraces: Linux
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
AllowShortBlocksOnASingleLine: true
IndentCaseLabels: true
SortIncludes: false
AlignConsecutiveMacros: AcrossEmptyLines
AlignConsecutiveAssignments: Consecutive

View File

@ -0,0 +1,393 @@
{
"name": "Project",
"type": "ARM",
"dependenceList": [],
"srcDirs": [],
"virtualFolder": {
"name": "<virtual_root>",
"folders": [
{
"name": "Application",
"files": [],
"folders": [
{
"name": "main",
"files": [
{
"path": "${PROJ_DIR}/../applications/main/gd32f4xx_it.c"
},
{
"path": "${PROJ_DIR}/../applications/main/main.c"
}
],
"folders": []
}
]
},
{
"name": "CMSIS",
"files": [
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/system_gd32f4xx.c"
}
],
"folders": []
},
{
"name": "drivers",
"files": [
{
"path": "${PROJ_DIR}/../drivers/drv_adc.c"
},
{
"path": "${PROJ_DIR}/../drivers/drv_adc.h"
},
{
"path": "${PROJ_DIR}/../drivers/drv_i2c.c"
},
{
"path": "${PROJ_DIR}/../drivers/drv_i2c.h"
},
{
"path": "${PROJ_DIR}/../drivers/drv_usart.c"
},
{
"path": "${PROJ_DIR}/../drivers/drv_usart.h"
}
],
"folders": []
},
{
"name": "GD32F4xx_Peripherals",
"files": [
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_adc.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_can.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_crc.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_ctc.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_dac.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_dbg.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_dci.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_dma.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_enet.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_exmc.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_exti.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_fmc.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_fwdgt.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_gpio.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_i2c.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_ipa.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_iref.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_misc.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_pmu.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_rcu.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_rtc.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_sdio.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_spi.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_syscfg.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_timer.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_tli.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_trng.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_usart.c"
},
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Source/gd32f4xx_wwdgt.c"
}
],
"folders": []
},
{
"name": "rtthread",
"files": [
{
"path": "${PROJ_DIR}/../rtthread/board.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/clock.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/components.c"
},
{
"path": "${PROJ_DIR}/../rtthread/libcpu/arm/cortex-m4/context_iar.S"
},
{
"path": "${PROJ_DIR}/../rtthread/src/cpu.c"
},
{
"path": "${PROJ_DIR}/../rtthread/libcpu/arm/cortex-m4/cpuport.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/idle.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/ipc.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/irq.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/kservice.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/mem.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/memheap.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/mempool.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/object.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/scheduler.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/slab.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/thread.c"
},
{
"path": "${PROJ_DIR}/../rtthread/src/timer.c"
}
],
"folders": []
},
{
"name": "Startup",
"files": [
{
"path": "${PROJ_DIR}/../GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/IAR/startup_gd32f450_470.s"
}
],
"folders": []
}
],
"files": []
},
"outDir": "build",
"deviceName": null,
"packDir": null,
"miscInfo": {
"uid": "9d6b5f7fe902100f657674335b6bec3d"
},
"targets": {
"Debug": {
"excludeList": [],
"toolchain": "IAR_ARM",
"compileConfig": {
"cpuType": "Cortex-M3",
"archExtensions": "",
"floatingPointHardware": "none",
"scatterFilePath": "unknown",
"useCustomScatterFile": true,
"storageLayout": {
"RAM": [],
"ROM": []
},
"options": "null"
},
"uploader": "JLink",
"uploadConfig": {
"bin": "",
"baseAddr": "",
"cpuInfo": {
"vendor": "null",
"cpuName": "null"
},
"proType": 1,
"speed": 8000,
"otherCmds": ""
},
"uploadConfigMap": {},
"custom_dep": {
"name": "default",
"incList": [
"${PROJ_DIR}/../GD32F4xx_Firmware_Library/CMSIS",
"${PROJ_DIR}/../GD32F4xx_Firmware_Library/GD32F4xx_standard_peripheral/Include",
"${PROJ_DIR}/../GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Include",
"${PROJ_DIR}/../GD32F4xx_Firmware_Library/CMSIS/GD",
"${PROJ_DIR}/../applications/main",
"${PROJ_DIR}/../rtthread",
"${PROJ_DIR}/../rtthread/include/libc",
"${PROJ_DIR}/../rtthread/include",
"../../drivers"
],
"libList": [],
"defineList": [
"USE_STDPERIPH_DRIVER",
"GD32F470"
]
},
"builderOptions": {
"IAR_ARM": {
"version": 1,
"beforeBuildTasks": [],
"afterBuildTasks": [],
"global": {
"endian-mode": "little",
"runtime-lib": "full",
"printf-formatter": "auto",
"scanf-formatter": "auto",
"output-debug-info": "enable"
},
"c/cpp-compiler": {
"optimization": "low",
"destroy-cpp-static-object": true,
"language-c": "c99",
"language-conformance": "IAR-extensions",
"floating-point-semantics": "strict",
"misc-controls": ""
},
"asm-compiler": {
"case-sensitive-user-symbols": true,
"defines": []
},
"linker": {
"$outputTaskExcludes": [
".bin"
],
"output-format": "elf",
"auto-search-runtime-lib": true,
"perform-cpp-virtual-func-elimination": "enable",
"config-defines": [],
"LIB_FLAGS": [],
"misc-controls": ""
}
}
}
},
"Release": {
"excludeList": [],
"toolchain": "IAR_ARM",
"compileConfig": {
"cpuType": "Cortex-M3",
"archExtensions": "",
"floatingPointHardware": "none",
"scatterFilePath": "unknown",
"useCustomScatterFile": true,
"storageLayout": {
"RAM": [],
"ROM": []
},
"options": "null"
},
"uploader": "JLink",
"uploadConfig": {
"bin": "",
"baseAddr": "",
"cpuInfo": {
"vendor": "null",
"cpuName": "null"
},
"proType": 1,
"speed": 8000,
"otherCmds": ""
},
"uploadConfigMap": {},
"custom_dep": {
"name": "default",
"incList": [],
"defineList": [
"NDEBUG"
],
"libList": []
},
"builderOptions": {
"IAR_ARM": {
"version": 1,
"beforeBuildTasks": [],
"afterBuildTasks": [],
"global": {
"endian-mode": "little",
"runtime-lib": "normal",
"printf-formatter": "auto",
"scanf-formatter": "auto",
"output-debug-info": "enable"
},
"c/cpp-compiler": {
"optimization": "high",
"destroy-cpp-static-object": true,
"language-c": "c99",
"language-conformance": "IAR-extensions",
"floating-point-semantics": "strict",
"misc-controls": ""
},
"asm-compiler": {
"case-sensitive-user-symbols": true,
"defines": []
},
"linker": {
"$outputTaskExcludes": [
".bin"
],
"output-format": "elf",
"auto-search-runtime-lib": true,
"perform-cpp-virtual-func-elimination": "enable",
"config-defines": [],
"LIB_FLAGS": [],
"misc-controls": ""
}
}
}
}
},
"version": "3.6"
}

View File

@ -0,0 +1,8 @@
###########################################################
# project environment variables
###########################################################
PROJ_NAME = Project
PROJ_PATH = d:\git\newPtz\EWARM\Project.ewp
PROJ_DIR = ..
PROJ_FNAME = Project.ewp

View File

@ -0,0 +1,20 @@
##########################################################################################
# Append Compiler Options For Source Files
##########################################################################################
# syntax:
# <your pattern>: <compiler options>
# For get pattern syntax, please refer to: https://www.npmjs.com/package/micromatch
#
# examples:
# 'main.cpp': --cpp11 -Og ...
# 'src/*.c': -gnu -O2 ...
# 'src/lib/**/*.cpp': --cpp11 -Os ...
# '!Application/*.c': -O0
# '**/*.c': -O2 -gnu ...
version: "2.1"
options:
Debug:
files: {}
virtualPathFiles: {}

15
EWARM/Project/.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
# dot files
/.vscode/launch.json
/.settings
/.eide/log
/.eide.usr.ctx.json
# project out
/build
/bin
/obj
/out
# eide template
*.ept
*.eide-template

40
EWARM/Project/.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,40 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "${command:eide.project.build}",
"group": "build",
"problemMatcher": []
},
{
"label": "flash",
"type": "shell",
"command": "${command:eide.project.uploadToDevice}",
"group": "build",
"problemMatcher": []
},
{
"label": "build and flash",
"type": "shell",
"command": "${command:eide.project.buildAndFlash}",
"group": "build",
"problemMatcher": []
},
{
"label": "rebuild",
"type": "shell",
"command": "${command:eide.project.rebuild}",
"group": "build",
"problemMatcher": []
},
{
"label": "clean",
"type": "shell",
"command": "${command:eide.project.clean}",
"group": "build",
"problemMatcher": []
}
]
}

View File

@ -0,0 +1,48 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"terminal.integrated.shellIntegration.enabled": false,
"clangd.arguments": [
"--header-insertion=never"
],
"files.autoGuessEncoding": true,
"C_Cpp.default.configurationProvider": "cl.eide",
"C_Cpp.errorSquiggles": "disabled",
"files.associations": {
".eideignore": "ignore",
"*.a51": "a51",
"*.h": "c",
"*.c": "c",
"*.hxx": "cpp",
"*.hpp": "cpp",
"*.c++": "cpp",
"*.cpp": "cpp",
"*.cxx": "cpp",
"*.cc": "cpp"
},
"[yaml]": {
"editor.insertSpaces": true,
"editor.tabSize": 4,
"editor.autoIndent": "advanced"
}
},
"extensions": {
"recommendations": [
"cl.eide",
"keroc.hex-fmt",
"xiaoyongdong.srecord",
"hars.cppsnippets",
"zixuanwang.linkerscript",
"redhat.vscode-yaml",
"IBM.output-colorizer",
"cschlosser.doxdocgen",
"ms-vscode.vscode-serial-monitor",
"dan-c-underwood.arm",
"marus25.cortex-debug"
]
}
}

View File

@ -58,7 +58,8 @@
/* define value of high speed crystal oscillator (HXTAL) in Hz */
#if !defined (HXTAL_VALUE)
#define HXTAL_VALUE ((uint32_t)25000000)
// #define HXTAL_VALUE ((uint32_t)25000000)
#define HXTAL_VALUE ((uint32_t)8000000)
#endif /* high speed crystal oscillator value */
/* define startup timeout value of high speed crystal oscillator (HXTAL) */

View File

@ -36,13 +36,26 @@ OF SUCH DAMAGE.
#include <stdio.h>
#include "rtthread.h"
#include "rtservice.h"
#include <stdio.h> // FILE 类是一个结构体,在 stdio.h 头文件中
#include "drv_adc.h"
#include "mb85rc64.h"
float voltage;
float current;
float current_origin;
float adc_value;
float tmp;
char tiedian_id[3]={0};
typedef struct _MB85TEST_
{
char ttt;
float ggg;
}MB85TEST;
MB85TEST ttest;
#define MB85TEST_ADD 0x0400
/*!
\brief main function
@ -55,16 +68,39 @@ int main(void)
// RT-Thread 内核初始化等操作...
// 其他应用程序初始化代码...
init_data_collect_module();
adc_config();
temp75_gpio_init();
//测试mb铁电读写
memset(&ttest, 0, sizeof(ttest));
// mb85rc64_page_write();
mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
ttest.ttt += 3;
ttest.ggg /= 18;
mb85rc64_page_write(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
// 进入主循环或启动其他任务
while (1)
{
// voltage = ptz_Voltage_collect_adc1_task();
// current = ptz_Current_collect_adc1_task();
adc_value = ptz_adc1_collect_task();
voltage = ptz_Voltage_collect_adc1_task();
// current_origin = current*0.132 + 3.3/2;
rt_thread_mdelay(500);
current = ptz_Current_collect_adc1_task();
rt_thread_mdelay(500);
tmp = ptz_temperature_collect_tmp75_task();
//测试mb铁电读写
read_mb_id((uint8_t*)&tiedian_id);//读取铁电ID
memset(&ttest, 0, sizeof(ttest));
// mb85rc64_page_write();
mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
// 主循环代码...
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

23
drivers/delay_us.c Normal file
View File

@ -0,0 +1,23 @@
// #include "delay_us.h"
// #include "rtthread.h"
// #include <core_cm4.h>
// #include "gd32f4xx_gpio.h"
// /*
// @ brief 延时函数
// @ param
// @ return
// @ note 2022-5-23
// */
// static void delay_us(int us)
// {
// rt_uint32_t start, now, delta, reload, us_tick;
// start = SysTick->VAL;
// reload = SysTick->LOAD;
// us_tick = SystemCoreClock / 1000000UL;
// do
// {
// now = SysTick->VAL;
// delta = start > now ? start - now : reload + start - now;
// } while (delta < us_tick * us);
// }

8
drivers/delay_us.h Normal file
View File

@ -0,0 +1,8 @@
// #ifndef __TMP75_H_
// #define __TMP75_H_
// static void delay_us(int us);
// #endif

View File

@ -1,4 +1,18 @@
/************************************************************
Copyright (C), 2025, cerlink Tech. Co., Ltd.
FileName: test.cpp
Author: dufresne Version : 1.0 Date:2025.09.15
Description: // 模块描述
Version: // 版本信息
Function List: // 主要函数及其功能
1. -------
History: // 历史修改记录
<author> <time> <version > <desc>
David 96/10/12 1.0 build this moudle
***********************************************************/
#include "drv_adc.h"
#include "tmp75.h"
#include "stdlib.h"
#include "string.h"
#include "gd32f4xx.h"
@ -7,58 +21,18 @@
#include "rtthread.h"
void init_data_collect_module(void)
{
adc_gpio_config();
adc_config();
}
void adc_gpio_config(void)
void adc_config(void)
{
/* 启用GPIOA时钟 */
rcu_periph_clock_enable(RCU_GPIOC);
/* 启用ADC0时钟 */
rcu_periph_clock_enable(RCU_ADC1);
adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
/* 配置ADC引脚为模拟输入模式 */
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, VOLTAGE_ADC_PIN);
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, CURRENT_ADC_PIN);
}
void adc_config(void)
{
// 复位ADC配置可选但建议初始化时做一次
adc_deinit();
// 配置数据对齐方式为右对齐
adc_data_alignment_config(ADCX, ADC_DATAALIGN_RIGHT);
// 配置ADC分辨率12位
adc_resolution_config(ADCX, ADC_RESOLUTION_12B);
/* ########## 设置转换通道序列 ########## */
// 配置规则序列的长度2个通道
adc_channel_length_config(ADCX, ADC_ROUTINE_CHANNEL, ADC_CHANNEL_NUM);
// 配置规则序列序号0是电压通道序号1是电流通道
adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);
adc_routine_channel_config(ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);
// 打开扫描模式
adc_special_function_config(ADCX, ADC_SCAN_MODE, ENABLE);
// 禁止连续模式 -> 单次转换模式
adc_special_function_config(ADCX, ADC_CONTINUOUS_MODE, ENABLE);
// 使能外部触发:这里使用软件触发,所以先禁用硬件触发
adc_external_trigger_config(ADCX, ADC_ROUTINE_CHANNEL, DISABLE);
// adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
// 开启ADC
adc_enable(ADCX);
@ -69,19 +43,47 @@ void adc_config(void)
// 执行ADC自校准
adc_calibration_enable(ADCX);
// 软件触发使能
adc_software_trigger_enable(ADCX, ADC_ROUTINE_CHANNEL);
adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
/* 配置ADC引脚为模拟输入模式 */
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, VOLTAGE_ADC_PIN);
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, CURRENT_ADC_PIN);
// 配置数据对齐方式为右对齐
adc_data_alignment_config(ADCX, ADC_DATAALIGN_RIGHT);
// 配置ADC分辨率12位
adc_resolution_config(ADCX, ADC_RESOLUTION_12B);
// 打开扫描模式
adc_special_function_config(ADCX, ADC_SCAN_MODE, ENABLE);
// 禁止连续模式 -> 单次转换模式
adc_special_function_config(ADCX, ADC_CONTINUOUS_MODE, DISABLE);
/* ########## 设置转换通道序列 ########## */
// 配置规则序列的长度1个通道
adc_channel_length_config(ADCX, ADC_ROUTINE_CHANNEL, ADC_CHANNEL_NUM);
}
// adc采集
float ptz_adc1_collect_task()
// adc电压采集
float ptz_Voltage_collect_adc1_task()
{
// static float adc1_v[LB_TIMES];
// static float curadc1_out;
// static uint8_t adc1_num = 0;
// 配置规则序列序号0是电压通道序号1是电流通道
adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);
// 使能外部触发:这里使用软件触发,所以先禁用硬件触发
adc_external_trigger_config(ADCX, ADC_ROUTINE_CHANNEL, DISABLE);
// 软件触发使能
adc_software_trigger_enable(ADCX, ADC_ROUTINE_CHANNEL);
static float adc1_v[LB_V_TIMES];
static float curadc1_out_v;
static uint8_t adc1_v_num;
int j,k;
float tem;
float curadc1;
@ -90,89 +92,130 @@ float ptz_adc1_collect_task()
while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束
value_V = adc_routine_data_read(ADCX); // 读取规则组数据寄存器
// ... 后面的中位值平均滤波处理保持不变 ...
// *11硬件需要
// adc1_v[adc1_num] = (float)value_V / 4096.0 * 3.3; // 间接测量11倍分压/放大
curadc1 = (float)value_V / 4095.0 * 3.3; // 间接测量11倍分压/放大
// ...
// adc1_num++;
// if(adc1_num >= LB_TIMES)
// {
// adc1_num = 0;
// for(j = 0; j < LB_TIMES-1; j++)//采样值由小到大排列
// {
// for(k = 0; k < LB_TIMES-j-1; k++)
// {
// if(adc1_v[k] > adc1_v[k+1])
// {
// tem = adc1_v[k];
// adc1_v[k] = adc1_v[k+1];
// adc1_v[k+1] = tem;
// }
// }
// }
// for(uint8_t i = 1; i < LB_TIMES - 1; i++)
// {
// curadc1 = curadc1 + adc1_v[i];
// }
// curadc1 = curadc1 /((float)(LB_TIMES - 2));//去掉一个最大值和一个最小值求平均值
// // g_ptz.Voltage = curadc1;
// memset(adc1_v, 0, sizeof(adc1_v));//adc1_v 快速清零
// curadc1_out = curadc1;
// }
// return curadc1_out;
return curadc1;
/* 间接测量11倍分压/放大 */
adc1_v[adc1_v_num] = (float)value_V / 4095.0 * 3.3;
adc1_v_num++;
if(adc1_v_num >= LB_V_TIMES)
{
adc1_v_num = 0;
for(j = 0; j < LB_V_TIMES-1; j++)//采样值由小到大排列
{
for(k = 0; k < LB_V_TIMES-j-1; k++)
{
if(adc1_v[k] > adc1_v[k+1])
{
tem = adc1_v[k];
adc1_v[k] = adc1_v[k+1];
adc1_v[k+1] = tem;
}
}
}
for(uint8_t i = 1; i < LB_V_TIMES - 1; i++)
{
curadc1 = curadc1 + adc1_v[i];
}
curadc1 = curadc1 /((float)(LB_V_TIMES - 2));//去掉一个最大值和一个最小值求平均值
// g_ptz.Voltage = curadc1;
memset(adc1_v, 0, sizeof(adc1_v));//adc1_v 快速清零
curadc1_out_v = curadc1;
}
return curadc1_out_v;
}
// //电流采集
// float ptz_Current_collect_adc1_task()
// {
// static float adc1_i[LB_TIMES];
// static float curadc0_out;
// static uint8_t adc0_num;
// int j,k;
// float tem;
// float curadc0;
// uint16_t value_I;
// adc_software_trigger_enable(ADCX,ADC_ROUTINE_CHANNEL);
// // adc_software_trigger_enable(ADCX,ADC_INSERTED_CHANNEL);
// // while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束
// adc电流采集
float ptz_Current_collect_adc1_task()
{
// 配置规则序列序号0是电压通道序号1是电流通道
adc_routine_channel_config(ADCX, 0, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);
// value_I = adc_routine_data_read(ADCX); // 读取规则组数据寄存器
// // value_I = adc_inserted_data_read(ADCX, CURRENT_ADC_CHANNEL); // 读取规则组数据寄存器
// adc1_i[adc0_num] = (((float)value_I / 4095.0 * 3.3)-3.3/2) / 0.132;//(float)value_I;//
// adc0_num ++;
// if(adc0_num >= LB_TIMES)
// {
// adc0_num = 0;
// for(j = 0; j < LB_TIMES-1; j++)//采样值由小到大排列
// {
// for(k = 0; k < LB_TIMES-j-1; k++)
// {
// if(adc1_i[k] > adc1_i[k+1])
// {
// tem = adc1_i[k];
// adc1_i[k] = adc1_i[k+1];
// adc1_i[k+1] = tem;
// }
// }
// }
// for(uint8_t i = 1; i < LB_TIMES - 1; i++)
// {
// curadc0 = curadc0 + adc1_i[i];
// }
// curadc0 = curadc0 /((float)(LB_TIMES - 2));//去掉一个最大值和一个最小值求平均值
// memset(adc1_i, 0, sizeof(adc1_i));
// curadc0_out = curadc0;
// }
// return curadc0_out;
// }
// 使能外部触发:这里使用软件触发,所以先禁用硬件触发
adc_external_trigger_config(ADCX, ADC_ROUTINE_CHANNEL, DISABLE);
// 软件触发使能
adc_software_trigger_enable(ADCX, ADC_ROUTINE_CHANNEL);
static float adc1_i[LB_I_TIMES];
static float curadc1_out_i;
static uint8_t adc1_i_num;
int j,k;
float tem;
float curadc1;
uint16_t value_I = 0;
while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束
value_I = adc_routine_data_read(ADCX); // 读取规则组数据寄存器
/* 间接测量11倍分压/放大 */
adc1_i[adc1_i_num] = (((float)value_I / 4096.0 * 3.3) - 3.3 / 2) / 0.132;
adc1_i_num++;
if(adc1_i_num >= LB_I_TIMES)
{
adc1_i_num = 0;
for(j = 0; j < LB_I_TIMES-1; j++)//采样值由小到大排列
{
for(k = 0; k < LB_I_TIMES-j-1; k++)
{
if(adc1_i[k] > adc1_i[k+1])
{
tem = adc1_i[k];
adc1_i[k] = adc1_i[k+1];
adc1_i[k+1] = tem;
}
}
}
for(uint8_t i = 1; i < LB_I_TIMES - 1; i++)
{
curadc1 = curadc1 + adc1_i[i];
}
curadc1 = curadc1 /((float)(LB_I_TIMES - 2));//去掉一个最大值和一个最小值求平均值
// g_ptz.Voltage = curadc1;
memset(adc1_i, 0, sizeof(adc1_i));//adc1_i 快速清零
curadc1_out_i = curadc1;
}
return curadc1_out_i;
}
//温度采集
float ptz_temperature_collect_tmp75_task()
{
static float tmp75[5];
static unsigned char tmp75_num;
static float curtmp75_out;
float curtmp75;
float tem;
int j,k;
tmp75[tmp75_num] = tmp75_read_temp();
tmp75_num ++;
if(tmp75_num >= LB_T_TIMES)
{
tmp75_num = 0;
for(j = 0; j < LB_T_TIMES-1; j++)//采样值由小到大排列
{
for(k = 0; k < LB_T_TIMES-j-1; k++)
{
if(tmp75[k] > tmp75[k+1])
{
tem = tmp75[k];
tmp75[k] = tmp75[k+1];
tmp75[k+1] = tem;
}
}
}
for(uint8_t i = 1; i < LB_T_TIMES - 1; i++)
{
curtmp75 = curtmp75 + tmp75[i];//去掉一个最大值和一个最小值
}
curtmp75 = curtmp75 / ((float)(LB_T_TIMES - 2));
curtmp75_out = curtmp75;
memset(tmp75, 0, sizeof(tmp75));
}
return curtmp75_out;
}

View File

@ -8,16 +8,15 @@
#define ADC_GPIO_PORT GPIOC
#define VOLTAGE_ADC_PIN GPIO_PIN_2
#define CURRENT_ADC_PIN GPIO_PIN_3
#define ADC_CHANNEL_NUM 2 // 规则组配置规则序列的通道2个通道
#define LB_TIMES 5
#define ADC_CHANNEL_NUM 1 // 规则组配置规则序列的通道2个通道
#define LB_V_TIMES 7
#define LB_I_TIMES 12
#define LB_T_TIMES 7
// float ptz_Voltage_collect_adc1_task();
// float ptz_Current_collect_adc1_task();
float ptz_adc1_collect_task();
void adc_gpio_config(void);
void adc_config(void);
void init_data_collect_module(void);
float ptz_Voltage_collect_adc1_task();
float ptz_Current_collect_adc1_task();
float ptz_temperature_collect_tmp75_task();
#endif

View File

View File

342
drivers/mb85rc64/mb85rc64.c Normal file
View File

@ -0,0 +1,342 @@
///Copyright (c) 2022, 四川汇源光通信有限公司
///All rights reserved.
///@file mb85rc64.h
///@brief mb85rc64驱动程序 铁电存储器
///
///@details
///@note
///@author lqc
///@date 2022/05/26
///
///@version v1.0 2022/05/26 初始版本
#include "mb85rc64.h"
#include "rtthread.h"
#include <core_cm4.h>
/*
@ brief
@ param
@ return
@ note 2022-5-23
*/
static void delay_us(int us)
{
rt_thread_udelay(us);
}
/*
@ brief
@ param
@ return
@ note 2022-05-26
*/
void mb85rc64_gpio_init()
{
//配置引脚时钟
rcu_periph_clock_enable(RCU_GPIOB);
//设置引脚为输出模式:PB6
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
//设置引脚PB7输出模式
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
MB85RC64_SCL_HIGH;
MB85RC64_SDA_HIGH;
}
/*
@ brief SDA引脚为输出模式
@ param
@ return
@ note 2022-5-26 lqc
*/
static void mb85rc64_sda_output()
{
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
MB85RC64_SDA_HIGH;
}
/*
@ brief SDA引脚为输入模式
@ param
@ return
@ note 2022-5-26 lqc
*/
static void mb85rc64_sda_input()
{
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_PUPD_NONE, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
}
/*
@ brief I2C start信号
@ param
@ return
@ note 2022-5-25
*/
static void i2c_start()
{
MB85RC64_SDA_HIGH;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
MB85RC64_SDA_LOW;
delay_us(4);
}
/*
@ brief I2C stop信号
@ param
@ return
@ note 2022-05-25
*/
static void i2c_stop()
{
MB85RC64_SDA_LOW;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
MB85RC64_SDA_HIGH;
delay_us(4);
}
/*
@ brief mb85rc64接收数据产生ACK信号
@ param SDA被从设备拉为低电平表示应答
@ return
@ note 2022-05-26
*/
static void mb85rc64_ack()
{
int i = 0;
mb85rc64_sda_input();
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
while((MB85RC64_SDA_GET) && i<1000)
{
i++;
}
delay_us(5);
MB85RC64_SCL_LOW;
delay_us(5);
mb85rc64_sda_output();
}
/*
@ brief ACK信号,SDA为低电平
@ param SCL下降沿发送
@ return
@ note 2022-05-26
*/
static void master_ack()
{
MB85RC64_SDA_LOW;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
MB85RC64_SCL_LOW;
delay_us(5);
}
/*
@ brief no_ack信号SDA为高电平
@ param
@ return
@ note 2022-05-26
*/
static void master_no_ack()
{
MB85RC64_SDA_HIGH;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
MB85RC64_SCL_LOW;
delay_us(5);
}
/*
@ brief
@ param
@ return
@ note 2022-05-26
*/
static void mb85rc64_write_byte(uint8_t byte)
{
for(int i = 0; i < 8; i++)
{
MB85RC64_SCL_LOW;
delay_us(5);
if(byte & 0x80)
{
MB85RC64_SDA_HIGH;
}
else
{
MB85RC64_SDA_LOW;
}
MB85RC64_SCL_HIGH;
delay_us(5);
byte <<= 1;
}
MB85RC64_SCL_LOW;
}
/*
@ brief
@ param
@ return
@ note 2022-05-26
*/
static uint8_t mb85rc64_read_byte()
{
uint8_t value = 0;
MB85RC64_SCL_LOW;
delay_us(5);
mb85rc64_sda_input();
for(int i = 0; i < 8; i++)
{
value <<= 1;
MB85RC64_SCL_LOW;
delay_us(5);
MB85RC64_SCL_HIGH;
delay_us(5);
if(MB85RC64_SDA_GET)
{
value = value | 0x01;
}
else {
value = value & 0xfe;
}
}
MB85RC64_SCL_LOW;
delay_us(5);
mb85rc64_sda_output();
return value;
}
/*
@ brief
@ param addr:data:data_len
@ return
@ note 2022-05-27
*/
char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len)
{
uint8_t addr_H = 0;
uint8_t addr_L = 0;
addr_H = (addr >> 8) & 0x00ff;
addr_L = addr & 0x00ff;
//启动信号
i2c_start();
//写地址,R/W位=0
mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
//ack信号
mb85rc64_ack();
//写高8位地址
mb85rc64_write_byte(addr_H);
//ack信号
mb85rc64_ack();
//写低8位地址
mb85rc64_write_byte(addr_L);
//ack信号
mb85rc64_ack();
for(int i = 0; i < data_len; i++)
{
mb85rc64_write_byte(*data);
mb85rc64_ack();
data++;
}
//停止信号
i2c_stop();
return 1;
}
/*
@ brief
@ param addr :data:, data_len:
@ return
@ note 2022-05-27 lqc
*/
char mb85rc64_add_read(unsigned short int addr, unsigned char *data, int data_len)
{
uint8_t addr_H = 0;
uint8_t addr_L = 0;
addr_H = (addr >> 8) & 0x00ff;
addr_L = addr & 0x00ff;
//启动信号
i2c_start();
//写地址R/W位为0
mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
//ack信号
mb85rc64_ack();
//写高8位地址
mb85rc64_write_byte(addr_H);
//ack信号
mb85rc64_ack();
//写低8位地址
mb85rc64_write_byte(addr_L);
//ack信号
mb85rc64_ack();
//启动信号
i2c_start();
//写地址R/W为为1读数据
mb85rc64_write_byte(MB85RC64_ADDRESS_READ);
//ack信号
mb85rc64_ack();
for(int i = 0; i < data_len; i++)
{
//读数据
data[i] = mb85rc64_read_byte();
if(i == data_len - 1)
{
master_no_ack();
}
else
{
master_ack();
}
}
//停止信号
i2c_stop();
return 1;
}
void read_mb_id(uint8_t* buff)
{
i2c_start();
mb85rc64_write_byte(0xf8);
mb85rc64_ack();
mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
mb85rc64_ack();
i2c_start();
mb85rc64_write_byte(0xf9);
mb85rc64_ack();
for(int i = 0; i < 3; i++)
{
//读数据
buff[i] = mb85rc64_read_byte();
if(i == 3 - 1)
{
master_no_ack();
}
else
{
master_ack();
}
}
i2c_stop();
}

View File

@ -0,0 +1,37 @@
///Copyright (c) 2022, 四川汇源光通信有限公司
///All rights reserved.
///@file mb85rc64.h
///@brief mb85rc64驱动程序
///
///@details
///@note
///@author lqc
///@date 2022/05/26
///
///@version v1.0 2022/05/26 初始版本
#ifndef __MB85RC64_H_
#define __MB85RC64_H_
#include "gd32f4xx_gpio.h"
#define MB85RC64_ADDRESS_WRITE 0xA0
#define MB85RC64_ADDRESS_READ 0xA1
#define MB85RC64_SCL_HIGH gpio_bit_set(GPIOB, GPIO_PIN_6)
#define MB85RC64_SCL_LOW gpio_bit_reset(GPIOB, GPIO_PIN_6)
#define MB85RC64_SDA_HIGH gpio_bit_set(GPIOB, GPIO_PIN_7)
#define MB85RC64_SDA_LOW gpio_bit_reset(GPIOB, GPIO_PIN_7)
#define MB85RC64_SDA_GET gpio_input_bit_get(GPIOB, GPIO_PIN_7)
//mb85rc64存储地址
#define MB85RC64_SAVE_ADDRESS_BEGIN 0x0000
void mb85rc64_gpio_init();
char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len);
char mb85rc64_add_read(unsigned short int addr, unsigned char *data, int data_len);
void mb85rc64_function_test();
void read_mb_id(uint8_t* buff);
#endif

View File

@ -17,7 +17,7 @@ GD32F4系列搭载了高性能的12位逐次逼近型SARADC提供了非
* **工作原理**ADC完成一次转换序列后**立即自动重新启动**下一次转换,永不停止,连续不断地进行转换。
* **触发方式**:通常由**一次软件或硬件触发**来启动这个连续的进程。
* **特点**一旦启动无需干预即可获得连续的数据流实时性高。但功耗相对较高因为ADC一直处于工作状态。通常需要与DMA配合使用。
* **特点**:一旦启动,无需干预即可获得连续的数据流,实时性高。但**功耗相对较高**因为ADC一直处于工作状态。通常需要与DMA配合使用。
* **代码逻辑**`启动 -> (自动循环转换) -> 不断读取数据`
#### 3. 扫描模式 (Scan Mode)
@ -184,7 +184,6 @@ C1 -->|读取注入组<br>有专用寄存器| A2
三者协同工作,共同构成了一个高效、可靠且响应及时的数据采集系统。
在GD32微控制器的ADC驱动库中`adc_routine_channel_config`函数用于配置规则组(常规序列)的通道序列。
### 🧾 函数原型
@ -216,11 +215,9 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann
### 💡 总结
可以这样理解:
可以这样理解:
* **`rank`(第二个参数)是“排队号”**:决定通道转换的**顺序**。
* **`channel`(第三个参数)是“身份证”**:确定转换的**具体是哪个物理通道**。
函数的作用就是将特定的物理通道(`channel`)安排到规则组转换序列中的指定位置(`rank`)上。
希望这些信息能帮助你更好地理解和使用GD32的ADC功能

View File

@ -23,6 +23,8 @@
#include <rtdef.h>
#include <rtservice.h>
#include <rtm.h>
#include "gd32f4xx_gpio.h"
#ifdef __cplusplus
extern "C" {
@ -138,6 +140,7 @@ rt_err_t rt_thread_delete(rt_thread_t thread);
rt_err_t rt_thread_yield(void);
rt_err_t rt_thread_delay(rt_tick_t tick);
rt_err_t rt_thread_mdelay(rt_int32_t ms);
void rt_thread_udelay(int us);
rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg);
rt_err_t rt_thread_suspend(rt_thread_t thread);
rt_err_t rt_thread_resume(rt_thread_t thread);

View File

@ -551,6 +551,22 @@ rt_err_t rt_thread_mdelay(rt_int32_t ms)
}
RTM_EXPORT(rt_thread_mdelay);
void rt_thread_udelay(int us)
{
rt_uint32_t start, now, delta, reload, us_tick;
start = SysTick->VAL;
reload = SysTick->LOAD;
us_tick = SystemCoreClock / 1000000UL;
do
{
now = SysTick->VAL;
delta = start > now ? start - now : reload + start - now;
} while (delta < us_tick * us);
}
/**
* This function will control thread behaviors according to control command.
*