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

查看: 3645|回复: 5

[STM32F413] STM32F413 Nucleo评测(DAC)

[复制链接]

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
发表于 2017-2-26 20:15:32 | 显示全部楼层 |阅读模式
本帖最后由 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, 下载次数: 24, 下载积分: ST金币 -1

评分

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

查看全部评分

<
回复

使用道具 举报

64

主题

744

回帖

23

蝴蝶豆

实习版主

最后登录
2020-12-8
发表于 2017-2-26 20:39:29 | 显示全部楼层
好快呀呀呀
回复 支持 反对

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2017-2-26 20:40:43 | 显示全部楼层
本帖最后由 wenyangzeng 于 2017-2-27 07:05 编辑

。。。。
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2017-2-27 08:51:23 | 显示全部楼层
恭喜恭喜。。。

Cube配置后都需要人工启动对应的函数。。。默认都是配置不工作。。
回复 支持 反对

使用道具 举报

1

主题

10

回帖

0

蝴蝶豆

初级会员

最后登录
2018-3-2
发表于 2017-7-31 10:01:26 | 显示全部楼层
顺便试一下 uart10 能不能用?
回复 支持 反对

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2017-7-31 21:48:02 | 显示全部楼层
fengchao989 发表于 2017-7-31 10:01
顺便试一下 uart10 能不能用?

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

回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版