stm32f407之DAC(操作寄存器)

来源:互联网 发布:多益网络招聘学历要求 编辑:程序博客网 时间:2024/06/06 07:46

作者:w471176877

转自:http://blog.csdn.net/w471176877/article/details/7957362


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
  1. /************************************  
  2.     标题:DAC  
  3.     软件平台:IAR for ARM6.21  
  4.     硬件平台:stm32f4-discovery  
  5.     主频:168M  
  6.       
  7.     author:小船  
  8.     data:2012-02-12  
  9. *************************************/  
  10.   
  11. #include <stm32f4xx.h>   
  12. #include "MyDebugger.h"  
  13. #include "sintable.h"   
  14.   
  15.   
  16. void main ()  
  17. {     
  18.   
  19.   SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1  
  20.    
  21.   /***GPIO设置***/  
  22.   RCC->AHB1ENR |= (1<<0); //打开GPIOA时钟  
  23.   GPIOA->MODER |= 0x00000F00;//PA4、5模拟模式  
  24.   GPIOA->PUPDR &= 0xfffff0ff;//无上拉无下拉     
  25.     
  26.   /***定时器设置***/  
  27.   RCC->APB1ENR |= (1<<4);//打开TIM6时钟  
  28.   TIM6->PSC = 0;   
  29.   TIM6->ARR = 83;  //使得更新事件频率为1m  
  30.   TIM6->CR2 |=  0x00000020;//更新事件输出  
  31.   TIM6->CR1 |= 1; //开始计时  
  32.     
  33.   /***DAC设置***/  
  34.   RCC->APB1ENR |= (1<<29); //使能DAC时钟  
  35.   DAC->CR &= 0xffff0000;  
  36.   /*  
  37.   使能DMA堵塞中断  
  38.   使能通道1触发  
  39.   */  
  40.   DAC->CR |= ( (1<<13) | (1<<2) );    
  41.   NVIC->IP[54] = 0xA0;  
  42.   NVIC->ISER[1] |= (1<<(54-32));  
  43.    
  44.   /***DMA设置***/  
  45.   RCC->AHB1ENR |= (1<<21); //使能DMA1时钟  
  46.   DAC->CR &= ~(1<<12);//DAC dma发送模式除能  
  47.   DMA1_Stream5->CR &= 0xFFFFFFFE; //除能DMA1_Stream5  
  48.   while(DMA1_Stream5->CR & 0x00000001);//确保DMA可以被设置   
  49.   DMA1->HIFCR |= 0x000004f0;//传送前清空DMA1_Stream5所有中断标志   
  50.   DMA1_Stream5->PAR = (uint32_t)&DAC->DHR12R1;//设置外设地址  
  51.   DMA1_Stream5->M0AR = (uint32_t)SinTable; //设置内存地址  
  52.   DMA1_Stream5->CR |= 0x0002800;//16位数据  
  53.   DMA1_Stream5->NDTR = 1024; //设置dma传输数据的数量  
  54.   /*  
  55.     设置dma通道7,即DAC1  
  56.     优先级Medium  
  57.     传输方向内存到外设  
  58.     内存递增模式  
  59.     循环模式  
  60.   */  
  61.   DMA1_Stream5->CR |= ( 0x0e000000 | 0x00010000 | (1<<6)  
  62.                         | (1<<10) | (1<<8) );   
  63.     
  64.   DMA1_Stream5->CR |= 1; //DMA数据流5使能  
  65.     
  66.   DAC->CR |= (1<<0);   //DAC通道1使能  
  67.   
  68.   DAC->CR |= (1<<12);//DAC dma发送模式使能    
  69.       
  70.   MyDebugger_Init();  
  71.   
  72.   while(1)  
  73.   {  
  74.   };  
  75. }  
  76.   
  77. void TIM6_DAC_IRQHandler(void)  
  78. {  
  79.   if( DAC->SR & (1<<13) )  
  80.   {  
  81.     MyDebugger_LEDs(red, on);  
  82.     DAC->SR &= ~(1<<13);   
  83.   }  


原创粉丝点击