STM32F103 ADC驱动程序设计

设计了一种通过软件触发,循环采集的ADC驱动程序


#include "stdbool.h"
#include "string.h"
#include "stm32f0xx_ll_bus.h"
#include "stm32f0xx_ll_gpio.h"
#include "stm32f0xx_ll_adc.h"
#include "stm32f0xx_ll_dma.h"/*-----------------------------------------------------------------------------数据结构实例化
-----------------------------------------------------------------------------*/
typedef struct ADC_GPIO_tag //ADC GPIO 配置结构
{uint32_t        rcu_GPIO;GPIO_TypeDef *  PORT_GPIO;uint32_t        PIN_GPIO;uint32_t        ADCchannel;uint32_t        DMAchannel;
}ADC_GPIO_t;/*-----------------------------------------------------------------------------宏定义
-----------------------------------------------------------------------------*///DMA配置
#define DMA_PERI_ADDR       (uint32_t)&(ADC1->DR)
#define DMA_MEM_ADDR        (uint32_t)&ADC_Buffer
//ADC配置
#define ADC_SAMPLE_INTERVAL  LL_ADC_SAMPLINGTIME_239CYCLES_5
#define ADC_CHANNEL_NUM         1    
#define ADC_BUFF_SIZE        200
/*-----------------------------------------------------------------------------数据结构实例化
-----------------------------------------------------------------------------*/
static uint16_t ADC_Buffer[ADC_CHANNEL_NUM][ADC_BUFF_SIZE];
static ADC_GPIO_t ADC_GPIO[ADC_CHANNEL_NUM] =
{{LL_AHB1_GRP1_PERIPH_GPIOA,    GPIOA,    LL_GPIO_PIN_6,LL_ADC_CHANNEL_6,LL_DMA_CHANNEL_1,},//{LL_AHB1_GRP1_PERIPH_GPIOA,    GPIOA,    LL_GPIO_PIN_6,LL_ADC_CHANNEL_6,LL_DMA_CHANNEL_1,},
};/**********************************************************
函数原型:void ADC_Init(void)
函数功能:初始化ADC
输入参数:NAN
输出参数:NAN
返回参数:NAN
注意事项:NAN
**********************************************************/
void ADC_Init(void)
{LL_DMA_InitTypeDef init_struct;LL_ADC_InitTypeDef adc_init_struct;LL_ADC_REG_InitTypeDef regular_init_struct;LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_ADC1);for(int i = 0; i<ADC_CHANNEL_NUM; i++){LL_AHB1_GRP1_EnableClock(ADC_GPIO[i].rcu_GPIO);LL_GPIO_SetPinMode(ADC_GPIO[i].PORT_GPIO,ADC_GPIO[i].PIN_GPIO,LL_GPIO_MODE_ANALOG);}memset(&init_struct,0,sizeof(init_struct));init_struct.Direction=LL_DMA_DIRECTION_PERIPH_TO_MEMORY;init_struct.MemoryOrM2MDstAddress= DMA_MEM_ADDR;init_struct.MemoryOrM2MDstIncMode=LL_DMA_MEMORY_INCREMENT;init_struct.MemoryOrM2MDstDataSize=LL_DMA_MDATAALIGN_HALFWORD;init_struct.NbData=ADC_BUFF_SIZE*ADC_CHANNEL_NUM;init_struct.PeriphOrM2MSrcAddress=DMA_PERI_ADDR;init_struct.PeriphOrM2MSrcIncMode=LL_DMA_PERIPH_NOINCREMENT;init_struct.PeriphOrM2MSrcDataSize=LL_DMA_PDATAALIGN_HALFWORD;init_struct.Priority=LL_DMA_PRIORITY_HIGH;for(int i = 0;i<ADC_CHANNEL_NUM;i++){LL_DMA_DeInit(DMA1,ADC_GPIO[i].DMAchannel);LL_DMA_Init(DMA1,ADC_GPIO[i].DMAchannel,&init_struct);LL_DMA_SetMode(DMA1,ADC_GPIO[i].DMAchannel,LL_DMA_MODE_CIRCULAR);LL_DMA_EnableChannel(DMA1,ADC_GPIO[i].DMAchannel);}LL_ADC_DeInit(ADC1);adc_init_struct.Clock = LL_ADC_CLOCK_SYNC_PCLK_DIV4;adc_init_struct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;adc_init_struct.Resolution = LL_ADC_RESOLUTION_12B;adc_init_struct.LowPowerMode = LL_ADC_LP_MODE_NONE;LL_ADC_Init(ADC1,&adc_init_struct);regular_init_struct.ContinuousMode = LL_ADC_REG_CONV_CONTINUOUS;regular_init_struct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;regular_init_struct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN;regular_init_struct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;regular_init_struct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;LL_ADC_REG_Init(ADC1,&regular_init_struct);LL_ADC_REG_SetSequencerScanDirection(ADC1,LL_ADC_REG_SEQ_SCAN_DIR_FORWARD);for(int i = 0;i<ADC_CHANNEL_NUM;i++){LL_ADC_REG_SetSequencerChannels(ADC1,ADC_GPIO[i].ADCchannel);}LL_ADC_SetSamplingTimeCommonChannels(ADC1,ADC_SAMPLE_INTERVAL);LL_ADC_StartCalibration(ADC1);while(LL_ADC_IsCalibrationOnGoing(ADC1)==true);LL_ADC_Enable(ADC1);while(!LL_ADC_IsEnabled(ADC1));LL_ADC_REG_StartConversion(ADC1);}/*---------------------------------------------------------------------------------------函数原型: void ADC_CopyBuf(uint32_t ch,uint32_t count,uint16_t *pBuf)功    能: 从驱动程序内部数缓冲区读取连续count个最新采样值输入参数: ch,通道号count,要读取采样值个数pBuf,读取数据保存位置返 回 值: NAN
---------------------------------------------------------------------------------------*/
void ADC_CopyBuf(uint32_t ch, uint32_t count,uint16_t *pBuf)
{uint32_t i;assert(pBuf != NULL);assert(ch < ADC_CHANNEL_NUM);if(count == 0){count = 1;}if(count > ADC_BUFF_SIZE){count = ADC_BUFF_SIZE;}for(i=ADC_BUFF_SIZE;i>ADC_BUFF_SIZE-count;i--){pBuf[i] = ADC_Buffer[ch][i];}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/7660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue3 生命周期与组合式API】

文章目录 一、Vue3 生命周期概述二、Vue3 组合式API 与选项式API 的对比1. 选项式API 生命周期钩子函数常用的生命周期钩子函数包括&#xff1a; 2. 组合式API 的优势组合式API 的主要优势包括&#xff1a;在生命周期管理上的优势 三、Vue3 组合式API 生命周期钩子函数1. setup…

语音识别--降噪

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

三剑客之grep

grep初级简单使用&#xff1a;Liunx查找&过滤-CSDN博客 正则表达式-CSDN博客 目录 grep分类 返回值 使用返回值控制流程 grep参数示例 基本参数 grep与正则表达式的搭配使用与示例 看完正则与示例进行无答案式练习 grep 用于在文件或输入流中查找特定模式或文本。…

uniapp的app端推送功能,不使用unipush

1&#xff1a;推送功能使用htmlPlus实现&#xff1a;地址HTML5 API Reference (html5plus.org) 效果图&#xff1a; 代码实现&#xff1a; <template><view class"content"><view class"text-area"><button click"createMsg&q…

什么是DDoS攻击?DDoS攻击的原理是什么?

一、DDoS攻击概念 DDoS攻击又叫“分布式拒绝服务”(Distributed DenialofService)攻击&#xff0c;它是一种通过控制大量计算机、物联网终端或网络僵尸&#xff08;Zombie&#xff09;来向目标网站发送大量请求&#xff0c;从而耗尽其服务器资源&#xff0c;导致正常用户无法访…

设计网页用什么软件

在设计网页时&#xff0c;可以使用多种软件来完成不同的任务。以下是一些常用的网页设计软件&#xff0c;以及它们的特点和用途。 1. Adobe Photoshop&#xff1a; Adobe Photoshop 是一款功能强大的图像编辑软件。在网页设计中&#xff0c;它常用于创建和编辑网页所需的图像、…

详细介绍如何在Windows系统上安装Anaconda

**一、引言** Anaconda是一个开源的Python发行版本&#xff0c;它包含了conda、Python等180多个科学包及其依赖项。Anaconda的优点在于它可以帮助用户解决安装包的依赖问题&#xff0c;方便用户管理多个环境&#xff0c;并且提供了一个完整的科学计算环境。本指南将详细介绍如…

手动配置dns后网速变慢

之前因为自动的dns能上qq但打不开网页&#xff0c;就手动设置了一个&#xff0c;结果近些天时不时出现网页图片加载慢的问题&#xff0c;影响到我看美女图片了&#xff0c;是可忍熟不可忍 测了下网速&#xff0c;很快&#xff0c;下载上传都是三位数的&#xff0c;那显然不是网…

element+ant 组件点

ant中table设置默认排序 a-table中的:column属性,设置对应的列上 item.sortOrder params.sort_type asc ? ascend : descend 判断ant-table中是否有横向坐标轴 const hasHorizontalScrollbar() > {const table document.querySelector(.ant-table-content);//可修改,…

RabbitMQ是如何保证消息可靠性的?——Java全栈知识(16)

RabbitMQ 的消息不可靠也就是 RabbitMQ 消息丢失只会发生在以下几个方面&#xff1a; 生产者发送消息到 MQ 或者 Exchange 过程中丢失。Exchange 中的消息发送到 MQ 中丢失。消息在 MQ 或者 Exchange 中服务器宕机导致消息丢失。消息被消费者消费的过程中丢失。 大致就分为生…

Star-CCM+分配零部件至区域1-将所有零部件分配至区域

前言 Star-CCM中&#xff0c;在划分网格之前需要将零部件分配至区域&#xff0c;然后才可以划分网格。如下图1所示&#xff0c;分配零部件至区域需要选择创建区域的方式、创建边界的方式以及交界面的类型。 图1 将零部件分配至区域 1 创建区域的方式选择 如下图2所示&#x…

基于Spring Boot的家具网站设计与实现

基于Spring Boot的家具网站设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统前台主界面图&#xff0c;用户可进入家具网站可查看…

RFC 791 (2) - Overview

目录 总览 操作 Addressing 与 Fragmentation Addressing Fragmentation 总览 RFC791文档的第二部分就是对IP进行总浏览&#xff1a;可以看到&#xff0c;我们的五层划分是这样的&#xff1a; ------ ----- ----- ----- |Telnet| | FTP | | TFTP| ... | ... | -----…

【Linux深度学习笔记5.7】

5.6学习笔记 文件查找: 语法:find $路径 name | type | perm | size | atime | mtime | ctime 操作对象find /opt/ -name a.txt ----> -iname (忽略大小写)find / -perm 000 ----> 权限查找find / -size 5M ----> 大小查找 5M (大于5M) -5M (小于5M)find /etc/…

探索大模型能力--prompt工程

1 prompt工程是什么 1.1 什么是Prompt&#xff1f; LLM大语言模型终究也只是一个工具&#xff0c;我们不可能每个人都去训一个大模型&#xff0c;但是我们可以思考如何利用好大模型&#xff0c;让他提升我们的工作效率。就像计算器工具一样&#xff0c;要你算10的10倍&#x…

Java IO类之FilterOutputStream的研究与应用

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

mybatis-plus编程接口

简介 使用Java语言对数据库进行操作&#xff0c;通常需要继承一些依赖Spring容器的ORM框架。在后端项目中非常高效且稳定。但对于一些客户端或者一些临时任务&#xff0c;非Spring环境下想对数据库进行简单的CRUD通常需要使用JDBC来实现&#xff0c;这种方式要自己拼接SQL&…

C语言中static和volatile关键字的作用

static 作用&#xff1a; 1 修饰局部变量&#xff1a;表示该局部变量只初始化一次&#xff0c;地址空间不释放 2 修饰全局变量&#xff1a;表示该全局变量只在此文件中使用&#xff0c;别的文件无法访问此变量 3 修饰函数&#xff1a; 表示修饰的函数只在此文件中使用&#xff…

RCE学习(一)

一.知识点 RCE&#xff1a;远程命令/代码执行漏洞&#xff0c;简称为RCE漏洞&#xff0c;可以直接向服务器后台远程注入操作系统的命令或者代码&#xff0c;从而拿到服务器后台的权限。RCE分为远程执行命令&#xff08;执行ping命令&#xff09;和远程代码执行eval 简单来说就…

VMware导入ova/ovf虚拟机文件

1.文件-打开-ova文件 2.为新虚拟机起名称 3.等待导入 4.导入完成&#xff0c;可以开始使用 参考链接&#xff1a;VMware导入ova/ovf虚拟机文件