功能描述:配置STM32F405RGT6的DAC,通过TIM2定时1秒触发DAC,在PA5上输出2V的电压。注意这里每1秒TIM2都会产生更新事件进而触发DAC,即DAC每秒都会被触发一次。
- main.c文件内容如下
#include "stm32f4xx.h" // Device header #include "Timer.h" #include "MyDAC.h" int main(void) { Timer_Init(); //初始化定时器 MyDAC_Init(); //初始化DAC MyDAC_SetData(DAC_Channel_2, DAC_Align_12b_R, 2482); //设置DAC通道2输出2V电压 while(1) { } }
-
MyDAC.c文件内容如下
#include "MyDAC.h" /** * @摘要 初始化DAC * @参数 无 * @返回值 无 * @说明 无 */ void MyDAC_Init(void) { //开启GPIOA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //定义GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStructure; //初始化上述结构体 GPIO_StructInit(&GPIO_InitStructure); //配置GPIO模式为模拟模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //配置GPIO的速度为高速100MHZ GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed; //指定GPIO引脚为Pin5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //初始化对应的GPIO GPIO_Init(GPIOA, &GPIO_InitStructure); //开启DAC时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); //定义DAC初始化结构体 DAC_InitTypeDef DAC_InitStruct; //初始化上述结构体 DAC_StructInit(&DAC_InitStruct); //配置DAC的触发源为TIM2硬件触发 DAC_InitStruct.DAC_Trigger = DAC_Trigger_T2_TRGO; //配置生成波形为不生成 DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None; //波形生成幅度(此处无用) DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; //开启输出缓冲器 DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Enable; //初始化DAC DAC_Init(DAC_Channel_2, &DAC_InitStruct); //使能DAC DAC_Cmd(DAC_Channel_2, ENABLE); } /** * @摘要 设置DAC的输出电压 * @参数 DAC_Channel:指定DAC通道 * @参数 DAC_Align:指定数据对齐方式 * 可以为下列这些值 * @arg DAC_Align_8b_R: 8bit right data alignment selected * @arg DAC_Align_12b_L: 12bit left data alignment selected * @arg DAC_Align_12b_R: 12bit right data alignment selected * @参数 Data:写入保持寄存器的数据 * @返回值 无 * @说明 无 */ void MyDAC_SetData(uint32_t DAC_Channel, uint32_t DAC_Align, uint16_t Data) { if(DAC_Channel == DAC_Channel_1) DAC_SetChannel1Data(DAC_Align, Data); else if(DAC_Channel == DAC_Channel_2) DAC_SetChannel2Data(DAC_Align, Data); } /** * @摘要 软件触发DAC * @参数 无 * @返回值 无 * @说明 无 */ void MyDAC_SoftwareTrigger(uint32_t DAC_Channel) { DAC_SoftwareTriggerCmd(DAC_Channel, ENABLE); }
- MyDAC.h文件内容如下
#ifndef __MYDAC_H #define __MYDAC_H #include "stm32f4xx.h" // Device header void MyDAC_Init(void); void MyDAC_SetData(uint32_t DAC_Channel, uint32_t DAC_Align, uint16_t Data); void MyDAC_SoftwareTrigger(uint32_t DAC_Channel); #endif
- Timer.c文件内容如下
#include "Timer.h" /** * @摘要 初始化TIM * @参数 无 * @返回值 无 * @说明 无 */ void Timer_Init(void) { //开启TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //选择TIM2的时钟模式为内部模式,时钟源为内部时钟(42*2=84MHZ) TIM_InternalClockConfig(TIM2); //定义时基单元初始化结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //初始化上述结构体 TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure); //配置预分频系数为8400 TIM_TimeBaseInitStructure.TIM_Prescaler = 8400-1; //配置自动重装值为10000 TIM_TimeBaseInitStructure.TIM_Period = 10000-1; //配置计数模式为向上计数 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //配置定时器时钟频率与数字滤波器所使用的采样时钟之间的分频比 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //配置重复计数器的值为0 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //初始化时基单元 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //TIM2主模式下TRGO的触发源为更新事件 TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); //开启TIM2,此时计数器开始工作 TIM_Cmd(TIM2, ENABLE); }
- Timer.h文件内容如下
#ifndef __TIMER_H #define __TIMER_H #include "stm32f4xx.h" // Device header void Timer_Init(void); #endif