380|0

374

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

DigiKey“智造万物,快乐不停”创意大赛】DAC-DMA [复制链接]

 

STM32H73B 的DAC可以产生各种波形的信号,本贴使用DMA传输模式DAC1来产生正弦波信号,由TIM6触发DMA。

 

DAC1设置


DAC1-DMA设置


TIM6设置

TIM6-DMA设置


输出50HZ正弦波


主要代码

uint32_t data_sin[128]  = {
  2048, 2145, 2242, 2339, 2435, 2530, 2624, 2717, 2808, 2897,
  2984, 3069, 3151, 3230, 3307, 3381, 3451, 3518, 3581, 3640,
  3696, 3748, 3795, 3838, 3877, 3911, 3941, 3966, 3986, 4002,
  4013, 4019, 4020, 4016, 4008, 3995, 3977, 3954, 3926, 3894,
  3858, 3817, 3772, 3722, 3669, 3611, 3550, 3485, 3416, 3344,
  3269, 3191, 3110, 3027, 2941, 2853, 2763, 2671, 2578, 2483,
  2387, 2291, 2194, 2096, 1999, 1901, 1804, 1708, 1612, 1517,
  1424, 1332, 1242, 1154, 1068, 985,  904,  826,  751,  679,
  610,  545,  484,  426,  373,  323,  278,  237,  201,  169,
  141,  118,  100,  87,   79,   75,   76,   82,   93,   109,
  129,  154,  184,  218,  257,  300,  347,  399,  455,  514,
  577,  644,  714,  788,  865,  944,  1026, 1111, 1198, 1287,
  1378, 1471, 1565, 1660, 1756, 1853, 1950, 2047
};
DAC_HandleTypeDef hdac1;
DMA_HandleTypeDef hdma_dac1_ch1;

void MX_DAC1_Init(void)
{
uint16_t i,j;
	for(i=0,j=0;i<128;i++,j+=32)
	{
		Sawtooth[i]=j;
		
	}
  DAC_ChannelConfTypeDef sConfig = {0};
  hdac1.Instance = DAC1;
  if (HAL_DAC_Init(&hdac1) != HAL_OK)
  {
    Error_Handler();
  }
  sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
  sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
  sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
  if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, &data_sin[0],128, DAC_ALIGN_12B_R) ;
}

void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(dacHandle->Instance==DAC1)
  {
    __HAL_RCC_DAC12_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    hdma_dac1_ch1.Instance = DMA1_Stream0;
    hdma_dac1_ch1.Init.Request = DMA_REQUEST_DAC1;
    hdma_dac1_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_dac1_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_dac1_ch1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_dac1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_dac1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_dac1_ch1.Init.Mode = DMA_CIRCULAR;
    hdma_dac1_ch1.Init.Priority = DMA_PRIORITY_LOW;
    hdma_dac1_ch1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_dac1_ch1) != HAL_OK)
    {
      Error_Handler();
    }
    __HAL_LINKDMA(dacHandle,DMA_Handle1,hdma_dac1_ch1);
    HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
  }
}

TIM_HandleTypeDef htim6;
DMA_HandleTypeDef hdma_tim6_up;
void MX_TIM6_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 0;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 43700;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
HAL_TIM_Base_Start(&htim6);
}


 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表