STM32G474使用TIM2触发DAC输出输出正弦波

news2024/10/24 6:19:30

STM32G474使用TIM2触发DAC输出,数据从内存到外设就要使用DMA来协助。DAC1每隔1秒输出一个正弦波数据,就会模拟近似得到模拟的正弦波形。用来测试CPU内部的运算放大器,或者用作其它模拟输入信号。

测试程序如下:

#include "DAC.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "delay.h"

/*
STM32G474之DAC输出,使用DMA从内存搬运数据到DAC1外设,使用TIM2触发DAC1输出
*/

void DAC1_CHANNEL_1_Init(void);

const uint16_t Sine12bit[32] = { 511,  611,  707,  796,  873,  937,  984, 1013,
                                1023, 1013,  984,  937,  873,  796,  707,  611,
                                 511,  412,  315,  227,  149,   86,   38,    9,
                                   0,    9,   38,   86,  149,  227,  315,  412};
//函数功能:DAC1通道1初始化
void DAC1_CHANNEL_1_Init(void)
{
    DAC_HandleTypeDef      hdac1;
//DAC1句柄,若直接对寄存器DAC1->DHR12R1和DAC1->DHR12R2操作,就可以将其设置为局部变量
//DAC1->DHR12R1为DAC通道1(12位右对齐数据保持寄存器)
//DAC1->DHR12R2为DAC通道2(12位右对齐数据保持寄存器)

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    DAC_ChannelConfTypeDef sConfig;        //DAC通道参数相关结构体

    DMA_HandleTypeDef hdma_dac1_ch1;

    TIM_HandleTypeDef htim2;
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

    __HAL_RCC_DAC1_CLK_ENABLE();
    //使能DAC1时钟
    //RCC_AHB2ENR寄存器bit18(DAC1EN),令DAC1EN=1使能DAC1时钟

  
  __HAL_RCC_GPIOA_CLK_ENABLE();//GPIOA时钟使能
  GPIO_InitStruct.Pin = GPIO_PIN_4;              //选择引脚号码为4
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;       //模拟模式
    GPIO_InitStruct.Pull = GPIO_NOPULL;            //引脚上拉和下拉都没有被激活
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOA的外设寄存器,将PA4引脚连接到DAC1通道1

    hdac1.Instance = DAC1; //DAC1
    HAL_DAC_Init(&hdac1);  //初始化DAC

    sConfig.DAC_HighFrequency     = DAC_HIGH_FREQUENCY_INTERFACE_MODE_ABOVE_160MHZ;
    //DAC时钟选择
  sConfig.DAC_DMADoubleDataMode = DISABLE; //双重数据模式(高带宽模式)关闭
  sConfig.DAC_SignedFormat      = DISABLE; //有符号模式关闭
  sConfig.DAC_SampleAndHold     = DAC_SAMPLEANDHOLD_DISABLE; //关闭采样保持


//  sConfig.DAC_Trigger           = DAC_TRIGGER_NONE;          //不需要外部触发
  sConfig.DAC_Trigger = DAC_TRIGGER_T2_TRGO;//使用TIM2触发DAC输出
  sConfig.DAC_Trigger2 = DAC_TRIGGER_NONE;


  sConfig.DAC_OutputBuffer      = DAC_OUTPUTBUFFER_ENABLE;   //DAC输出缓冲器打开
    sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_ENABLE;//允许内部连接DAC_Channel
//    sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;    //不允许内部连接DAC_Channel
    sConfig.DAC_UserTrimming      = DAC_TRIMMING_FACTORY;      //工厂矫正模式
  HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1);   //初始化

    __HAL_RCC_DMA1_CLK_ENABLE();   //DMA1时钟使能
    __HAL_RCC_DMAMUX1_CLK_ENABLE();//设置RCC->AHB1ENR寄存器bit2(DMAMUX1EN位),令DMAMUX1EN=1,DMAMUX1时钟使能
    hdma_dac1_ch1.Instance = DMA1_Channel1;//使用DMA1的通道1
    hdma_dac1_ch1.Init.Request = DMA_REQUEST_DAC1_CHANNEL1;//DMA需求来源DAC1
    hdma_dac1_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
    //设置DMA_CCRx寄存器bit4(DIR位),令DIR=1,数据传输方向:内存到外设
    hdma_dac1_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
    //设置DMA_CCRx寄存器bit6(PINC位),令PINC=0,外设地址不增加
    hdma_dac1_ch1.Init.MemInc = DMA_MINC_ENABLE;
    //设置DMA_CCRx寄存器bit7(MINC位),令MINC=1,内存地址增加
    hdma_dac1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    //设置DMA_CCRx寄存器bit9:8(PSIZE[1:0]位),令PSIZE[1:0]=10,外设数据宽度32bits
    hdma_dac1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    //设置DMA_CCRx寄存器bit11:10(MSIZE[1:0]]位),令MSIZE[1:0]=01,内存数据宽度16bits
    hdma_dac1_ch1.Init.Mode = DMA_CIRCULAR;
    //DMA_CIRCULAR:“DAM循环搬运数据”
    //DMA_NORMAL;若启动一次DMA,则DMA搬运一次数据
    //设置DMA_CCRx寄存器bit5(CIRC位),令CIRC=1,这里设置“DAM循环搬运数据”

    hdma_dac1_ch1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
    //设置DMA_CCRx寄存器bit13:12(PL[1:0]),令PL[1:0]=11b,DMA抢占优先级最高
    HAL_DMA_Init(&hdma_dac1_ch1);

    __HAL_LINKDMA(&hdac1,DMA_Handle1,hdma_dac1_ch1);
    //将DAC1与DMA联系起来
    //把hdac1结构体的参数赋给DMA_Handle1

  __HAL_RCC_TIM2_CLK_ENABLE();//使能“定时器2”的时钟,Enable TIM2 clock
  htim2.Instance = TIM2;
  htim2.Init.Period = 9999;
    //定时器周期(9999+1)
  htim2.Init.Prescaler = 16;
    //设置TIM1预分频器为(16+1)
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    //设置时钟分频系数,TIM1_CR1中的CKD[9:8]=00b,tDTS=ttim_ker_ck;
    //溢出时间为(9999+1)*1*(16+1)/170000000/1=0.01秒

  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.RepetitionCounter = 0;//重复计数(1-0),产生一次中断
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//TIM_AUTORELOAD_PRELOAD_DISABLE;
    //这里设置“使能重装载”

  HAL_TIM_Base_Init(&htim2);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
    //TIM_TRGO_UPDATE是“更新事件用来触发器输出”Update event is used as trigger output (TRGO2)
//  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
    //TIM1_TRGO2是adc_ext_trg10,用来触发ADC1/2/3/4/5

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
    //Configures the TIM in master mode.

/*
  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
    //设置NVIC中断分组4:4位抢占优先级,0位响应优先级
    //选择中断优先级组4,即抢占优先级为4位,取值为0~15,响应优先级组为0位,取值为0
    //DMA1_Channel1_IRQn抢占优先级为5,响应优先级为0
  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);//使能DMA1_Channel1_IRQn中断
*/

  HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1,(uint32_t*)Sine12bit, 32, DAC_ALIGN_12B_R);
    //启动DMA传输
    HAL_TIM_Base_Start(&htim2);//启动TIM2
}

测试PA4引脚的波形如下:

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

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

相关文章

立志最细,FreeRtos的中断管理(Interrupt Management)函数,详解!!!

前言:本文参考,韦东山老师开发文档,连接放在最后。 为什么需要中断管理函数? 在FreeRtos操作系统中,需要实时响应性,也就是随时随地必须保证正常多任务的运行,如果有中断发生,因为中…

Spring Cloud --- Sentinel 规则持久化

为什么要持久化 一旦我们重启微服务应用,sentinel 规则将消失,生产环境需要将配置规则进行持久化 怎么实现持久化 将限流配置规则持久化进 Nacos 保存,只要刷新 8401 某个 rest 地址,sentinel 控制台的流控规则就能看到&#x…

keil新建工程HC32L176MATA

先看一下最后的文件夹结构(文件夹结构可以根据项目实际的需要去定义) keil内: 参考文章: KEIL平台下新建华大HC32F460单片机工程笔记_hc32f keil环境搭建-CSDN博客 (我根据需要,创建的文件夹结构和原文是有…

面试总结一

面试总结 1、自我介绍一下自己2.面试11、css常用布局有哪些2、css常用的属性3.js原型链4、开发中遇到的技术难点5、闭包6、ts了解什么呢7.git都用什么命令8、vue怎么打包9.vue启动一个项目需要什么10、vue怎么创建一个项目 2.面试21.vue2和vue3有什么区别2.复杂组件的封装&…

C#,自动驾驶技术,ASAM OpenDRIVE BS 1.8.0 规范摘要与C# .NET Parser

本文介绍自动驾驶技术的标准之一《ASAM OpenDRIVE》1.8.0 版本的规范摘要,及北京联高软件开发有限公司实现的 C# 版本 xodr 文件(XML) Parser 源代码。 本文档是 ASAM e.V. 的版权财产。 在更改常规许可条款时,ASAM 允许不受限制地…

gateway 整合 spring security oauth2

微服务分布式认证授权方案 在分布式授权系统中,授权服务要独立成一个模块做统一授权,无论客户端是浏览器,app或者第三方,都会在授权服务中获取权限,并通过网关访问资源 OAuth2的四种授权模式 授权码模式 授权服务器将授…

【原创】统信UOS如何安装最新版Node.js(20.x)

注意直接使用sudo apt install nodejs命令安装十有八九会预装10.x的老旧版本Node.js,如果已经安装的建议删除后安装如下方法重装。 在统信UOS系统中更新Node.js可以通过以下步骤进行: 1. 卸载当前版本的Node.js 首先,如果系统中已经安装了N…

Maven进阶——坐标、依赖、仓库

目录 1.pomxml文件 2. 坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 自己项目的坐标 2.5 第三方项目坐标 3. 依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找方法 3.4 依赖范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…

推荐一个开源非线性视频编辑器:Kdenlive

Kdenlive是一个开源的视频编辑软件,项目始于约2003年。它基于Qt和KDE框架库构建,大部分视频处理由MLT框架完成,同时依赖其他开源项目如FFmpeg、frei0r、movit、ladspa、sox等。 软件特点: - 多轨视频编辑:支持多个音频…

大数据新视界 -- 大数据大厂之大数据和增强现实(AR)结合:创造沉浸式数据体验

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP

文章目录 一、前言二、MICS你是黑客么循环的压缩包Goodtime 三、WEBpy 四、Crypto变异凯撒RSAcrypto3 一、前言 WP不完整,仅供参考! 除WEB,RE,PWN外,其余附件均已打包完毕 也是一个对MISC比较友好的一个比赛~ 123网…

springboot066人事系统(论文+源码)_kaic

基于vue的人事系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,作为学校以及一些培训机构,都在用信息化战术来部署线上学习以及线上考试,可以与线下的考试有机的结合在一起,实现基于vue的人事系统在技术上已成熟。本文介绍…

u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法

我们在u盘安装原版win10 iso镜像时,发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”,直接导致了无法继续安装下去。出现这种情况要怎么解决呢?下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…

信息安全工程师(53)网络安全审计机制与实现技术

前言 网络安全审计机制是指为了保护网络安全并发现潜在风险和漏洞而进行的一系列审计活动。审计的目的是检查并评估网络系统的安全性,以确保其符合相关法律法规和安全标准。 一、网络安全审计机制的重要性 网络安全审计机制对于保护组织的信息资产和敏感数据至关重要…

简单的 curl HTTP的POSTGET请求以及ip port连通性测试

简单的 curl HTTP的POST&GET请求以及ip port连通性测试 1. 需求 我们公司有一个演示项目,需要到客户那边进行项目部署,项目部署完成后我们需要进行项目后端接口的测试功能,但是由于客户那边么有条件安装类似于postman这种的测试工具&am…

CSS3文本阴影、文本换行、文本溢出、文本修饰、文本描边的使用

1.文本阴影:text-shadow 2.文本换行: white-space:pre(可以理解为按原文显示) white-space:pre-wrap(不会超出父容器) 3.文本溢出 text-overflow:ellipsis一般配合文本…

人工智能的未来:变革生活与工作的新篇章

随着人工智能(AI)技术的飞速发展,我们正站在一个前所未有的变革时代。AI不仅重新定义了医疗、企业运营和日常生活的各个方面,还潜移默化地改变着我们的思维方式和工作习惯。本文将深入探讨人工智能技术的应用前景,以及…

web前端-html:简单创建表格表单相结合的网页

效果&#xff1a; <body><form action"这里如果为空表单提交后不会有任何操作"method"get"<label for"edit">用户名</label><input type"text" name"用户名" id"最好不要空&#xff0c;id属性…

【MySQL】详解MySQL数据类型

一、数据类型 各类型的数值范围&#xff1a; 在MySQL中&#xff0c;整型可以指定是有符号的和无符号的&#xff0c;默认是有符号的。 可以通过UNSIGNED来说明某个字段是无符号的。对于int类型可能存放不下的数据&#xff0c;尽量不使用unsigned&#xff0c;unsigned int 同样可…

分布式链路追踪-01初步认识SkyWalking

一 SkyWaling是什么&#xff1f; Skywalking是分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Docker、K8s、Mesos&#xff09;架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统&#xff0c;提供分布式追踪、服务网格遥…