
前言 NUCLEO-L4R5ZI是 ST 新推出的一款以 L4+系列STM32L4R5ZI芯片为核心的实验板。在当前便携式、低功耗应用越来越广泛的情况下,L4+系列芯片的确有很大吸引力:核心最高工作频率 120MHz,比 L4 系列的有40MHz 的提高,最大片内 FLASH 和 SRAM也增加了一倍,分别达到 2 Mbytes 和 640 Kbytes。不多介绍,直接上板子实物图如下: - {- \2 Z) l+ i; }0 r' X![]() 拿到板子后,最想试用一下数模转换 DAC 功能,最简便的方法就是参考丰富的 ST例程。于是乎直接打开 STM32L4+系列的 Cube 库文件夹 STM32Cube_FW_L4_V1.11.0,这才发现 NUCLEO-L4R5ZI板子的 DAC 的例子程序还没有加入进去。没有也不是事儿,同一个系列的 MCU 有很多相似之处,再此参考 NUCLEO-L496ZG 的例子,稍作修改之后即可。 实验步骤 一, 建立基于 NUCLEO-L4R5ZI实验板的 DAC 测试工程 1. 打开 STM32CubeMX,新建工程,选择实验板型号:NUCLEO-L4R5ZI,并选择默认引脚配置。 2. 在 Pinout 页面使能 DAC,设置DAC1 的 OUT1 mode 为 Connected toexternal pin only。设置 TIM6 为Activated,用作 DAC 的触发。设置 USART3 的 mode为 disable,配置USB_OTG_FS 的 mode 为 disable。 3. 在 Clock Configuration 页将 HSI选为高速时钟源(因为实验板上没有表贴8MHz 外部晶振 X3),同时将 PLLM1设置为“/2”。将 RCC 中的 HSE设置为Disable。 4. 在 Configuration 页中为 DAC 添加一个 DMA 传输通道 DAC1_CH1,其传输模式为 circular,数据宽度为 Byte。使能 NVIC 中的 EXTI Line[15:10] interrupts,作为用户按键的中断处理函数。 5. 在 Project 菜单项中选择 Project Settings 进行工程相关设置。工程名为DACWaveGen,选择本机 IDE 工具链。 6. 生成工程代码,在 main()函数主循环中加入 LED 点亮程序,下载程序到实验板,初步测试基本功能正常。代码如下: HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7, GPIO_PIN_SET); 7. 在 main.c 文件中加入变量,代码如下 __IOuint8_t ubKeyPressed = SET; __IOuint8_t ubSelectedWavesForm = 1; staticDAC_ChannelConfTypeDef sConfig; constuint8_t aEscalator8bit[6] = {0x0, 0x33, 0x66, 0x99, 0xCC, 0xFF}; 在main.c 文件中加入一个用户按键外部中断回调函数,一个定时器配置函数和三个波形生成函数,代码如下: 外部中断回调函数: voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { ubKeyPressed= 1; ubSelectedWavesForm++; if(ubSelectedWavesForm== 4) ubSelectedWavesForm = 1; } 定时器配置函数: voidTIM6_Config(void) { TIM_MasterConfigTypeDefsMasterConfig; htim6.Init.Period= 0x7FF; htim6.Init.Prescaler= 0; htim6.Init.ClockDivision= 0; htim6.Init.CounterMode= TIM_COUNTERMODE_UP; htim6.Init.RepetitionCounter= 0; HAL_TIM_Base_Init(&htim6); sMasterConfig.MasterOutputTrigger= TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode= TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim6,&sMasterConfig); HAL_TIM_Base_Start(&htim6); } 三角波生成函数: staticvoid DAC_Ch1_TriangleConfig(void) { if(HAL_DAC_Init(&hdac1) != HAL_OK) {Error_Handler(); } sConfig.DAC_Trigger= DAC_TRIGGER_T6_TRGO; sConfig.DAC_OutputBuffer= DAC_OUTPUTBUFFER_ENABLE; if(HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) {Error_Handler(); } if(HAL_DACEx_TriangleWaveGenerate(&hdac1, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_1023)!= HAL_OK) {Error_Handler(); } if(HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK) {Error_Handler(); } if(HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100) != HAL_OK) {Error_Handler(); } } 阶梯波生成函数: staticvoid DAC_Ch1_EscalatorConfig(void) { if(HAL_DAC_Init(&hdac1) != HAL_OK) {Error_Handler(); } sConfig.DAC_Trigger= DAC_TRIGGER_T6_TRGO; sConfig.DAC_OutputBuffer= DAC_OUTPUTBUFFER_ENABLE; if(HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) {Error_Handler(); } if(HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t *)aEscalator8bit, 6, DAC_ALIGN_8B_R)!= HAL_OK) {Error_Handler(); } } 噪声波生成函数: staticvoid DAC_Ch1_NoiseConfig(void) { if(HAL_DAC_Init(&hdac1) != HAL_OK) {Error_Handler(); } sConfig.DAC_Trigger= DAC_TRIGGER_T6_TRGO; sConfig.DAC_OutputBuffer= DAC_OUTPUTBUFFER_ENABLE; if(HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) {Error_Handler(); } if(HAL_DACEx_NoiseWaveGenerate(&hdac1, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_1023)!= HAL_OK) {Error_Handler(); } if(HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK) {Error_Handler(); } if (HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100) != HAL_OK) {Error_Handler(); } } 最后在main()函数的主循环中加入程序分支控制,代码如下: if(ubKeyPressed != RESET) { HAL_DAC_DeInit(&hdac1); if(ubSelectedWavesForm == 1) { DAC_Ch1_TriangleConfig(); } elseif(ubSelectedWavesForm == 2) { DAC_Ch1_EscalatorConfig(); } elseif(ubSelectedWavesForm == 3) { DAC_Ch1_NoiseConfig(); } ubKeyPressed= RESET; } ' c6 ?; d9 e+ l* N 测量结果 0 ]* T/ {2 Q$ ~% r' f# }8 t0 n 将上述程序编译下载至开发板,通过 USB线将开发板与电脑相连,用示波器测量PA4引脚信号,如下图所示: ![]() 系统上电之后,可以看到三角波输出,如下图: # u4 s4 |' I+ i![]() 按下用户按键,输出阶梯波形,如下图: - q( f* d, N U u" ~0 w![]() 再次按下用户按键,输出噪声波形,如下图: ![]() 将噪声波沿时间轴展开,如下图 ; L' O, W: A* n; Z3 X![]() 相关STM32CubeMX 工程文件,详见附件。 ![]() |
学习了 |