[STM32F1] DAC+DMA

[复制链接]
703|1
 楼主| 19996 发表于 2021-3-17 10:29 | 显示全部楼层 |阅读模式
DMA, DAC, ni, IO, pi
  1. const u32 Beatwave1[]={4095,4095,4095};
  2. void Dac2_Init(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         DAC_InitTypeDef DAC_InitType;

  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );          //使能PORTA通道时钟
  7.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );          //使能DAC通道时钟

  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 // 端口配置
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //模拟输入
  10.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  12.         GPIO_SetBits(GPIOA,GPIO_Pin_5)        ;//PA.5 输出高
  13.                                        
  14.         DAC_InitType.DAC_Trigger=DAC_Trigger_None;        //不使用触发功能 TEN1=0
  15.         DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
  16.         DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
  17.         DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;        //DAC1输出缓存关闭 BOFF1=1
  18.   DAC_Init(DAC_Channel_2,&DAC_InitType);         //初始化DAC通道1

  19.         
  20.         
  21.         DAC_Cmd(DAC_Channel_2, ENABLE);  //使能DAC1

  22.         
  23.         
  24.   DAC_SetChannel2Data(DAC_Align_12b_R, 1228);  //12位右对齐数据格式设置DAC值
  25.         
  26.         MYDMA_Config(DMA2_Channel4,(u32)DAC->DHR12R2,(u32)Beatwave1,sizeof(Beatwave1));
  27.         DAC_DMACmd(DAC_Channel_2,ENABLE);
  28.         MYDMA_Enable(DMA2_Channel4);
  29. }

  30. u16 DMA2_MEM_LEN;//保存DMA每次数据传送的长度            
  31. //DMA1的各通道配置
  32. //这里的传输形式是固定的,这点要根据不同的情况来修改
  33. //从存储器->外设模式/8位数据宽度/存储器增量模式
  34. //DMA_CHxMA通道CHx
  35. //cpar:外设地址
  36. //cmar:存储器地址
  37. //cndtr:数据传输量
  38. u16 DMA2_MEM_LEN;
  39. void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
  40. {
  41.         DMA_InitTypeDef DMA_InitStructure;
  42.         
  43.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);        //使能DMA传输
  44.         
  45.   DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值

  46.         DMA2_MEM_LEN=cndtr;
  47.         DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设基地址
  48.         DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
  49.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
  50.         DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
  51.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
  52.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
  53.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //数据宽度为8位
  54.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为8位
  55.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在正常模式
  56.         DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //DMA通道 x拥有中优先级
  57.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
  58.         DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
  59.                   
  60. }
  61. //开启一次DMA传输
  62. void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
  63. {
  64.         DMA_Cmd(DMA_CHx, DISABLE );  //关闭USART1 TX DMA1 所指示的通道      
  65.         DMA_SetCurrDataCounter(DMA_CHx,DMA2_MEM_LEN);//DMA通道的DMA缓存的大小
  66.         DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 TX DMA1 所指示的通道
  67. }         

上面是DAC和对应DMA的配置,现在感觉DMA没法正常工作起来

有谁知道为什么吗?

比较急,谢谢


sonicll 发表于 2021-3-17 13:33 | 显示全部楼层
DAC要使用DMA,必须使用外部触发,否则没有信号可以触发DMA传输。
DAC的GPIO脚要配置为模拟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

139

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部