adc 使用教程6-使用外部中断IT11触发启动adc规则通道,使用外中断IT15触发注入组

  • ADC支持18个多路通道,可以把转换组织成两组:一个规则组通道和一个注入组通道
  • 规则组,可以按照特定的序列组织成多达16个转换的序列 ,
  • 注入组,可以按照特定的序列组织成多达4个转换的序列 ,数据保存在INDATAx(0-3)中

规则通道转换完成后产生dma请求,注入通道转换完成后产生adc中断

1.配置时钟和定义全局变量

#include "gd32f10x.h"
#include "stdio.h"
#include "bsp_adc.h"
#include "systick.h"
#include "gd32f103c_sys.h"#define LED0 PBout(13)
#define LED1 PBout(14)
#define LED2 PBout(15)
#define LED3 PAout(8)/*保存规则ADC值*/
uint32_t adc_value[4];
/*保存插入组ADC值*/
uint16_t inserted_data[4];
/*dma传输结束*/
uint32_t dma_finish;
/*dma传输结束*/
uint32_t inserted_finish;//   使能各种时钟和adc时钟分频输入
void rcu_config_adc(void)
{/*使能GPIO时钟 */rcu_periph_clock_enable(RCU_GPIOA);//rcu_periph_clock_enable(RCU_GPIOB);/* 使能ADC时钟*/rcu_periph_clock_enable(RCU_ADC0); /* enable DMA0 clock ADC 对应的DMA 就是DMA0*/rcu_periph_clock_enable(RCU_DMA0);//使能复用时钟rcu_periph_clock_enable(RCU_AF);/* 配置ADC时钟 ,ADC最大14MHz*/rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);
}

2.配置gpio

/*配置gpio
*/
void gpio_config_adc(void)
{/*配置gpio为模拟输入模式 */gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);/*配置gpio浮空模式-用于外部中断*/gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_15);}

3.配置外部中断

//配置外部中断
void exit_init(void)
{//设置指定中断线的优先级nvic_irq_enable(EXTI10_15_IRQn, 2U, 2U);/* 外部中断源选择为PA11 */gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_11);/* 配置中断事件位上升沿 */exti_init(EXTI_11, EXTI_INTERRUPT, EXTI_TRIG_RISING);//外部中断-这个会进入中断服务函数/* 选择中断源为PB15 */gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_15);/* 配置中断事件位上升沿 */exti_init(EXTI_15, EXTI_EVENT, EXTI_TRIG_RISING);//清除中断标记exti_interrupt_flag_clear(EXTI_11);exti_interrupt_flag_clear(EXTI_15);
}

4.定义外部中断服务函数

/*外部中断10-15的中断服务函数*/
void EXTI10_15_IRQHandler(void)
{//判定是否是外部中断线0if (RESET != exti_interrupt_flag_get(EXTI_11)) {LED0=!LED0;//清除中断标志exti_interrupt_flag_clear(EXTI_11);}else  if (RESET != exti_interrupt_flag_get(EXTI_15)) {LED3=!LED3;//清除中断标志exti_interrupt_flag_clear(EXTI_15);}
}

5.定义ADC中断函数

//ADC中断服务函数
void ADC0_1_IRQHandler(void)
{if(adc_interrupt_flag_get(ADC0, ADC_INT_FLAG_EOIC)){/* 清除中断标志*/adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);/* 读取 ADC 插入组ADC值 */inserted_data[0] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_0);inserted_data[1] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_1);inserted_data[2] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_2);inserted_data[3] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_3);inserted_finish=1;}
}

6.dma配置

/*!
dma配置
*/
void dma_config(void)
{/* ADC_DMA_channel configuration */dma_parameter_struct dma_data_parameter;/* 复位dma 通道0  */dma_deinit(DMA0, DMA_CH0);/* initialize DMA data mode */dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));//配置外设寄存器为adc的规则数据寄存器dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;//外设寄存器地址不增加dma_data_parameter.memory_addr  = (uint32_t)(&adc_value);//存放数据的内存地址dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;//存放数据的内存地址自增dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;//外设数据宽度32位 adc1[16-31]adc0[0-15]dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;  //内存数据宽度32位dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;//数据传输方式是外设到内存dma_data_parameter.number       = 4;//dma传输数量dma_data_parameter.priority     = DMA_PRIORITY_HIGH;//dma优先级高dma_init(DMA0, DMA_CH0, &dma_data_parameter);//循环模式开启dma_circulation_enable(DMA0, DMA_CH0);/******************************开启代码中断******************************///中断管理器开启通道4中断nvic_irq_enable(DMA0_Channel0_IRQn, 0, 1); /* dam 转换结束产生中断*/dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_FTF);/******************************开启代码中断******************************//* 使能dma通道0*/dma_channel_enable(DMA0, DMA_CH0);
}
/*dma中断处理函数
*/
void DMA0_Channel0_IRQHandler(void)
{if(dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF)){  //清除dma中断标记dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_G);dma_finish = SET;}
}

7.adc配置

//adc配置为独立模式下的外部中断事件或中断触发
void adc_config(void)
{/* 复位 ADC */adc_deinit(ADC0);/* ADC 工作在独立模式*/adc_mode_config(ADC_MODE_FREE);/* 连续模式开始 */adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);/* 数据右对齐*/adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);/* 注入通道配置的长度 */adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 4);/* ADC inserted channel config */adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);adc_inserted_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);adc_inserted_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5);adc_inserted_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5);/* ADC外部中断15触发转换 */adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_EXTI_15); /* ADC 外部触发使能*/adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);/* 清除adc中断标志 */adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC);adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);/* 使能ADC中断t */adc_interrupt_enable(ADC0, ADC_INT_EOIC);/* ADC 规则组的转换梳理为4*/adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 4);/* ADC regular channel config */adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5);adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_5, ADC_SAMPLETIME_55POINT5);adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_6, ADC_SAMPLETIME_55POINT5);adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_7, ADC_SAMPLETIME_55POINT5);/* 触发源是外部中断11 */adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_EXTI_11);adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);nvic_irq_enable(ADC0_1_IRQn, 1, 1);/* ADC DMA 使能*/adc_dma_mode_enable(ADC0);/* 使能ADC外设*/adc_enable(ADC0);delay_1ms(1);/* 标定复位ADC */adc_calibration_enable(ADC0);
}

8.测试函数

void adc_test()
{/* 时钟初始化 */rcu_config_adc();/* GPIO 配置 */gpio_config_adc();/* 配置外部中断 */exit_init();/* DMA 配置 */dma_config();/* ADC 配置 */adc_config();uint16_t *pdata = (uint16_t *)adc_value;while(1){delay_1ms(5);if(dma_finish){dma_finish = 0;printf("re %d %d %d %d \r\n", pdata[0], pdata[1], pdata[2], pdata[3]);}if(inserted_finish){inserted_finish = 0;printf("insert %d %d %d %d \r\n", inserted_data[0], inserted_data[1], inserted_data[2], inserted_data[3]);}}}

9.测试截图

20. GD32F103C8T6入门教程-adc使用外部中断IT11触发启动adc规则通道,使用外中断IT15触发注入组相关推荐

  1. 17. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据++dma中断通知

    adc 使用教程3-dma方式采集数据+dma中断通知 adc 的扫描模式就是把配置了规则或注入通道按照配置的顺序采集一轮 adc 的连续转换模式就是把配置了规则或注入通道按照配置的顺序采集N轮 1. ...

  2. 19. GD32F103C8T6入门教程-adc使用教程6-外部中断线11触发adc0

    adc 使用教程6-外部中断线11触发adc0 使用外部中断线11 触发ADC开始采集数据,PA11 gpio 1.初始化时钟和定义全局变量 /*保存ADC值*/ uint32_t adc_value ...

  3. 16. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据

    adc 使用教程2-dma+连续扫描方式采集数据 adc 的扫描模式就是把配置了规则或注入通道按照配置的顺序采集一轮 adc 的连续转换模式就是把配置了规则或注入通道按照配置的顺序采集N轮 1.时钟配 ...

  4. 15. GD32F103C8T6入门教程-adc单通道轮训采集

    1.adc gpio初始化 /*使能各种时钟和adc时钟分频输入*/ void rcu_config(void) {/*使能GPIO时钟 */rcu_periph_clock_enable(RCU_G ...

  5. 24. GD32F103C8T6入门教程-IAP升级教程

    GD32f103C8T6 IAP 升级教程 参考stm32的IAP升级原理 IAP测试源码 GD32和stm32的内核都是一样的,又因为IAP升级主要涉及升级的路径之和内核先关,所以gd32和stm3 ...

  6. 18. GD32F103C8T6入门教程-adc-使用教程5-定时器TIM2更新事件触发adc0

    adc 使用教程5-定时器TIM2更新事件触发adc0 但是本实验出现了一个异常,单片机大概路出现更新事件没有启动ADC转换,可是没有找到处理办法,但是定时器的是正常工作LED灯闪烁 1.使能各种时钟 ...

  7. FL studio 20简易入门教程 -- 第四篇 -- 钢琴卷帘窗口与单轨乐器编辑界面

    钢琴卷帘窗口与单轨乐器编辑界面 本文经验主要来自于B站爱编曲网官方正版快速入门教程,链接如下: 爱编曲网官方正版快速入门教程 文章目录 钢琴卷帘窗口与单轨乐器编辑界面 前言 单轨乐器编辑界面 上方菜单 ...

  8. FL studio 20简易入门教程 -- 第九篇 -- 完整编曲流程

    技巧合集 本文经验主要来自于B站爱编曲网官方正版快速入门教程,链接如下: 爱编曲网官方正版快速入门教程 文章目录 技巧合集 前言 完整编曲流程 1.设置速度 2.内容录制 3.钢琴卷帘窗口编辑 4.设 ...

  9. 11. GD32F103C8T6 入门教程-外部中断

    基础理论 中断函数名字可以在启动文件里查找 EXPORT WWDGT_IRQHandler [WEAK]EXPORT LVD_IRQHandler [WEAK]EXPORT TAMPER_IRQHan ...

最新文章

  1. 技术网站 --人人都是产品经理
  2. android 多点触控缩放,Android多点触控(图片的缩放Demo)
  3. 三种excel 多条件计数方法
  4. 自动生成网络拓扑图开源_为视频自动生成字幕,一款神奇的开源工具!
  5. 排序-选择类排序--堆排序简介
  6. python万年历实验报告_Python实现的简单万年历例子分享
  7. 2020ccks知识图谱问答总结
  8. [原创]K8_Delphi源码免杀系列教程
  9. 解锁pdf文件,删除pdf密码
  10. 公约数和公倍数(Python)
  11. excel内容少却文件很大_Excel文件内容很少,但文件很大,打开很慢、很卡怎么办?...
  12. Vijos-p1154买蛋糕(dfs + 剪枝)
  13. Python len() 函数
  14. SD-WAN网络加速,开通游戏快车道
  15. 漫画:什么是 “智能供应链” ?
  16. 2020TI省级大学生电子竞赛推荐芯片简介
  17. 四级英语听力软件测试,公务员考试网上做题 普通话测试软件 英语四级听力技巧...
  18. python-pygame实现飞机大战-3-发射子弹以及击中敌机
  19. 云物大智题库--云计算
  20. 企业级智能BI平台开源框架

热门文章

  1. html5调用安卓锁屏,HTML5实现APP永不锁屏
  2. DA0207 数据分析——数据分析之EXCEL
  3. 闭包必看面试题分享--01( var a = fun(0); a.fun(1); a.fun(2); a.fun(3); var b = fun(0).fun(1).fun(2).fun(3);..)
  4. CreateJS奥运五环动画
  5. China Quarantines Mexicans
  6. 常微分方程(2):一阶线性微分方程
  7. 浅谈关于申请CCC认证以后的好处
  8. 人工神经网络的训练步骤,人工神经网络建模步骤
  9. linux系统下载安装
  10. 英文文本关键词抽取——使用NLTK进行关键词抽取