|
/************************************
标题: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 = 0x05AF0000 | 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);
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|