之前和大家分享了STM32U083RC的DAC的经验,今天和大家分享一下在低功耗下DAC的输出功能。
首先继续和大家分享一下DAC的一些知识
一:DAC的触发来源
1.1如果TENx位被置1,DAC转换可以由某外部事件触发(定时器计数器、外部中断线)。配置控制位TSELx[2:0]可以选择8个触发事件之一触发DAC转换。
每次DAC接口侦测到来自选中的定时器TRGO输出,或者外部中断线9的上升沿,最近存放在寄存器DAC DHRx中的数据会被传送到寄存器DAC DORx中。在3个APB1时钟周期后,寄存器DAC DORx更新为新值。
如果选择软件触发,一旦SWTRIG位置’1’,转换即开始。在数据从DAC DHRx寄存器传送到DAC DORx寄存器后,SWTRIG位由硬件自动清'0'。
1.2 DAC输出电压
数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。任-DAC通道引脚上的输出电压满足下面的关系:DAC输出=VREFx(DOR/4095)。
1.3 使能DAC通道
将DAC CR寄存器的ENx位置’1’即可打开对DAC通道x的供电。经过一段启动时间twAKEUP,DAC通道x即被使能。
ENx位只会使能DAC通道x的模拟部分,即便该位被置0,DAC通道x的数字部分仍然工作
1.4 使能DAC输出缓存
DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以通过设置DAC CR寄存器的BOFFx位来使能或者关闭。
这里 STM32 的 DAC 输出缓存做的有些如果使能的话,虽然输出能力强一点,但是输出没法到 0,所以我们不使用输出缓存。
二:DAC通道1的相关寄存器
DAC控制寄存器 DAC_CR
DAC软件触发寄存器DAC_SWTRIGR
DAC通道1的12位右对齐数据保持寄存器DAC_DHR12R1
DAC通道1的12位左对齐数据保持寄存器DAC_DHR12L1
DAC通道1的8位右对齐数据保持寄存器DAC_DHR8R1
DAC通道1数据输出寄存器DAC_DOR1
2.1 DAC控制寄存器DAC_CR
2.2 DAC通道1的12位右对齐数据保持寄存器DAC_DHR12R1
2.3 DAC通道1的12位左对齐数据保持寄存器DAC_DHR12L1
2.4 DAC通道1的8位右对齐数据保持寄存器DAC_DHR8R1
2.5 DAC通道1数据输出寄存器DAC_DOR1
三:软件编写步骤如下所示:
3.1 开始PA口的时钟,同时设置PA4为输入模式
3.2 使能DAC1时钟(由STM32cube 软件自动开启)
3.3 等待外部按键按下后,初始化DAC功能,同时设置DAC的工作模式
3.4 使能DAC的转换通道、设置DAC的输出值、DAC开始输出
3.5 设定程序进入睡眠模式
四:软件代码如下所示:
if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_8B_R, 0xFF) != HAL_OK) { /* Setting value Error */ Error_Handler(); } if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } while (UserButtonStatus == 0) { } UserButtonStatus = 0; RCC_OscInitStruct_LSI.OscillatorType = RCC_OSCILLATORTYPE_LSI; RCC_OscInitStruct_LSI.LSIState = RCC_LSI_ON; RCC_OscInitStruct_LSI.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig(&RCC_OscInitStruct_LSI); if (HAL_DAC_Stop(&hdac1, DAC_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } if (HAL_DAC_DeInit(&hdac1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } if (HAL_DAC_Init(&hdac1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_ENABLE; sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_INTERNAL; sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY; sConfig.DAC_SampleAndHoldConfig.DAC_SampleTime = 20; sConfig.DAC_SampleAndHoldConfig.DAC_HoldTime = 10; sConfig.DAC_SampleAndHoldConfig.DAC_RefreshTime = 5; if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) { /* Channel configuration Error */ Error_Handler(); } if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_8B_R, 0xFF) != HAL_OK) { /* Setting value Error */ Error_Handler(); } if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK) { /* Start Error */ Error_Handler(); } HAL_SuspendTick(); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
外部中断PC13 处理函数如下所示:
/* USER CODE BEGIN 4 */ /** * @brief EXTI line detection callbacks * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == BUTTON_USER_PIN) { UserButtonStatus = 1; } }
实物验证如下所示: