×
单片机 > 单片机程序设计 > 详情

stm32f407之DAC(操作寄存器)

发布时间:2020-06-01 发布时间:
|

DAC


Stm32f4内嵌的DAC是12位数字输入,电压输出的数模转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。


        

主要特点:


2个DAC转换器:每个转换器对应1个输出通道


8位或者12位单调输出


12位模式下数据左对齐或者右对齐


同步更新功能


噪声波形生成


三角波形生成


双DAC通道同时或者分别转换


每个通道都有DMA功能


外部触发转换


输入参考电压VREF+


 


 




设置步骤:


1.     设置相关GPIO(PA4、5)。


2.     若时钟源为TIMx更新事件,则设置TIMx。


3.     使能DAC时钟


4.     设置触发源,开启相关触发通道,如果用DMA,是否允许数据错误中断。


5.     如果用DMA。配置相关DMA数据流。


 


 


 


程序:



[plain] view plaincopy

/************************************  

    标题:DAC  

    软件平台:IAR for ARM6.21  

    硬件平台:stm32f4-discovery  

    主频:168M  

      

    author:小船  

    data:2012-02-12  

*************************************/  

  

#include   

#include "MyDebugger.h"  

#include "sintable.h"   

  

  

void main ()  

{     

  

  SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1  

   

  /***GPIO设置***/  

  RCC->AHB1ENR |= (1<<0); //打开GPIOA时钟  

  GPIOA->MODER |= 0x00000F00;//PA4、5模拟模式  

  GPIOA->PUPDR &= 0xfffff0ff;//无上拉无下拉     

    

  /***定时器设置***/  

  RCC->APB1ENR |= (1<<4);//打开TIM6时钟  

  TIM6->PSC = 0;   

  TIM6->ARR = 83;  //使得更新事件频率为1m  

  TIM6->CR2 |=  0x00000020;//更新事件输出  

  TIM6->CR1 |= 1; //开始计时  

    

  /***DAC设置***/  

  RCC->APB1ENR |= (1<<29); //使能DAC时钟  

  DAC->CR &= 0xffff0000;  

  /*  

  使能DMA堵塞中断  

  使能通道1触发  

  */  

  DAC->CR |= ( (1<<13) | (1<<2) );    

  NVIC->IP[54] = 0xA0;  

  NVIC->ISER[1] |= (1<

   

  /***DMA设置***/  

  RCC->AHB1ENR |= (1<<21); //使能DMA1时钟  

  DAC->CR &= ~(1<<12);//DAC dma发送模式除能  

  DMA1_Stream5->CR &= 0xFFFFFFFE; //除能DMA1_Stream5  

  while(DMA1_Stream5->CR & 0x00000001);//确保DMA可以被设置   

  DMA1->HIFCR |= 0x000004f0;//传送前清空DMA1_Stream5所有中断标志   

  DMA1_Stream5->PAR = (uint32_t)&DAC->DHR12R1;//设置外设地址  

  DMA1_Stream5->M0AR = (uint32_t)SinTable; //设置内存地址  

  DMA1_Stream5->CR |= 0x0002800;//16位数据  

  DMA1_Stream5->NDTR = 1024; //设置dma传输数据的数量  

  /*  

    设置dma通道7,即DAC1  

    优先级Medium  

    传输方向内存到外设  

    内存递增模式  

    循环模式  

  */  

  DMA1_Stream5->CR |= ( 0x0e000000 | 0x00010000 | (1<<6)  

                        | (1<<10) | (1<<8) );   

    

  DMA1_Stream5->CR |= 1; //DMA数据流5使能  

    

  DAC->CR |= (1<<0);   //DAC通道1使能  

  

  DAC->CR |= (1<<12);//DAC dma发送模式使能    

      

  MyDebugger_Init();  

  

  while(1)  

  {  

  };  

}  

  

void TIM6_DAC_IRQHandler(void)  

{  

  if( DAC->SR & (1<<13) )  

  {  

    MyDebugger_LEDs(red, on);  

    DAC->SR &= ~(1<<13);   

  }  

}  



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义