你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F413 Nucleo评测(DAC)

[复制链接]
wenyangzeng 提问时间:2017-2-26 20:15 /
本帖最后由 wenyangzeng 于 2017-2-26 21:51 编辑

收到《我与STM32共成长》奖品STM32F413 Nucleo,谢谢社区。应该为它发一贴。

F423.JPG

STM32F413ZHT6是Cortex-M4内核,
主频:100MHz,125DMIPS
1.5MB Flash,320KB RAM
低功耗:运行模式115μA/MHz,停止模式18μA
增强型批量数据采集模式(eBAM)
更多的外设:10通道UART,3通道CAN, 低功耗定时器,
另外还比F412多了2路DAC。

    未能找到官方演示代码中关于F413 DAC的演示,本次评测与各位分享对F413进行DAC配置的步骤方法。

选用通道:DAC通道1(GPIOA4);
输出信号:1KHZ正弦波
信号处理方式:DMA,12位DAC
触发源:TIM6

SET_CLK.jpg

STM32F413 Nucleo板上HSE晶振没有焊接,我们选用内部时钟源HSI作为系统时钟源,并配置为100MHZ。

set_dac.jpg

            使能DAC通道1

SET_TIM6.jpg

                     使能TIM6,用它来触发DAC

CONFIG_DAC.jpg

配置DAC1:
Output Buffer:Enable
Trigger:Timer 6 Trigger Out event
Wave generation mode:disable
CONFIG_TIM.jpg
配置TIM6
Prescaler(PSC - 16 bits value):0
Counter Mode:Up
Counter Period(AutoReload Registor:0xc40
Trigger Event Selection:Update Event
config_DMA.jpg

配置DMA传输
DMARequest  :DAC1
Stream  :  DMA1 Stream  5
Direction :   Menory To Preipheral
Priority  :  Low
Mode   : Circular
Inceement Address : Memory
Data width  :Half Word

代码:
  1. #include "main.h"
  2. #include "stm32f4xx_hal.h"

  3. const uint16_t Sine12bit[32] = {
  4.                       2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
  5.                       3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
  6.                       599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
  7. DAC_HandleTypeDef hdac;
  8. DMA_HandleTypeDef hdma_dac1;

  9. TIM_HandleTypeDef htim6;

  10. void SystemClock_Config(void);
  11. void Error_Handler(void);
  12. static void MX_GPIO_Init(void);
  13. static void MX_DMA_Init(void);
  14. static void MX_DAC_Init(void);
  15. static void MX_TIM6_Init(void);

  16. int main(void)
  17. {
  18.   HAL_Init();
  19.   SystemClock_Config();
  20.   MX_GPIO_Init();
  21.   MX_DMA_Init();
  22.   MX_DAC_Init();
  23.   MX_TIM6_Init();
  24.   while (1)
  25.   {
  26.   }
  27. }

  28. void SystemClock_Config(void)
  29. {
  30.   RCC_OscInitTypeDef RCC_OscInitStruct;
  31.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  32.   __HAL_RCC_PWR_CLK_ENABLE();
  33.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  34.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  35.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  36.   RCC_OscInitStruct.HSICalibrationValue = 16;
  37.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  38.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  39.   RCC_OscInitStruct.PLL.PLLM = 16;
  40.   RCC_OscInitStruct.PLL.PLLN = 200;
  41.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  42.   RCC_OscInitStruct.PLL.PLLQ = 2;
  43.   RCC_OscInitStruct.PLL.PLLR = 2;
  44.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  45.   {
  46.     Error_Handler();
  47.   }
  48.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  49.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  50.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  51.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  52.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  53.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  54.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
  55.   {
  56.     Error_Handler();
  57.   }

  58.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  59.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  60.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  61. }
  62. static void MX_DAC_Init(void)
  63. {
  64.   DAC_ChannelConfTypeDef sConfig;
  65.   hdac.Instance = DAC;
  66.   if (HAL_DAC_Init(&hdac) != HAL_OK)
  67.   {
  68.     Error_Handler();
  69.   }
  70.   sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
  71.   sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  72.   if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  73.   {
  74.     Error_Handler();
  75.   }
  76.          if (HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1,(uint32_t *) Sine12bit,32, DAC_ALIGN_12B_R) != HAL_OK)
  77.   {
  78.    
  79. Error_Handler();
  80.   }
  81. }
  82. static void MX_TIM6_Init(void)
  83. {

  84.   TIM_MasterConfigTypeDef sMasterConfig;

  85.   htim6.Instance = TIM6;
  86.   htim6.Init.Prescaler = 0;
  87.   htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  88.   htim6.Init.Period = 0xc40;
  89.   if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  90.   {
  91.     Error_Handler();
  92.   }

  93.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  94.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  95.   if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  96.   {
  97.     Error_Handler();
  98.   }
  99. HAL_TIM_Base_Start(&htim6);
  100. }
  101. static void MX_DMA_Init(void)
  102. {
  103.   __HAL_RCC_DMA1_CLK_ENABLE();
  104.   HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
  105.   HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);

  106. }
  107. static void MX_GPIO_Init(void)
  108. {
  109.   __HAL_RCC_GPIOA_CLK_ENABLE();

  110. }
复制代码

在函数 MX_DAC_Init()末尾要添加:

if (HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1,(uint32_t *) Sine12bit,32, DAC_ALIGN_12B_R) != HAL_OK)
        {
         Error_Handler();
        }
在函数MX_TIM6_Init(()末尾要添加:
HAL_TIM_Base_Start(&htim6);

    不知道为什么ST 不把启动定时器、启动DAC、启动ADC等等语句一并在STM32CUBE MX中添加进去,弄得我们这些菜鸟在老老实实按照STM32CUBE MX配置、编译完后,发现程序不能得到正确运行结果,搞得团团转,最后才知道是这个定时器并没有启动、那个DAC并没有激活。如果是因为某个外设有多种启动方式,至少可以把不同的启动方式注释后加入函数中供菜鸟们选择。让STM32CUBE MX更“傻瓜”点不是更好吗?呵呵!

sin.jpg

         运行结果
   现在,PA4可以输出1KHZ正弦波了,而主芯片在运行完外设初始化后竟然没有消耗任何资源在这个DAC上,相比采用PWM输出正弦波更具优势。不错不错!











STM32F413_DAC_HEX.rar

下载

5.56 KB, 下载次数: 26, 下载积分: ST金币 -1

评分

参与人数 1 ST金币 +5 收起 理由
zero99 + 5 赞一个!

查看全部评分

收藏 2 评论5 发布时间:2017-2-26 20:15

举报

5个回答
Stm32McuLover 回答时间:2017-2-26 20:39:29
好快呀呀呀
wenyangzeng 回答时间:2017-2-26 20:40:43
本帖最后由 wenyangzeng 于 2017-2-27 07:05 编辑

。。。。
Paderboy 回答时间:2017-2-27 08:51:23
恭喜恭喜。。。

Cube配置后都需要人工启动对应的函数。。。默认都是配置不工作。。
fengchao989 回答时间:2017-7-31 10:01:26
顺便试一下 uart10 能不能用?
wenyangzeng 回答时间:2017-7-31 21:48:02
fengchao989 发表于 2017-7-31 10:01
顺便试一下 uart10 能不能用?

查官方手册可知,虚拟串口是通过USART3连接的,USART10无法直接通过RS232与PC机连接,必须经过TTL-RS232电路转换。
无标题.png

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版