求大佬帮忙看下!!!STM32F767开发板DAC的DMA模式发送数据,单独DAC能够发送数据出去,走DMA通道后DAC一直没有数据出来,DMA寄存器状态正常,
DMA寄存器状态
但是DAC的寄存器中的DAC_DHR12R1一直没有数据,引脚也没哟数据出来。求大佬帮忙看下!
代码如下://要实现的功能就是将数组的数据通过DMA搬送到DAC出去
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "usmart.h"
#include "dac.h"
#include "math.h"
#define DAC_SIN_SIZE 100 //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.100
#define PI 3.1415962
u32 DAC_SIN_BUF[DAC_SIN_SIZE]; //发送数据缓冲区
//产生正弦波函序列,根据DAC_SIN_SIZE生成。
void dac_creat_sin_buf(void)
{
u8 i;
float inc=2*PI/DAC_SIN_SIZE; //计算增量(一个周期DAC_SIN_BUF个点)
float outdata=0;
for(i=0;i<DAC_SIN_SIZE;i++)
{
outdata=2047*(1+sin(inc*i)); //计算以dots个点为周期的每个点的值,放大2048倍,并偏移到正数区域。
DAC_SIN_BUF
= (uint32_t)outdata;
}
}
DAC_HandleTypeDef DAC1_Handler; //DAC句柄
DMA_HandleTypeDef DAC1TxDMA_Handler; //DMA句柄
TIM_HandleTypeDef TIM2_Handler; //定时器句柄
//初始化DAC
void DAC1_Init(void)
{
DAC_ChannelConfTypeDef DACCH1_Config;
DAC1_Handler.Instance=DAC;
//DAC1_Handler.DMA_Handle1=&DAC1TxDMA_Handler;
HAL_DAC_Init(&DAC1_Handler); //初始化DAC
DACCH1_Config.DAC_Trigger=DAC_TRIGGER_T2_TRGO; /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */
DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;//DAC1输出缓冲关闭
HAL_DAC_ConfigChannel(&DAC1_Handler,&DACCH1_Config,DAC_CHANNEL_1);//DAC通道1配置
}
//DAC底层驱动,时钟配置,引脚 配置
//此函数会被HAL_DAC_Init()调用
//hdacAC句柄
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_DAC_CLK_ENABLE(); //使能DAC时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
GPIO_Initure.Pin=GPIO_PIN_4; //PA4
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟
GPIO_Initure.Pull=GPIO_PULLDOWN; //不带上下拉
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
//通用定时器2初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!(定时器3挂在APB1上,时钟为HCLK/2)
void TIM2_Init(u16 arr,u16 psc)
{
TIM2_Handler.Instance=TIM2; //通用定时器2
TIM2_Handler.Init.Prescaler=psc; //分频
TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM2_Handler.Init.Period=arr; //自动装载值
TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM2_Handler);
HAL_TIM_Base_Start(&TIM2_Handler); //Time Base Start
__HAL_TIM_URS_ENABLE(&TIM2_Handler);
}
//定时器底册驱动,开启时钟
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
__HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM2时钟
}
}
//DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//chxMA通道选择,@ref DMA_channel DMA_CHANNEL_0~DMA_CHANNEL_7
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx)
{
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
}else
{
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
}
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
__HAL_LINKDMA(&DAC1_Handler,DMA_Handle1,DAC1TxDMA_Handler); //将DMA与DAC1联系起来(发送DMA)
//Tx DMA配置
DAC1TxDMA_Handler.Instance=DMA_Streamx; //数据流选择
DAC1TxDMA_Handler.Init.Channel=chx; //通道选择
DAC1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设
DAC1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
DAC1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
DAC1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD; //外设数据长度:32位
DAC1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD; //存储器数据长度:32位
DAC1TxDMA_Handler.Init.Mode=DMA_CIRCULAR; //外设流控模式 DMA_NORMAL; DMA_CIRCULAR
DAC1TxDMA_Handler.Init.Priority=DMA_PRIORITY_HIGH; //高等优先级 DMA_PRIORITY_MEDIUM 中等优先级
DAC1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
DAC1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
DAC1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
DAC1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
HAL_DMA_DeInit(&DAC1TxDMA_Handler);
HAL_DMA_Init(&DAC1TxDMA_Handler);
}
//主程序
int main(void)
{
u16 i;
u16 adcx;
float temp;
u8 t=0;
u16 dacval=0;
u8 key;
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //LCD初始化
//SCB_DisableDCache();
TIM2_Init(5000-1,10800-1); //定时器2初始化,定时器时钟为108M,分频系数为10800-1,
//所以定时器2的频率为108M/10800=10K,自动重装载为5000-1,那么定时器周期就是500ms
DAC1_Init(); //初始化DAC1
MYDMA_Config(DMA1_Stream5,DMA_CHANNEL_7);//初始化DMA
HAL_DAC_Start_DMA(&DAC1_Handler,DAC_CHANNEL_1, DAC_SIN_BUF, DAC_SIN_SIZE, DAC_ALIGN_12B_R)//开始发送
while(1)
{
i++;
delay_ms(10);
if(i==20)
{
LED0_Toggle;//提示系统正在运行
i=0;
}
}
}
一周热门 更多>