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数据流。 程序:
- /************************************
- 标题:DAC
- 软件平台:IAR for ARM6.21
- 硬件平台:stm32f4-discovery
- 主频:168M
-
- author:小船
- data:2012-02-12
- *************************************/
-
- #include <stm32f4xx.h>
- #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<<(54-32));
-
- /***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);
- }
- }
|