Compare commits

...

5 Commits

12 changed files with 290 additions and 129 deletions

View File

@ -14,6 +14,7 @@
"delay_us.h": "c", "delay_us.h": "c",
"core_cm4.h": "c", "core_cm4.h": "c",
"gd32f4xx_usart.h": "c", "gd32f4xx_usart.h": "c",
"stdlib.h": "c" "stdlib.h": "c",
"gd32f4xx_gpio.h": "c"
} }
} }

View File

@ -357,9 +357,9 @@
<state>$PROJ_DIR$\..\rtthread</state> <state>$PROJ_DIR$\..\rtthread</state>
<state>$PROJ_DIR$\..\rtthread\include\libc</state> <state>$PROJ_DIR$\..\rtthread\include\libc</state>
<state>$PROJ_DIR$\..\rtthread\include</state> <state>$PROJ_DIR$\..\rtthread\include</state>
<state>D:\newPtz\drivers</state> <state>C:\Users\Administrator\Documents\newPtz\drivers\mb85rc64</state>
<state>D:\newPtz\drivers\mb85rc64</state> <state>C:\Users\Administrator\Documents\newPtz\drivers\tmp75</state>
<state>D:\newPtz\drivers\tmp75</state> <state>C:\Users\Administrator\Documents\newPtz\drivers</state>
</option> </option>
<option> <option>
<name>CCStdIncCheck</name> <name>CCStdIncCheck</name>
@ -772,11 +772,11 @@
</option> </option>
<option> <option>
<name>IlinkIcfOverride</name> <name>IlinkIcfOverride</name>
<state>0</state> <state>1</state>
</option> </option>
<option> <option>
<name>IlinkIcfFile</name> <name>IlinkIcfFile</name>
<state>$TOOLKIT_DIR$/config/linker/GigaDevice/GD32F470xE.icf</state> <state>C:\Users\Administrator\Documents\newPtz\EWARM\iar\GD32F450xE.icf</state>
</option> </option>
<option> <option>
<name>IlinkIcfFileSlave</name> <name>IlinkIcfFileSlave</name>
@ -2230,6 +2230,12 @@
<file> <file>
<name>$PROJ_DIR$\..\drivers\drv_adc.h</name> <name>$PROJ_DIR$\..\drivers\drv_adc.h</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\drivers\drv_usart.c</name> <name>$PROJ_DIR$\..\drivers\drv_usart.c</name>
</file> </file>

View File

@ -2901,6 +2901,12 @@
<file> <file>
<name>$PROJ_DIR$\..\drivers\drv_adc.h</name> <name>$PROJ_DIR$\..\drivers\drv_adc.h</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\drivers\drv_usart.c</name> <name>$PROJ_DIR$\..\drivers\drv_usart.c</name>
</file> </file>

View File

@ -761,10 +761,10 @@ void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t fla
\retval none \retval none
*/ */
void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source) void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source)
{ {//DMA_CHXFCTL_FEEIE 7
if(DMA_CHXFCTL_FEEIE != source) { if(DMA_CHXFCTL_FEEIE != source) {//不是7
DMA_CHCTL(dma_periph, channelx) |= source; DMA_CHCTL(dma_periph, channelx) |= source;
} else { } else {//是7
DMA_CHFCTL(dma_periph, channelx) |= source; DMA_CHFCTL(dma_periph, channelx) |= source;
} }
} }

View File

@ -46,9 +46,6 @@ float current;
float current_origin; float current_origin;
char tiedian_id[3]={0}; char tiedian_id[3]={0};
#ifdef MDAX
uint32_t ctl_data = 0;
#endif
uint32_t primask; uint32_t primask;
@ -56,9 +53,6 @@ uint16_t tmp_value = 0;
extern uint16_t USER_ADC_DMA_DATA_BUFF;//bsp_adc.c中定义的ADC数据接收数组 extern uint16_t USER_ADC_DMA_DATA_BUFF;//bsp_adc.c中定义的ADC数据接收数组
uint8_t g_ADCDataReady=0;//DMA传输完成ADC数据标志位
typedef struct _MB85TEST_ typedef struct _MB85TEST_
{ {
char ttt; char ttt;
@ -113,42 +107,8 @@ int main(void)
// 进入主循环或启动其他任务 // 进入主循环或启动其他任务
while (1) while (1)
{ {
#ifdef DMAX
ctl_data = DMA_CHCTL(DMAX, USER_DMA_ADC_CHANNEL);
if (ctl_data == 33762576)
{
// dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);
ttest.status = 5;
}
else if (ctl_data == 33762577)
{
ttest.status = 4;
} #if (defined ADC_MODE_0) || (defined ADC_MODE_1) || (defined ADC_MODE_3)
__asm volatile("mrs %0, primask" : "=r"(primask));
if(SET == g_ADCDataReady)
{
g_ADCDataReady = RESET;
for(uint8_t i=0; i<CHANNEL_LENGTH; i++)
{
tmp_value = BSP_ADCDataAcquire(i);
if (i == 0)
{
voltage = tmp_value/ 4095.0 * 3.3;
}
else
{
current = tmp_value/ 4095.0 * 3.3;
}
}
}
rt_thread_mdelay(250);
#endif
#ifndef ADC_MODE_2
voltage = ptz_Voltage_collect_adc1_task(); voltage = ptz_Voltage_collect_adc1_task();
rt_thread_mdelay(500); rt_thread_mdelay(500);
@ -159,6 +119,7 @@ int main(void)
#ifdef ADC_MODE_2 #ifdef ADC_MODE_2
adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取 adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取
#endif #endif
//测试mb铁电读写 //测试mb铁电读写
read_mb_id((uint8_t*)&tiedian_id);//读取铁电ID read_mb_id((uint8_t*)&tiedian_id);//读取铁电ID
@ -172,7 +133,7 @@ int main(void)
} }
} }
#ifdef DMAX #ifdef ADC_MODE_3
/* /*
***************************************************************************** *****************************************************************************
@ -210,7 +171,6 @@ void DMA1_Channel0_IRQHandler(void)
#endif #endif
#ifdef ADCX_IRQn #ifdef ADCX_IRQn
void ADC_IRQHandler() void ADC_IRQHandler()
{ {

Binary file not shown.

View File

@ -15,11 +15,26 @@
#ifdef DMAX #ifdef DMAX
/*全局声明区*/ /*全局声明区*/
uint16_t USER_ADC_DMA_DATA_BUFF[16] = {0}; uint16_t USER_ADC_DMA_DATA_BUFF[16] = {0};
uint32_t ctl = 0;
#endif #endif
float adc1_v[LB_V_TIMES];
float curadc1_out_v;
uint8_t adc1_v_num = 0;
float adc1_i[LB_I_TIMES];
float curadc1_out_i;
uint8_t adc1_i_num = 0;
float tmp75[LB_T_TIMES];
float curtmp75_out;
uint8_t tmp75_num;
bool filter_v_flag = 0;//滤波开启标志位,全局改变一次 bool filter_v_flag = 0;//滤波开启标志位,全局改变一次
bool filter_i_flag = 0;//滤波开启标志位,全局改变一次 bool filter_i_flag = 0;//滤波开启标志位,全局改变一次
bool filter_t_flag = 0;//滤波开启标志位,全局改变一次 bool filter_t_flag = 0;//滤波开启标志位,全局改变一次
@ -43,20 +58,6 @@ void adc_init(void)
adc_interrupt_int(); adc_interrupt_int();
#endif #endif
#ifdef DMAX
ctl = DMA_CHCTL(DMAX, USER_DMA_ADC_CHANNEL);
if (ctl == 33762576)
{
// dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);
// ttest.status = 5;
dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);// enable DMA channel
}
else if (ctl == 33762577)
{
// ttest.status = 4;
}
#endif
} }
/* 时钟+GPIO */ /* 时钟+GPIO */
void adc_rcu_config(void) void adc_rcu_config(void)
@ -100,20 +101,20 @@ void adc_dma_config(void)
dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY; //ADC外设到RAM全局变量 DMA外设到内存模式开启 dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY; //ADC外设到RAM全局变量 DMA外设到内存模式开启
dma_single_data_parameter.number = CHANNEL_LENGTH; //宏决定传输个数 dma_single_data_parameter.number = CHANNEL_LENGTH; //宏决定传输个数
dma_single_data_parameter.priority = DMA_PRIORITY_ULTRA_HIGH; //优先级设为超高,可改用宏 dma_single_data_parameter.priority = DMA_PRIORITY_ULTRA_HIGH; //优先级设为超高,可改用宏
dma_single_data_mode_init (DMA1, USER_DMA_ADC_CHANNEL, &dma_single_data_parameter); dma_single_data_mode_init (DMAX, USER_DMA_ADC_CHANNEL, &dma_single_data_parameter);
/* 配置 dma 子连接 */ /* 配置 dma 子连接 */
dma_channel_subperipheral_select (DMA1, USER_DMA_ADC_CHANNEL, USER_DMA_ADC_SUBPERI); dma_channel_subperipheral_select (DMAX, USER_DMA_ADC_CHANNEL, USER_DMA_ADC_SUBPERI);
/* enable DMA circulation mode */ /* enable DMA circulation mode */
dma_circulation_enable (DMA1, USER_DMA_ADC_CHANNEL);// 开启循环模式 dma_circulation_enable (DMAX, USER_DMA_ADC_CHANNEL);// 开启循环模式
/* enable DMA it */ /* enable DMA it */
dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FTF);//DMA传输完成标志位 打开全部完成中断 dma_interrupt_enable (DMAX,USER_DMA_ADC_CHANNEL,DMA_INT_FTF);//DMA传输完成标志位 打开全部完成中断 4
dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_TAE); // dma_interrupt_enable (DMAX,USER_DMA_ADC_CHANNEL,DMA_INT_TAE);//传输错误中断使能位 2
dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FEE); // dma_interrupt_enable (DMAX,USER_DMA_ADC_CHANNEL,DMA_INT_FEE);// 7
nvic_irq_enable (DMA_ADC_IRQn, DMA_ADC_PRIORITY_PRE, DMA_ADC_PRIORITY_SUB); nvic_irq_enable (DMA_ADC_IRQn, DMA_ADC_PRIORITY_PRE, DMA_ADC_PRIORITY_SUB);
dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);// enable DMA channel dma_channel_enable (DMAX, USER_DMA_ADC_CHANNEL);// enable DMA channel
} }
@ -163,7 +164,10 @@ void adc_config(void)
adc_inserted_channel_config (ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);//电压 adc_inserted_channel_config (ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);//电压
adc_inserted_channel_config (ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);//电流 adc_inserted_channel_config (ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);//电流
} }
#ifdef DMAX
adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);
adc_routine_channel_config(ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);
#endif
/* 使能外部触发:这里使用软件触发,所以先禁用硬件触发 */ /* 使能外部触发:这里使用软件触发,所以先禁用硬件触发 */
// adc_external_trigger_source_config(ADCX, SEQUENCE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0); // adc_external_trigger_source_config(ADCX, SEQUENCE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0);
@ -192,34 +196,41 @@ void adc_interrupt_int(void)
} }
#endif #endif
/* ---------------------------------------------------采集---------------------------------------------------- */ /* ---------------------------------------------------采集---------------------------------------------------- */
// adc电压采集 // adc电压采集
float ptz_Voltage_collect_adc1_task() float ptz_Voltage_collect_adc1_task()
{ {
static float adc1_v[LB_V_TIMES];
static float curadc1_out_v;
static uint8_t adc1_v_num = 0;
uint16_t value_V = 0; uint16_t value_V = 0;
if (SEQUENCE_CHANNEL == ADC_ROUTINE_CHANNEL) #ifdef ADC_MODE_0
{ /* 模式1需先配置 */
adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480); adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);
} #endif
#if (defined ADC_MODE_0) || (defined ADC_MODE_1)
/* 模式1 + 2 */
adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取 adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取
if (SEQUENCE_CHANNEL == ADC_ROUTINE_CHANNEL) #endif
{
#ifdef ADC_MODE_0
while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束 while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束
adc_flag_clear(ADCX, ADC_FLAG_EOC); adc_flag_clear(ADCX, ADC_FLAG_EOC);
value_V = adc_routine_data_read(ADCX); // 读取规则组数据寄存器 value_V = adc_routine_data_read(ADCX); // 读取规则组数据寄存器
} #endif
else if (SEQUENCE_CHANNEL == ADC_INSERTED_CHANNEL)
{ #ifdef ADC_MODE_1
while(adc_flag_get(ADCX, ADC_FLAG_EOIC) == RESET); // 等待转换结束 while(adc_flag_get(ADCX, ADC_FLAG_EOIC) == RESET); // 等待转换结束
adc_flag_clear(ADCX, ADC_FLAG_EOIC); adc_flag_clear(ADCX, ADC_FLAG_EOIC);
value_V = adc_inserted_data_read(ADCX, ADC_INSERTED_CHANNEL_0); // 读取注入组数据寄存器 value_V = adc_inserted_data_read(ADCX, ADC_INSERTED_CHANNEL_0); // 读取注入组数据寄存器
} #endif
#ifdef ADC_MODE_3
value_V = BSP_ADCDataAcquire(0);
#endif
/* 间接测量11倍分压/放大 */ /* 间接测量11倍分压/放大 */
adc1_v[adc1_v_num] = (float)value_V / 4095.0 * 3.3; adc1_v[adc1_v_num] = (float)value_V / 4095.0 * 3.3;
@ -230,7 +241,7 @@ float ptz_Voltage_collect_adc1_task()
filter_v_flag = 1; filter_v_flag = 1;
} }
if (filter_v_flag) if (filter_v_flag)//等读满一组开始滤波
{ {
return Filtering(adc1_v, LB_V_TIMES, LB_V_DEL); return Filtering(adc1_v, LB_V_TIMES, LB_V_DEL);
} }
@ -242,29 +253,33 @@ float ptz_Voltage_collect_adc1_task()
// adc电流采集 // adc电流采集
float ptz_Current_collect_adc1_task() float ptz_Current_collect_adc1_task()
{ {
static float adc1_i[LB_I_TIMES];
static float curadc1_out_i;
static uint8_t adc1_i_num = 0;
uint16_t value_I = 0; uint16_t value_I = 0;
if (SEQUENCE_CHANNEL == ADC_ROUTINE_CHANNEL)
{ #ifdef ADC_MODE_0
/* 模式1需先配置 */
adc_routine_channel_config(ADCX, 0, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480); adc_routine_channel_config(ADCX, 0, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);
} #endif
#if (defined ADC_MODE_0) || (defined ADC_MODE_1)
/* 模式1 + 2 */
adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取 adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取
#endif
if (SEQUENCE_CHANNEL == ADC_ROUTINE_CHANNEL) #ifdef ADC_MODE_0
{ while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束
while (adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束->等到SET
adc_flag_clear(ADCX, ADC_FLAG_EOC); adc_flag_clear(ADCX, ADC_FLAG_EOC);
value_I = adc_routine_data_read(ADCX); // 读取规则组数据寄存器 value_I = adc_routine_data_read(ADCX); // 读取规则组数据寄存器
} #endif
else if (SEQUENCE_CHANNEL == ADC_INSERTED_CHANNEL)
{ #ifdef ADC_MODE_1
while(adc_flag_get(ADCX, ADC_FLAG_EOIC) == RESET); // 等待转换结束 while(adc_flag_get(ADCX, ADC_FLAG_EOIC) == RESET); // 等待转换结束
adc_flag_clear(ADCX, ADC_FLAG_EOIC); adc_flag_clear(ADCX, ADC_FLAG_EOIC);
value_I = adc_inserted_data_read(ADCX, ADC_INSERTED_CHANNEL_1); // 读取注入组数据寄存器 value_I = adc_inserted_data_read(ADCX, ADC_INSERTED_CHANNEL_1); // 读取注入组数据寄存器
} #endif
#ifdef ADC_MODE_3
value_I = BSP_ADCDataAcquire(1);
#endif
/* 间接测量11倍分压/放大 */ /* 间接测量11倍分压/放大 */
adc1_i[adc1_i_num] = (((float)value_I / 4095.0 * 3.3) - 3.3 / 2) / 0.132; adc1_i[adc1_i_num] = (((float)value_I / 4095.0 * 3.3) - 3.3 / 2) / 0.132;
@ -284,13 +299,9 @@ float ptz_Current_collect_adc1_task()
} }
//温度采集 /* 温度采集 */
float ptz_temperature_collect_tmp75_task() float ptz_temperature_collect_tmp75_task()
{ {
static float tmp75[5];
static unsigned char tmp75_num;
static float curtmp75_out;
tmp75[tmp75_num] = tmp75_read_temp(); tmp75[tmp75_num] = tmp75_read_temp();
tmp75_num ++; tmp75_num ++;
@ -306,7 +317,7 @@ float ptz_temperature_collect_tmp75_task()
return 0; return 0;
} }
/* 滤波函数 */
float Filtering(float *filter, uint8_t filterlens, uint8_t filterdel) float Filtering(float *filter, uint8_t filterlens, uint8_t filterdel)
{ {
uint8_t j,k; uint8_t j,k;
@ -325,7 +336,6 @@ float Filtering(float *filter, uint8_t filterlens, uint8_t filterdel)
} }
} }
} }
for(uint8_t i = filterdel; i < filterlens - filterdel; i++) for(uint8_t i = filterdel; i < filterlens - filterdel; i++)
{ {
curadc = curadc + filter[i]; curadc = curadc + filter[i];

View File

@ -27,6 +27,7 @@
#define ADC_MODE_0 //规则组、单次转换、非扫描 #define ADC_MODE_0 //规则组、单次转换、非扫描
// #define ADC_MODE_1 //注入组、单次转换、扫描、转换结束标志位采集 // #define ADC_MODE_1 //注入组、单次转换、扫描、转换结束标志位采集
// #define ADC_MODE_2 //注入组、单次转换、扫描、中断转换结束标志位采集 // #define ADC_MODE_2 //注入组、单次转换、扫描、中断转换结束标志位采集
// #define ADC_MODE_3 //规则组、连续转换、扫描、DMA采集
/* /*
adc模式配置参数 adc模式配置参数
@ -34,36 +35,47 @@ adc模式配置参数
DISABLE DISABLE
*/ */
#ifdef ADC_MODE_0 #ifdef ADC_MODE_0
#define CONTINUOUS_STATUS DISABLE // 是否开启连续转换 #define CONTINUOUS_STATUS DISABLE // 是否开启连续转换
#define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 规则组 #define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 规则组
// #define SEQUENCE_CHANNEL ADC_INSERTED_CHANNEL // 注入组
#define SCAN_STATUS DISABLE // 是否开启扫描模式 #define SCAN_STATUS DISABLE // 是否开启扫描模式
#define CHANNEL_LENGTH 1 // 通道数量:1~16 #define CHANNEL_LENGTH 1 // 通道数量:1~16
#endif #endif
#ifdef ADC_MODE_1 #ifdef ADC_MODE_1
#define CONTINUOUS_STATUS DISABLE // 是否开启连续转换 #define CONTINUOUS_STATUS DISABLE // 是否开启连续转换
// #define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 规则组
#define SEQUENCE_CHANNEL ADC_INSERTED_CHANNEL // 注入组 #define SEQUENCE_CHANNEL ADC_INSERTED_CHANNEL // 注入组
#define SCAN_STATUS ENABLE // 是否开启扫描模式 #define SCAN_STATUS ENABLE // 是否开启扫描模式
#define CHANNEL_LENGTH 2 // 通道数量:1~16 #define CHANNEL_LENGTH 2 // 通道数量:1~16
#endif #endif
#ifdef ADC_MODE_2 #ifdef ADC_MODE_2
#define CONTINUOUS_STATUS DISABLE // 是否开启连续转换
// #define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 规则组 #define CONTINUOUS_STATUS DISABLE // 不开启连续转换
#define SEQUENCE_CHANNEL ADC_INSERTED_CHANNEL // 注入组 #define SEQUENCE_CHANNEL ADC_INSERTED_CHANNEL // 注入组
#define SCAN_STATUS ENABLE // 是否开启扫描模式 #define SCAN_STATUS ENABLE // 是否开启扫描模式
#define CHANNEL_LENGTH 2 // 通道数量:1~16 #define CHANNEL_LENGTH 2 // 通道数量:1~16
#define ADCX_IRQn ADC_IRQn #define ADCX_IRQn ADC_IRQn
#endif
#ifdef ADC_MODE_3
#define CONTINUOUS_STATUS ENABLE // 开启连续转换
#define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 规则组
#define SCAN_STATUS ENABLE // 是否开启扫描模式
#define CHANNEL_LENGTH 2 // 通道数量:1~16
#define DMAX DMA1
#endif #endif
/* adc dma */ /* adc dma */
// #define DMAX DMA1
#ifdef DMAX #ifdef DMAX
#define DMA_STATUS DISABLE // 是否开启dma *后续把这个定义改到#ifdef里*
#define USER_DMA_ADC_CHANNEL DMA_CH3 //DMA通道ADC0:DMA_CH0 DMA_CH4 #define USER_DMA_ADC_CHANNEL DMA_CH3 //DMA通道ADC0:DMA_CH0 DMA_CH4
// ADC1:DMA_CH2 DMA_CH3 // ADC1:DMA_CH2 DMA_CH3
// ADC2:DMA_CH0 DMA_CH3 // ADC2:DMA_CH0 DMA_CH3
@ -102,6 +114,7 @@ void adc_interrupt_int(void);
#ifdef DMAX #ifdef DMAX
void adc_dma_config(void); void adc_dma_config(void);
__weak void DMA1_Channel0_IRQHandler(void); __weak void DMA1_Channel0_IRQHandler(void);
uint16_t BSP_ADCDataAcquire(uint8_t _index);
#endif #endif
#endif #endif

121
drivers/drv_i2c.c Normal file
View File

@ -0,0 +1,121 @@
/*************************************************
Copyright (c) 2025,
All rights reserved.
@file drv_i2c.C
@brief drv_i2c驱动程序
@details
@note
@author dufresne
@date 2025/09/24
@version v1.0 2025/09/24
*************************************************/
#include "drv_i2c.h"
#include "rtthread.h"
#include <core_cm4.h>
/*
@ brief
@ param
@ return
@ note 2025-09-15
*/
static void delay_us(int us)
{
rt_thread_udelay(us);
}
void i2c_init(void)
{
i2c_gpio_config();
i2c_config();
}
/*
@ brief tmp75芯片GPIO引脚
@ param
@ return
@ note 2025-09-15
*/
void i2c_gpio_config(void)
{
// 配置引脚时钟
rcu_periph_clock_enable(RCU_GPIOB);
gpio_af_set(GPIOB, GPIO_AF_4, I2C_SCL_PIN | I2C_SDA_PIN);
/* 初始化GPIO复用功能模式 */
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SCL_PIN | I2C_SDA_PIN);
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN | I2C_SDA_PIN);
}
void i2c_config(void)
{
// 启用 I2C 外设的时钟
rcu_periph_clock_enable(RCU_I2C0);
// 配置 I2C 的时钟参数:
// I2C_PERIPH这里使用的I2C1
// I2C_SPEED通信速率单位为 Hz常用为 100000 或 400000这里使用100000
i2c_clock_config(I2C_PERIPH, I2C_SPEED, I2C_DTCY_2);
// 配置 I2C 工作模式和地址:
// I2C_ADDFORMAT_7BITS使用 7 位地址模式
// I2C_BUS_ADDRESSSD2068器件代码0110010 = 0x32
i2c_mode_addr_config(I2C_PERIPH, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C_BUS_ADDRESS);
// 启用 I2C 外设
i2c_enable(I2C_PERIPH);
// 使能 ACK 应答功能,确保在接收数据后自动发送 ACK
i2c_ack_config(I2C_PERIPH, I2C_ACK_ENABLE);
}
/*
@ brief
@ param
@ return
@ note 2025-09-15
*/
float tmp75_read_temp(void)
{
uint8_t tempH = 0;
uint8_t tempL = 0;
uint16_t tempCode = 0;
float temp = 0;
// 起始信号
i2c_start();
// 写tmp75地址
tmp75_write_byte(TMP75_ADDRESS);
// 接收tmp75的ack信息
tmp75_ack();
// 发送需读取数据的地址
tmp75_write_byte(TEMP_REGISTER_ADDRESS);
tmp75_ack();
i2c_start();
// 写tmp75地址
tmp75_write_byte(TMP75_ADDRESS + 1); // 读地址数据
tmp75_ack();
tempH = tmp75_read_byte();
master_ack();
tempL = tmp75_read_byte();
master_noack();
i2c_stop();
tempCode = (tempH << 8) | tempL;
tempCode = tempCode >> 6;
if (tempCode & 0x200) // 负温度
{
tempCode &= 0x1ff;
temp = ((float)tempCode - 512) / 4;
}
else
{
temp = (float)tempCode / 4;
}
TMP75_SDA_LOW;
TMP75_SCL_LOW;
return (temp);
}

41
drivers/drv_i2c.h Normal file
View File

@ -0,0 +1,41 @@
///Copyright (c) 2022, 四川汇源光通信有限公司
///All rights reserved.
///@file drv_i2c.h
///@brief drv_i2c驱动程序
///
///@details
///@note
///@author dufresne
///@date 2025/09/24
///
///@version v1.0 2025/09/24 初始版本
#ifndef DRV_I2C_H
#define DRV_I2C_H
#include "gd32f4xx_gpio.h"
#include "gd32f4xx_i2c.h"
#define I2C_PERIPH I2C0
#define I2C_SCL_PIN GPIO_PIN_6
#define I2C_SDA_PIN GPIO_PIN_7
#define I2C_SPEED 100000
// #define I2C_SCL_HIGH gpio_bit_set(GPIOB, I2C_SCL_PIN)
// #define I2C_SCL_LOW gpio_bit_reset(GPIOB, I2C_SCL_PIN)
// #define I2C_SDA_HIGH gpio_bit_set(GPIOB, I2C_SDA_PIN)
// #define I2C_SDA_LOW gpio_bit_reset(GPIOB, I2C_SDA_PIN)
// #define I2C_SDA_GET gpio_input_bit_get(GPIOB, I2C_SDA_PIN)
void i2c_init(void);
void i2c_gpio_config(void);
void i2c_config(void);
void temp75_gpio_init();
float tmp75_read_temp(void);
#endif

View File

@ -17,6 +17,9 @@
#define MB85RC64_ADDRESS_WRITE 0xA0 #define MB85RC64_ADDRESS_WRITE 0xA0
#define MB85RC64_ADDRESS_READ 0xA1 #define MB85RC64_ADDRESS_READ 0xA1
//mb85rc64湔揣華硊
#define MB85RC64_SAVE_ADDRESS_BEGIN 0x0000
#define MB85RC64_SCL_HIGH gpio_bit_set(GPIOB, GPIO_PIN_6) #define MB85RC64_SCL_HIGH gpio_bit_set(GPIOB, GPIO_PIN_6)
#define MB85RC64_SCL_LOW gpio_bit_reset(GPIOB, GPIO_PIN_6) #define MB85RC64_SCL_LOW gpio_bit_reset(GPIOB, GPIO_PIN_6)
@ -25,8 +28,6 @@
#define MB85RC64_SDA_LOW gpio_bit_reset(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) #define MB85RC64_SDA_GET gpio_input_bit_get(GPIOB, GPIO_PIN_7)
//mb85rc64湔揣華硊
#define MB85RC64_SAVE_ADDRESS_BEGIN 0x0000
void mb85rc64_gpio_init(); void mb85rc64_gpio_init();
char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len); char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len);

View File

@ -207,6 +207,7 @@ static void master_noack()
TMP75_SCL_LOW; TMP75_SCL_LOW;
delay_us(5); delay_us(5);
} }
/* /*
@ brief ÁÈ¡ÎÂÈÖµ @ brief ÁÈ¡ÎÂÈÖµ
@ param @ param
@ -239,6 +240,7 @@ float tmp75_read_temp(void)
tempL = tmp75_read_byte(); tempL = tmp75_read_byte();
master_noack(); master_noack();
i2c_stop(); i2c_stop();
tempCode = (tempH << 8) | tempL; tempCode = (tempH << 8) | tempL;
tempCode = tempCode >> 6; tempCode = tempCode >> 6;
if (tempCode & 0x200) // ¸ºÎÂ¶È if (tempCode & 0x200) // ¸ºÎ¶È