新手上路
- 积分
- 36
- 金钱
- 36
- 注册时间
- 2016-7-28
- 在线时间
- 6 小时
|
3金钱
谁有时间给帮忙看一下哪有问题啊?用的芯片是STM32F407ZG#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "arm_math.h"
#include "stm32f4xx.h" // Device header
#include "led.h"
#include "lcd.h"
#include "timer.h"
#include "adc.h"
#include "dac.h"
#include "math.h"
#include "dma.h"
#define SEND_BUF_SIZE 100
u16 SendBuff[SEND_BUF_SIZE]; //发送数据缓冲区
u32 timeout;
int main(void)
{
arm_cfft_radix4_instance_f32 scfft;
u8 n=0;
float fs=43750;
float time,f=0,R=0;
u16 dacval=1000; //PA4
u16 i=0,u=0,x=0,t=0;
float PA0=0,PA1=0;
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168); //延时初始化
uart_init(84,115200); //初始化串口波特率为115200
LED_Init(); //初始化LED
Dac_Init(); //初始化DAC
for(i=0;i<100;i++)
{
SendBuff[i]=i+dacval;
}
TIM4_Int_Init(5000-1,8400-1);
MYDMA_Config(DMA1_Stream5,7,(u32)&DAC->DHR12R1,(u32)SendBuff,SEND_BUF_SIZE);//DMA1,STEAM5,CH7,外设DAC1,存储器为SendBuff,长度为:SEND_BUF_SIZE
MYDMA_Enable(DMA1_Stream5,SEND_BUF_SIZE);//开始DMA传输
while(1)
{
LED0=!LED0;
}
}
#include "dac.h"
//DAC通道1输出初始化
void Dac_Init(void)
{
RCC->APB1ENR|=1<<29; //使能DAC时钟
RCC->AHB1ENR|=1<<0; //使能PORTA时钟
GPIO_Set(GPIOA,PIN4,GPIO_MODE_AIN,0,0,GPIO_PUPD_PD);//PA4,模拟输入,下拉
GPIO_Set(GPIOA,PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_PD);//PA5,模拟输入,下拉
DAC->CR|=1<<0; //使能DAC1
DAC->CR|=1<<1; //DAC1输出缓存不使能 BOFF1=1
DAC->CR|=1<<2; //不使用触发功能 TEN1=0
DAC->CR|=5<<3; //DAC TIM4 TRGO,不过要TEN1=1才行
DAC->CR|=0<<6; //不使用波形发生
DAC->CR|=0<<8; //屏蔽、幅值设置
DAC->CR|=1<<12; //DAC1 DMA使能
DAC->DHR12R1=0;
}
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_TypeDef *DMAx;
u8 streamx;
u32 PAR;
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
DMAx=DMA2;
RCC->AHB1ENR|=1<<22;//DMA2时钟使能
}else
{
DMAx=DMA1;
RCC->AHB1ENR|=1<<21;//DMA1时钟使能
}
while(DMA_Streamx->CR&0X01);//等待DMA可配置
streamx=(((u32)DMA_Streamx-(u32)DMAx)-0X10)/0X18; //得到stream数据流号
if(streamx>=6)DMAx->HIFCR|=0X3D<<(6*(streamx-6)+16); //清空之前该stream上的所有中断标志
else if(streamx>=4)DMAx->HIFCR|=0X3D<<6*(streamx-4); //清空之前该stream上的所有中断标志
else if(streamx>=2)DMAx->LIFCR|=0X3D<<(6*(streamx-2)+16);//清空之前该stream上的所有中断标志
else DMAx->LIFCR|=0X3D<<6*streamx; //清空之前该stream上的所有中断标志
PAR=par;
DMA_Streamx-> AR=PAR; //DMA外设地址
DMA_Streamx->M0AR=mar; //DMA 存储器0地址
DMA_Streamx->NDTR=ndtr; //DMA 数据项数目
DMA_Streamx->CR=0; //先全部复位CR寄存器值
DMA_Streamx->CR|=1<<6; //存储器到外设模式
DMA_Streamx->CR|=0<<8; //循环模式
DMA_Streamx->CR|=0<<9; //外设非增量模式
DMA_Streamx->CR|=1<<10; //存储器增量模式
DMA_Streamx->CR|=1<<11; //外设数据长度:16位
DMA_Streamx->CR|=1<<13; //存储器数据长度:16位
DMA_Streamx->CR|=2<<16; //高等优先级
DMA_Streamx->CR|=0<<21; //外设突发单次传输
DMA_Streamx->CR|=0<<23; //存储器突发单次传输
DMA_Streamx->CR|=(u32)chx<<25;//通道选择
//DMA_Streamx->FCR=0X21; //FIFO控制寄存器
}
//开启一次DMA传输
//DMA_Streamx MA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//ndtr:数据传输量
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{
DMA_Streamx->CR&=~(1<<0); //关闭DMA传输
while(DMA_Streamx->CR&0X1); //确保DMA可以被设置
DMA_Streamx->NDTR=ndtr; //DMA 存储器0地址
DMA_Streamx->CR|=1<<0; //开启DMA传输
}
|
|