ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

重学STM32---(六)之DAC DMA TIM实现正弦波

2019-10-24 20:39:32  阅读:340  来源: 互联网

标签:DMA 重学 TIM6 DAC CCR Init CR include


前言

        这两天复习了DAC,DMA再加上把基本定时器TIM6和TIM7看了一下,打算写一个综合点的程序,,,就在网上找了一些关于DAC,DMA和定时器相关的程序,最终打算写了输出正弦波的程序。。。

  由于没有示波器,也就不能显示出效果了,本来是打算用软件调试看效果的,但TIM6总是出问题,CNT不自增,可是我真的找不出TIM6有什么错误,,,后来在网上发现许多道友遇到同样的问题,有人说TIM6不支持软件调试,不知道是不是这么回事,,没办法,没示波器,软件调试又不行,自己本身也不想耽搁复习的进程,也就不纠结于此了,整体上应该是对的。

 

知识点

直接上程序了,基本都有注释

dac.c

#include "dac.h"
#include "stm32f10x.h"

void DAC1_Init()
{
    RCC->APB2ENR |= 1 << 2; //

    GPIOA->CRL &= 0xfff0ffff; //PA4模拟输入

    DAC->CR &= 0x00000000; //清零
    DAC->CR |= 1 << 12; //DMA使能
    DAC->CR |= 0 << 6; //TIM6 TRGO触发
    DAC->CR |= 1 << 2; //开启触发使能
    DAC->CR |= 1 << 1; //关闭输出缓存
    DAC->CR |= 1 << 0; //开启DAC1
}

dma.c

#include "dma.h"
#include "stm32f10x.h"

 

//pscadr 外设地址
//memaddr存储器地址
//numbyte传输字节数
void DMA_Init(u32 pscadr,u16 memaddr,u16 numbyte)
{
    RCC->AHBENR |= 1 << 0; //开启DMA1的时钟

    DMA1_Channel1->CCR &= 0xFFFF0000;
    DMA1_Channel1->CCR |= 3 << 12; //优先级最高
    DMA1_Channel1->CCR |= 1 << 10; //存储器16位数据
    DMA1_Channel1->CCR |= 1 << 8; //外设16位数据
    DMA1_Channel1->CCR |= 1 << 7; //存储器自增
    DMA1_Channel1->CCR |= 0 << 6; //外设不自增
    DMA1_Channel1->CCR |= 1 << 5; //循环
    DMA1_Channel1->CCR |= 1 << 4; //从存储器读

    DMA1_Channel1->CNDTR |= numbyte ;

    DMA1_Channel1->CMAR |= memaddr ;
    DMA1_Channel1->CPAR |= pscadr ;

    DMA1_Channel1->CCR |= 1 << 0; //通道开启
}

tim6.c

void TIM6_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR |= 1 << 4;

    TIM6->CR1 &= 0xFF00;
    TIM1->CR1 |= 1 << 7; //自动重装载
    TIM6->CR1 |= 0 << 3; //非单脉冲模式

    TIM6->CR2 |= 2 << 3; //更新事件用作TRGO

    TIM6->PSC |= psc;
    TIM6->ARR |= arr;

    TIM6->CR1 |= 1 << 0;
}

主程序main.c

#include "timer.h"
//#include "exti.h"
#include "dma.h"
#include "dac.h"

/* 波形数据 ---------------------------------------------------------*/
const unsigned short Sine12bit[32] = {
        2448,2832,3186,3496,3751,3940,4057,4095,4057,3940,
        3751,3496,3186,2832,2448,2048,1648,1264,910,600,345,
        156,39,0,39,156,345,600,910,1264,1648,2048
    };

#define DAC_DHR12R1_ADDR DAC_BASE + 8           //DAC_DHR12R1寄存器地址


int main()
{
    LED_Init ();
    delay_init (72);
    TIM6_Init(19,0);
    DAC1_Init();
    DMA_Init(DAC_DHR12R1_ADDR,(unsigned short)Sine12bit,32);
    while(1);
}

 

 

关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享

 

小败日记公众号

​​​扫描二维码,关注我的公众号

 

 

标签:DMA,重学,TIM6,DAC,CCR,Init,CR,include
来源: https://blog.csdn.net/qigaohua/article/details/102730898

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有