今天搞了一下DAC,通道1,PA4。
原理图:
代码:
- #include "main.h"
- /* Private includes ----------------------------------------------------------*/
- /* USER CODE BEGIN Includes */
- /* USER CODE END Includes */
- /* Private typedef -----------------------------------------------------------*/
- /* USER CODE BEGIN PTD */
- /* USER CODE END PTD */
- /* Private define ------------------------------------------------------------*/
- /* USER CODE BEGIN PD */
- /* USER CODE END PD */
- /* Private macro -------------------------------------------------------------*/
- /* USER CODE BEGIN PM */
- /* USER CODE END PM */
- /* Private variables ---------------------------------------------------------*/
- DAC_HandleTypeDef hdac1;
- /* USER CODE BEGIN PV */
- /* Private variables ---------------------------------------------------------*/
- __IO uint32_t UserButtonStatus = 0; /* set to 1 after Wkup/Tamper push-button interrupt */
- /* USER CODE END PV */
- /* Private function prototypes -----------------------------------------------*/
- void SystemClock_Config(void);
- static void SystemPower_Config(void);
- static void MX_ICACHE_Init(void);
- static void MX_GPIO_Init(void);
- static void MX_DAC1_Init(void);
- /* USER CODE BEGIN PFP */
- /* Private function prototypes -----------------------------------------------*/
- /* USER CODE END PFP */
- /* Private user code ---------------------------------------------------------*/
- /* USER CODE BEGIN 0 */
- /* USER CODE END 0 */
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] The application entry point.
- * @retval int
- */
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- DAC_ChannelConfTypeDef sConfig;
- /* STM32U5xx HAL library initialization:
- - Configure the Flash prefetch
- - Configure the Systick to generate an interrupt each 1 msec
- - Set NVIC Group Priority to 3
- - Low Level Initialization
- */
- /* USER CODE END 1 */
- /* MCU Configuration--------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE BEGIN Init */
- /* USER CODE END Init */
- /* Configure the system clock */
- SystemClock_Config();
- /* Configure the System Power */
- SystemPower_Config();
- /* USER CODE BEGIN SysInit */
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_ICACHE_Init();
- MX_GPIO_Init();
- MX_DAC1_Init();
- /* USER CODE BEGIN 2 */
- /* Configure LED3 */
- BSP_LED_Init(LED3);
- /* Initialize the Wkup/Tamper push-button.
- It is used for changing the gain */
- BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);
- /*##########################################################################*/
- /*## NORMAL POWER MODE #####################################################*/
- /*##-0- Set DAC Channel1 DHR register ######################################*/
- if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_8B_R, 0xFF) != HAL_OK)
- {
- /* Setting value Error */
- Error_Handler();
- }
- /*##-1- Enable DAC Channel1 ################################################*/
- if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK)
- {
- /* Start Error */
- Error_Handler();
- }
- /*##########################################################################*/
- /*## LOW POWER MODE ########################################################*/
- /* Wait UserButtonStatus pushed */
- while (UserButtonStatus == 0)
- {
- }
- UserButtonStatus = 0;
- if (HAL_DAC_Stop(&hdac1, DAC_CHANNEL_1) != HAL_OK)
- {
- /* Start Error */
- Error_Handler();
- }
- /*## DeInit the DAC peripheral ##########################################*/
- if (HAL_DAC_DeInit(&hdac1) != HAL_OK)
- {
- /* Initialization Error */
- Error_Handler();
- }
- /*## Configure the DAC peripheral #######################################*/
- if (HAL_DAC_Init(&hdac1) != HAL_OK)
- {
- /* Initialization Error */
- Error_Handler();
- }
- /*## Configure DAC channel1 #############################################*/
- sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_ENABLE;
- if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
- {
- /* Channel configuration Error */
- Error_Handler();
- }
- /*## Set DAC Channel1 DHR register ######################################*/
- if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_8B_R, 0xFF) != HAL_OK)
- {
- /* Setting value Error */
- Error_Handler();
- }
- /*## Enable DAC Channel1 ################################################*/
- if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK)
- {
- /* Start Error */
- Error_Handler();
- }
- /*Suspend Tick increment to prevent wakeup by Systick interrupt.
- Otherwise the Systick interrupt will wake up the device within 1ms (HAL time base)*/
- HAL_SuspendTick();
- /* Enter SLEEP Mode , wake up is done once Key push button is pressed */
- HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
- /**
- * @brief System Clock Configuration
- * @retval None
- */
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- /** Configure the main internal regulator output voltage
- */
- if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
- {
- Error_Handler();
- }
- /** Initializes the CPU, AHB and APB busses clocks
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI
- |RCC_OSCILLATORTYPE_MSI;
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
- RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
- RCC_OscInitStruct.LSIState = RCC_LSI_ON;
- RCC_OscInitStruct.MSIState = RCC_MSI_ON;
- RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
- RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4;
- RCC_OscInitStruct.LSIDiv = RCC_LSI_DIV1;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
- RCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV1;
- RCC_OscInitStruct.PLL.PLLM = 1;
- RCC_OscInitStruct.PLL.PLLN = 80;
- RCC_OscInitStruct.PLL.PLLP = 2;
- RCC_OscInitStruct.PLL.PLLQ = 2;
- RCC_OscInitStruct.PLL.PLLR = 2;
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_0;
- RCC_OscInitStruct.PLL.PLLFRACN = 0;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- /** Initializes the CPU, AHB and APB busses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
- |RCC_CLOCKTYPE_PCLK3;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
- {
- Error_Handler();
- }
- }
- /**
- * @brief Power Configuration
- * @retval None
- */
- static void SystemPower_Config(void)
- {
- /*
- * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral
- */
- HAL_PWREx_DisableUCPDDeadBattery();
- /*
- * Switch to SMPS regulator instead of LDO
- */
- if (HAL_PWREx_ConfigSupply(PWR_SMPS_SUPPLY) != HAL_OK)
- {
- Error_Handler();
- }
- }
- /**
- * @brief DAC1 Initialization Function
- * @param None
- * @retval None
- */
- static void MX_DAC1_Init(void)
- {
- /* USER CODE BEGIN DAC1_Init 0 */
- /* USER CODE END DAC1_Init 0 */
- DAC_ChannelConfTypeDef sConfig = {0};
- DAC_AutonomousModeConfTypeDef sAutonomousMode = {0};
- /* USER CODE BEGIN DAC1_Init 1 */
- /* USER CODE END DAC1_Init 1 */
- /** DAC Initialization
- */
- hdac1.Instance = DAC1;
- if (HAL_DAC_Init(&hdac1) != HAL_OK)
- {
- Error_Handler();
- }
- /** DAC channel OUT1 config
- */
- sConfig.DAC_HighFrequency = DAC_HIGH_FREQUENCY_INTERFACE_MODE_DISABLE;
- sConfig.DAC_DMADoubleDataMode = DISABLE;
- sConfig.DAC_SignedFormat = DISABLE;
- sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_ENABLE;
- sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
- sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
- sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_EXTERNAL;
- 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)
- {
- Error_Handler();
- }
- /** Configure Autonomous Mode
- */
- sAutonomousMode.AutonomousModeState = DAC_AUTONOMOUS_MODE_DISABLE;
- if (HAL_DACEx_SetConfigAutonomousMode(&hdac1, &sAutonomousMode) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN DAC1_Init 2 */
- /* USER CODE END DAC1_Init 2 */
- }
- /**
- * @brief ICACHE Initialization Function
- * @param None
- * @retval None
- */
- static void MX_ICACHE_Init(void)
- {
- /* USER CODE BEGIN ICACHE_Init 0 */
- /* USER CODE END ICACHE_Init 0 */
- /* USER CODE BEGIN ICACHE_Init 1 */
- /* USER CODE END ICACHE_Init 1 */
- /** Enable instruction cache in 1-way (direct mapped cache)
- */
- if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_ICACHE_Enable() != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN ICACHE_Init 2 */
- /* USER CODE END ICACHE_Init 2 */
- }
- /**
- * @brief GPIO Initialization Function
- * @param None
- * @retval None
- */
- static void MX_GPIO_Init(void)
- {
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- }
- /* USER CODE BEGIN 4 */
- /**
- * @brief EXTI line detection callbacks
- * @param GPIO_Pin: Specifies the pins connected EXTI line
- * @retval None
- */
- void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
- {
- if (GPIO_Pin == BUTTON_USER_PIN)
- {
- UserButtonStatus = 1;
- }
- }
- /* USER CODE END 4 */
- /**
- * @brief This function is executed in case of error occurrence.
- * @retval None
- */
- void Error_Handler(void)
- {
- /* USER CODE BEGIN Error_Handler_Debug */
- /* Turn LED3 on */
- BSP_LED_On(LED3);
- while(1)
- {
- }
- /* USER CODE END Error_Handler_Debug */
- }
- #ifdef USE_FULL_ASSERT
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval None
- */
- void assert_failed(uint8_t *file, uint32_t line)
- {
- /* USER CODE BEGIN 6 */
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- /* USER CODE END 6 */
- }
- #endif /* USE_FULL_ASSERT */
效果图:
|