条件编译DMA内容
This commit is contained in:
parent
fb0726f7e9
commit
cfb40c80bf
|
@ -13,6 +13,7 @@
|
||||||
"rthw.h": "c",
|
"rthw.h": "c",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -41,13 +41,15 @@ OF SUCH DAMAGE.
|
||||||
#include "tmp75.h"
|
#include "tmp75.h"
|
||||||
#include "drv_usart.h"
|
#include "drv_usart.h"
|
||||||
|
|
||||||
|
|
||||||
float voltage;
|
float voltage;
|
||||||
float current;
|
float current;
|
||||||
float current_origin;
|
float current_origin;
|
||||||
float adc_value;
|
float adc_value;
|
||||||
float tmp;
|
|
||||||
char tiedian_id[3]={0};
|
char tiedian_id[3]={0};
|
||||||
|
uint32_t ctl_data = 0;
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t primask;
|
||||||
|
|
||||||
uint16_t tmp_value = 0;
|
uint16_t tmp_value = 0;
|
||||||
|
|
||||||
|
@ -60,10 +62,13 @@ typedef struct _MB85TEST_
|
||||||
{
|
{
|
||||||
char ttt;
|
char ttt;
|
||||||
float ggg;
|
float ggg;
|
||||||
|
float tmperature;
|
||||||
|
uint8_t status;
|
||||||
}MB85TEST;
|
}MB85TEST;
|
||||||
|
|
||||||
MB85TEST ttest;
|
MB85TEST ttest;
|
||||||
|
|
||||||
|
|
||||||
#define MB85TEST_ADD 0x0400
|
#define MB85TEST_ADD 0x0400
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -78,17 +83,19 @@ int main(void)
|
||||||
|
|
||||||
// 其他应用程序初始化代码...
|
// 其他应用程序初始化代码...
|
||||||
|
|
||||||
|
__enable_irq();
|
||||||
gd32_usart_init();
|
gd32_usart_init();
|
||||||
|
|
||||||
adc_init();
|
adc_init();
|
||||||
temp75_gpio_init();
|
temp75_gpio_init();
|
||||||
|
|
||||||
|
|
||||||
//测试mb铁电读写
|
//测试mb铁电读写
|
||||||
memset(&ttest, 0, sizeof(ttest));
|
memset(&ttest, 0, sizeof(ttest));
|
||||||
// mb85rc64_page_write();
|
// mb85rc64_page_write();
|
||||||
mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
|
mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
|
||||||
|
ttest.status = 0;
|
||||||
ttest.ttt += 3;
|
ttest.ttt++;
|
||||||
if (ttest.ggg >= 1000)
|
if (ttest.ggg >= 1000)
|
||||||
{
|
{
|
||||||
ttest.ggg -= 2;
|
ttest.ggg -= 2;
|
||||||
|
@ -105,6 +112,21 @@ 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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__asm volatile("mrs %0, primask" : "=r"(primask));
|
||||||
|
|
||||||
if(SET == g_ADCDataReady)
|
if(SET == g_ADCDataReady)
|
||||||
{
|
{
|
||||||
|
@ -122,18 +144,13 @@ int main(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rt_thread_mdelay(250);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
voltage = ptz_Voltage_collect_adc1_task();
|
||||||
|
rt_thread_mdelay(500);
|
||||||
|
current = ptz_Current_collect_adc1_task();
|
||||||
rt_thread_mdelay(500);
|
rt_thread_mdelay(500);
|
||||||
|
|
||||||
|
|
||||||
// voltage = ptz_Voltage_collect_adc1_task();
|
|
||||||
|
|
||||||
// rt_thread_mdelay(250);
|
|
||||||
|
|
||||||
// current = ptz_Current_collect_adc1_task();
|
|
||||||
|
|
||||||
// rt_thread_mdelay(250);
|
|
||||||
|
|
||||||
tmp = ptz_temperature_collect_tmp75_task();
|
|
||||||
|
|
||||||
//测试mb铁电读写
|
//测试mb铁电读写
|
||||||
read_mb_id((uint8_t*)&tiedian_id);//读取铁电ID
|
read_mb_id((uint8_t*)&tiedian_id);//读取铁电ID
|
||||||
|
@ -141,25 +158,47 @@ int main(void)
|
||||||
memset(&ttest, 0, sizeof(ttest));
|
memset(&ttest, 0, sizeof(ttest));
|
||||||
// mb85rc64_page_write();
|
// mb85rc64_page_write();
|
||||||
mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
|
mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
|
||||||
|
ttest.tmperature = ptz_temperature_collect_tmp75_task();
|
||||||
|
|
||||||
// usart_puts(ttest.ttt);
|
// usart_puts(ttest.ttt);
|
||||||
// 主循环代码...
|
// 主循环代码...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DMAX
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* 函数名 : DMA_ADCIRQHandlerCallback
|
* 函数名 : DMA1_Channel0_IRQHandler
|
||||||
* 功能说明: DMA_ADC中断服务回调函数
|
* 功能说明: DMA_ADC中断服务回调函数
|
||||||
* 形 参 : 无
|
* 形 参 : 无
|
||||||
* 返回值 : 无
|
* 返回值 : 无
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
*/
|
*/
|
||||||
void DMA_ADCIRQHandlerCallback(void)
|
void DMA1_Channel0_IRQHandler(void)
|
||||||
{
|
{
|
||||||
if(SET == dma_interrupt_flag_get(DMA1,USER_DMA_ADC_CHANNEL,DMA_INTC_FTFIFC))
|
if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FTF)) {
|
||||||
{
|
dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FTF);
|
||||||
dma_interrupt_flag_clear(DMA1,USER_DMA_ADC_CHANNEL,DMA_INTC_FTFIFC);
|
ttest.status = 1;
|
||||||
dma_channel_disable(DMA1, USER_DMA_ADC_CHANNEL);
|
// 处理传输完成
|
||||||
g_ADCDataReady = SET;
|
}
|
||||||
|
|
||||||
|
if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_HTF)) {
|
||||||
|
dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_HTF);
|
||||||
|
ttest.status = 2;
|
||||||
|
// 处理半传输完成(如果使能了)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FEE)) {
|
||||||
|
dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FEE);
|
||||||
|
ttest.status = 3;
|
||||||
|
// 处理错误
|
||||||
|
}
|
||||||
|
if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_TAE)) {
|
||||||
|
dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_TAE);
|
||||||
|
ttest.status = 6;
|
||||||
|
// 处理错误
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
Binary file not shown.
|
@ -15,27 +15,46 @@
|
||||||
|
|
||||||
/*全局声明区*/
|
/*全局声明区*/
|
||||||
uint16_t USER_ADC_DMA_DATA_BUFF[16] = {0};
|
uint16_t USER_ADC_DMA_DATA_BUFF[16] = {0};
|
||||||
|
uint32_t ctl = 0;
|
||||||
|
|
||||||
|
|
||||||
void adc_init(void)
|
void adc_init(void)
|
||||||
{
|
{
|
||||||
adc_rcu_config();
|
adc_rcu_config();
|
||||||
adc_gpio_config();
|
adc_gpio_config();
|
||||||
|
|
||||||
|
#ifdef DMAX
|
||||||
adc_dma_config();
|
adc_dma_config();
|
||||||
|
#endif
|
||||||
|
|
||||||
adc_config();
|
adc_config();
|
||||||
|
|
||||||
|
#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)
|
||||||
{
|
{
|
||||||
/* 启用ADC1时钟 */
|
/* 启用ADC1时钟 */
|
||||||
rcu_periph_clock_enable(RCU_ADC1);
|
rcu_periph_clock_enable(RCU_ADC1);
|
||||||
|
#ifdef DMAX
|
||||||
/* peripheral clock enable */
|
/* peripheral clock enable */
|
||||||
rcu_periph_clock_enable(RCU_DMA1);//ADC只能用DMA1
|
rcu_periph_clock_enable(RCU_DMA1);//ADC只能用DMA1
|
||||||
|
#endif
|
||||||
/* 启用GPIOC时钟 */
|
/* 启用GPIOC时钟 */
|
||||||
rcu_periph_clock_enable(RCU_GPIOC);
|
rcu_periph_clock_enable(RCU_GPIOC);
|
||||||
|
|
||||||
adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
|
adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,79 +65,44 @@ void adc_gpio_config(void)
|
||||||
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, CURRENT_ADC_PIN);
|
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, CURRENT_ADC_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DMAX
|
||||||
|
|
||||||
/* DMA配置 */
|
/* DMA配置 */
|
||||||
static void adc_dma_config(void)
|
void adc_dma_config(void)
|
||||||
{
|
{
|
||||||
/* ADC_DMA_channel configuration */
|
/* ADC_DMA_channel configuration */
|
||||||
dma_single_data_parameter_struct dma_single_data_parameter; //这里使用单数据模式,每次只传输一个数据单元,因为总数据量不大,且数据个数不固定
|
dma_single_data_parameter_struct dma_single_data_parameter; //这里使用单数据模式,每次只传输一个数据单元,因为总数据量不大,且数据个数不固定
|
||||||
|
|
||||||
/* ADC DMA_channel configuration */
|
/* ADC DMA_channel configuration */
|
||||||
dma_deinit(DMA1, USER_DMA_ADC_CHANNEL);
|
dma_deinit (DMA1, USER_DMA_ADC_CHANNEL);
|
||||||
|
|
||||||
/* initialize DMA single data mode */
|
/* initialize DMA single data mode */
|
||||||
dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADCX));//配置外设数据源地址,宏决定ADCx
|
dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADCX)); //配置外设数据源地址,宏决定ADCx
|
||||||
dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;//关闭外设增量,只需要每次对该数据源寄存器访问
|
dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; //关闭外设增量,只需要每次对该数据源寄存器访问
|
||||||
|
dma_single_data_parameter.memory0_addr = (uint32_t)USER_ADC_DMA_DATA_BUFF; //先写死,然后外部用的话需要extern
|
||||||
dma_single_data_parameter.memory0_addr = (uint32_t)USER_ADC_DMA_DATA_BUFF;//先写死,然后外部用的话需要extern
|
dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; //开启内存增量,以存放不同通道的ADC数据
|
||||||
dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;//开启内存增量,以存放不同通道的ADC数据
|
dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT; //ADC数据为16位的寄存器,数据目的地为16位
|
||||||
|
dma_single_data_parameter.circular_mode = DMA_CIRCULAR_MODE_ENABLE; //循环模式,由ADC通知DMA进行
|
||||||
dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;//ADC数据为16位的寄存器,数据目的地为16位
|
dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY; //ADC外设到RAM全局变量 DMA外设到内存模式开启
|
||||||
|
dma_single_data_parameter.number = CHANNEL_LENGTH; //宏决定传输个数
|
||||||
dma_single_data_parameter.circular_mode = DMA_CIRCULAR_MODE_ENABLE;//循环模式,由ADC通知DMA进行
|
dma_single_data_parameter.priority = DMA_PRIORITY_ULTRA_HIGH; //优先级设为超高,可改用宏
|
||||||
/* DMA外设到内存模式不开启 */
|
dma_single_data_mode_init (DMA1, USER_DMA_ADC_CHANNEL, &dma_single_data_parameter);
|
||||||
dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;//ADC外设到RAM全局变量
|
|
||||||
dma_single_data_parameter.number = CHANNEL_LENGTH;//宏决定传输个数
|
|
||||||
dma_single_data_parameter.priority = DMA_PRIORITY_ULTRA_HIGH;//优先级设为超高,可改用宏
|
|
||||||
dma_single_data_mode_init(DMA1, 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 (DMA1, 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 (DMA1, USER_DMA_ADC_CHANNEL);// 开启循环模式
|
||||||
|
|
||||||
/* enable DMA channel */
|
|
||||||
dma_channel_enable(DMA1, 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 (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FTF);//DMA传输完成标志位 打开全部完成中断
|
||||||
nvic_irq_enable(DMA_ADC_IRQn, DMA_ADC_PRIORITY_PRE, DMA_ADC_PRIORITY_SUB);
|
dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_TAE);
|
||||||
|
dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FEE);
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void adc_config(void)
|
|
||||||
{
|
|
||||||
adc_deinit();// 复位ADC配置(可选,但建议初始化时做一次)
|
|
||||||
|
|
||||||
adc_special_function_config(ADCX, ADC_SCAN_MODE, SCAN_STATUS);// 打开扫描模式
|
|
||||||
adc_special_function_config(ADCX, ADC_CONTINUOUS_MODE, CONTINUOUS_STATUS);// 禁止连续模式 -> 单次转换模式
|
|
||||||
|
|
||||||
adc_data_alignment_config(ADCX, ADC_DATAALIGN_RIGHT);// 配置数据对齐方式为右对齐
|
|
||||||
adc_resolution_config(ADCX, ADC_RESOLUTION_12B);// 配置ADC分辨率:12位
|
|
||||||
|
|
||||||
/* 设置转换通道序列 */
|
|
||||||
adc_channel_length_config(ADCX, SEQUENCE_CHANNEL, CHANNEL_LENGTH);// 配置规则序列的长度:2个通道
|
|
||||||
|
|
||||||
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_external_trigger_source_config(ADCX, SEQUENCE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0);
|
|
||||||
adc_external_trigger_config(ADCX, SEQUENCE_CHANNEL, DISABLE);
|
|
||||||
|
|
||||||
/* ADC dma config */
|
|
||||||
adc_dma_request_after_last_enable(ADCX);
|
|
||||||
adc_dma_mode_enable(ADCX);
|
|
||||||
|
|
||||||
adc_enable(ADCX);// 开启ADC
|
|
||||||
rt_thread_mdelay(50);// 等待ADC稳定后续接校准
|
|
||||||
adc_calibration_enable(ADCX);// 执行ADC自校准
|
|
||||||
|
|
||||||
adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 根据转换序列的序列号,获取转换序列中的ADC测量值
|
* @brief 根据转换序列的序列号,获取转换序列中的ADC测量值
|
||||||
* @param 配置ADC通道结构体中的成员序号
|
* @param 配置ADC通道结构体中的成员序号
|
||||||
|
@ -130,6 +114,56 @@ uint16_t BSP_ADCDataAcquire(uint8_t _index)
|
||||||
return USER_ADC_DMA_DATA_BUFF[_index];
|
return USER_ADC_DMA_DATA_BUFF[_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*****************************************************************************
|
||||||
|
* 函数名 : DMA1_Channel0_IRQHandler
|
||||||
|
* 功能说明: DMA_ADC中断服务回调函数
|
||||||
|
* 形 参 : 无
|
||||||
|
* 返回值 : 无
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
__weak void DMA1_Channel0_IRQHandler(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void adc_config(void)
|
||||||
|
{
|
||||||
|
adc_deinit();// 复位ADC配置(可选,但建议初始化时做一次)
|
||||||
|
|
||||||
|
adc_special_function_config (ADCX, ADC_SCAN_MODE, SCAN_STATUS);// 扫描模式
|
||||||
|
adc_special_function_config (ADCX, ADC_CONTINUOUS_MODE, CONTINUOUS_STATUS);// 连续模式
|
||||||
|
|
||||||
|
adc_data_alignment_config (ADCX, ADC_DATAALIGN_RIGHT);// 配置数据对齐方式为右对齐
|
||||||
|
adc_resolution_config (ADCX, ADC_RESOLUTION_12B);// 配置ADC分辨率:12位
|
||||||
|
|
||||||
|
/* 设置转换通道序列 */
|
||||||
|
adc_channel_length_config (ADCX, SEQUENCE_CHANNEL, CHANNEL_LENGTH);// 配置规则序列的长度:2个通道
|
||||||
|
|
||||||
|
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_external_trigger_source_config(ADCX, SEQUENCE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0);
|
||||||
|
adc_external_trigger_config (ADCX, SEQUENCE_CHANNEL, DISABLE);
|
||||||
|
|
||||||
|
#ifdef DMAX
|
||||||
|
/* ADC dma config */
|
||||||
|
adc_dma_request_after_last_enable (ADCX);
|
||||||
|
adc_dma_mode_enable (ADCX);
|
||||||
|
#endif
|
||||||
|
adc_enable (ADCX); // 开启ADC
|
||||||
|
rt_thread_mdelay(50); // 等待ADC稳定后续接校准
|
||||||
|
adc_calibration_enable (ADCX); // 执行ADC自校准
|
||||||
|
|
||||||
|
#ifdef DMAX
|
||||||
|
adc_software_trigger_enable (ADCX, SEQUENCE_CHANNEL); // 软件触发使能 后续接读取
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
@ -170,11 +204,11 @@ float ptz_Voltage_collect_adc1_task()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(uint8_t i = 1; i < LB_V_TIMES - 1; i++)
|
for(uint8_t i = LB_V_DEL; i < LB_V_TIMES - LB_V_DEL; i++)
|
||||||
{
|
{
|
||||||
curadc1 = curadc1 + adc1_v[i];
|
curadc1 = curadc1 + adc1_v[i];
|
||||||
}
|
}
|
||||||
curadc1 = curadc1 /((float)(LB_V_TIMES - 2));// 去掉一个最大值和一个最小值求平均值
|
curadc1 = curadc1 /((float)(LB_V_TIMES - LB_V_DEL * 2));// 去掉一个最大值和一个最小值求平均值
|
||||||
// g_ptz.Voltage = curadc1;
|
// g_ptz.Voltage = curadc1;
|
||||||
memset(adc1_v, 0, sizeof(adc1_v));// adc1_v 快速清零
|
memset(adc1_v, 0, sizeof(adc1_v));// adc1_v 快速清零
|
||||||
curadc1_out_v = curadc1;
|
curadc1_out_v = curadc1;
|
||||||
|
@ -220,16 +254,15 @@ float ptz_Current_collect_adc1_task()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(uint8_t i = 1; i < LB_I_TIMES - 1; i++)
|
for(uint8_t i = LB_I_DEL; i < LB_I_TIMES - LB_I_DEL; i++)
|
||||||
{
|
{
|
||||||
curadc1 = curadc1 + adc1_i[i];
|
curadc1 = curadc1 + adc1_i[i];
|
||||||
}
|
}
|
||||||
curadc1 = curadc1 /((float)(LB_I_TIMES - 2));//去掉一个最大值和一个最小值求平均值
|
curadc1 = curadc1 /((float)(LB_I_TIMES - LB_I_DEL * 2));//去掉一个最大值和一个最小值求平均值
|
||||||
// g_ptz.Voltage = curadc1;
|
// g_ptz.Voltage = curadc1;
|
||||||
memset(adc1_i, 0, sizeof(adc1_i));//adc1_i 快速清零
|
memset(adc1_i, 0, sizeof(adc1_i));//adc1_i 快速清零
|
||||||
curadc1_out_i = curadc1;
|
curadc1_out_i = curadc1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return curadc1_out_i;
|
return curadc1_out_i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include "gd32f4xx.h"
|
#include "gd32f4xx.h"
|
||||||
#include "gd32f4xx_adc.h"
|
#include "gd32f4xx_adc.h"
|
||||||
#include "gd32f4xx_dma.h"
|
#include "gd32f4xx_dma.h"
|
||||||
#include "rtthread.h"
|
// #include "rtthread.h"
|
||||||
|
|
||||||
/* 自定义宏,方便修改通道和引脚 */
|
/* 自定义宏,方便修改通道和引脚 */
|
||||||
#define ADCX ADC1
|
#define ADCX ADC1
|
||||||
|
@ -19,6 +19,8 @@
|
||||||
#define LB_V_TIMES 7 //电压采样滤波次数
|
#define LB_V_TIMES 7 //电压采样滤波次数
|
||||||
#define LB_I_TIMES 12 //电流采样滤波次数
|
#define LB_I_TIMES 12 //电流采样滤波次数
|
||||||
#define LB_T_TIMES 7 //温度采样滤波次数
|
#define LB_T_TIMES 7 //温度采样滤波次数
|
||||||
|
#define LB_V_DEL 1 //电压滤波最高最低各删除个数
|
||||||
|
#define LB_I_DEL 2 //电流滤波最高最低各删除个数
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
@ -26,21 +28,24 @@ adc模式配置参数
|
||||||
ENABLE
|
ENABLE
|
||||||
DISABLE
|
DISABLE
|
||||||
*/
|
*/
|
||||||
#define CONTINUOUS_STATUS ENABLE// 是否开启连续转换
|
#define CONTINUOUS_STATUS DISABLE // 是否开启连续转换
|
||||||
#define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL// 注入组还是规则组
|
#define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 注入组还是规则组
|
||||||
#define SCAN_STATUS ENABLE// 是否开启扫描模式
|
#define SCAN_STATUS DISABLE // 是否开启扫描模式
|
||||||
#define DMA_STATUS ENABLE// 是否开启dma
|
#define CHANNEL_LENGTH 1 // 通道数量:1~16
|
||||||
#define CHANNEL_LENGTH 2// 通道数量:1~16
|
|
||||||
|
|
||||||
|
|
||||||
/* adc dma */
|
/* adc dma */
|
||||||
|
// #define DMAX DMA1
|
||||||
|
|
||||||
|
#ifdef DMAX
|
||||||
|
#define DMA_STATUS DISABLE // 是否开启dma
|
||||||
#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
|
||||||
|
|
||||||
#define USER_DMA_ADC_SUBPERI DMA_SUBPERI1 //DMA外设源:ADC0:DMA_SUBPERI0
|
#define USER_DMA_ADC_SUBPERI DMA_SUBPERI1 //DMA外设源:ADC0:DMA_SUBPERI0
|
||||||
// ADC1:DMA_SUBPERI1
|
// ADC1:DMA_SUBPERI1
|
||||||
// ADC2:DMA_SUBPERI2
|
// ADC2:DMA_SUBPERI2
|
||||||
|
|
||||||
#define DMA_ADC_IRQn DMA1_Channel0_IRQn //DMA1_Channel0_IRQn
|
#define DMA_ADC_IRQn DMA1_Channel0_IRQn //DMA1_Channel0_IRQn
|
||||||
//DMA1_Channel1_IRQn
|
//DMA1_Channel1_IRQn
|
||||||
//DMA1_Channel2_IRQn
|
//DMA1_Channel2_IRQn
|
||||||
|
@ -49,6 +54,8 @@ adc模式配置参数
|
||||||
#define DMA_ADC_PRIORITY_PRE 0 //抢占优先级
|
#define DMA_ADC_PRIORITY_PRE 0 //抢占优先级
|
||||||
#define DMA_ADC_PRIORITY_SUB 1 //子优先级
|
#define DMA_ADC_PRIORITY_SUB 1 //子优先级
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void adc_init(void);
|
void adc_init(void);
|
||||||
void adc_rcu_config(void);
|
void adc_rcu_config(void);
|
||||||
void adc_gpio_config(void);
|
void adc_gpio_config(void);
|
||||||
|
@ -57,6 +64,8 @@ void adc_config(void);
|
||||||
float ptz_Voltage_collect_adc1_task();
|
float ptz_Voltage_collect_adc1_task();
|
||||||
float ptz_Current_collect_adc1_task();
|
float ptz_Current_collect_adc1_task();
|
||||||
float ptz_temperature_collect_tmp75_task();
|
float ptz_temperature_collect_tmp75_task();
|
||||||
|
__weak void DMA1_Channel0_IRQHandler(void);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
*/
|
*/
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <rthw.h>
|
#include <rthw.h>
|
||||||
#include <rtthread.h>
|
// #include <rtthread.h>
|
||||||
#include "drv_usart.h"
|
#include "drv_usart.h"
|
||||||
#include <gd32f4xx.h>
|
#include <gd32f4xx.h>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue