找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10256|回复: 0
打印 上一主题 下一主题
收起左侧

STM32F4__定时器溢出触发DAC转换DMA传输

[复制链接]
跳转到指定楼层
楼主
ID:90014 发表于 2015-9-14 18:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
    全部工程奉上 注释完美
*/



/* 添加 DAC 的头文件                                                                                          */


#include "dac.h"


/* 定义DAC数据全局变量 */
uint16_t DAC_Buff[2]={0xfff<<4,0<<4};


/*
        串口初始化配置 无返回值 无参数
        初始化USART1 TX---GPIOA9   RX---GPIOA10
        波特率:115200
        奇偶校验:无
        停止位:1
        硬件流失能
        8位数据位
        使能发送
*/
void USART_Configuration(void)
{
        /* 定义USART初始化结构体 */
       
        USART_InitTypeDef        USART_InitStructure;
       
        /* 失能GPIOA 时钟 */
       
        RCC->AHB1ENR|=RCC_AHB1Periph_GPIOA;
       
        /* 失能USART1的时钟 */
       
        RCC->APB2ENR|=RCC_APB2Periph_USART1;
       
        /* 设置 GPIOA9 GPIOA10 为复用模式 */
       
        GPIOA->MODER|=GPIO_Mode_AF<<2*9|GPIO_Mode_AF<<2*10;
       
        /* 复用 GPIOA9 到USART1 */
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
       
        /* 复用 GPIOA10 到 USART1 */
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
       
       
        USART_InitStructure.USART_BaudRate=115200; /* 配置波特率为115200 */
       
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; /* 硬件流失能 */
       
        USART_InitStructure.USART_Mode=USART_Mode_Tx; /* USART1模式为发送模式 */
       
        USART_InitStructure.USART_Parity=USART_Parity_No; /* 奇偶校验失能 */
       
        USART_InitStructure.USART_StopBits=USART_StopBits_1; /*  停止位为1位 */
       
        USART_InitStructure.USART_WordLength=USART_WordLength_8b; /* 数据长度为8位 */
       
        /* 根据USART_InitStructure 结构体初始化 USART1 */
       
        USART_Init(USART1,&USART_InitStructure);
       
        /* 开启USART1 */
       
        USART_Cmd(USART1,ENABLE);
       
}


/*
        重映射USART1到printf
        使printf能打印数据到串口
        无参数 返回打印的字符串
*/


int fputc(int ch, FILE *f )
{
        /* 给USART1->DR 赋值就可以将数据发送出去 */
       
        USART1->DR=ch;
       
        /* 等待数据发送完毕 */
       
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
       
        /* 返回发送成功的数据 */
       
        return ch;
       
}


/*
        TIM2基本功能初始化函数
        参数:无
        返回值:无
*/


void TIM_Configuration(void)
{
        /* 定义设置TIM2的结构体 */
       
        TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
       
        /* 使能 TIM2 的时钟 */
       
        RCC->APB1ENR|=RCC_APB1Periph_TIM2;
       
        TIM_TimeBaseStructure.TIM_ClockDivision=0; /* 时钟不分割 */
       
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 计数器为向上计数模式 */
       
        TIM_TimeBaseStructure.TIM_Period=9999; /* 经过9999+1个脉冲溢出一次 */
       
        TIM_TimeBaseStructure.TIM_Prescaler=8399; /* 时钟分频值为8399+1=8400 */
       
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0; /* 重复计数器设置为0 */
       
        /* 使用配置好的结构体初始化TIM2 */
       
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
       
        /* 启动计数器 */
       
        TIM_Cmd(TIM2,ENABLE);
       
          /* 配置TIM2触发源 */
          
        TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);


        /* 开启TIM2 溢出中断 */
       
//        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
       
}


/*
        DAC初始化函数
        参数:无
        返回值:无
        DAC 通道1 对应GPIOA4
*/


void DAC_Configuration(void)
{
        /* 定义 DAC 初始化的结构体 */
       
        DAC_InitTypeDef        DAC_InitStructure;
       
        /* 开启DAC 时钟 */
       
        RCC->APB1ENR|=RCC_APB1Periph_DAC;
       
        /* 开启 GPIOA 时钟 */
       
        RCC->AHB1ENR|=RCC_AHB1Periph_GPIOA;
       
        /* GPIOA4 设置为模拟输入 */
       
        GPIOA->MODER|=GPIO_Mode_AIN<<2*4;
       
        DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0; /* 屏蔽幅值 设置 */
       
        DAC_InitStructure.DAC_OutputBuffer=DAC_OutputBuffer_Enable; /* 启用输出缓冲 */
       
        DAC_InitStructure.DAC_Trigger=DAC_Trigger_T2_TRGO; /* 使用TIM2的溢出触发DAC */
       
        DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None; /* 不使用波形发生器 */


        /* 配置DAC的通道1 */
       
        DAC_Init(DAC_Channel_1, &DAC_InitStructure);
       
        /*启动DAC的通道1 */
       
        DAC_Cmd(DAC_Channel_1,ENABLE);
       
        /* 设置DAC通道1 数据12位右对齐 输出0对用的模拟电压*/
       
        DAC_SetChannel1Data(DAC_Align_12b_R,0);
       
}


/*
        DMA配置为 为DAC传送数据
        参数;无
        返回值:无
*/


void DMA_Configuration(void)
{
        /* 定义设置DMA的结构体 */
       
        DMA_InitTypeDef        DMA_InitStructure;
       
        /* 开启DMA1的时钟 */
       
        RCC->AHB1ENR|=RCC_AHB1Periph_DMA1;
       
        DMA_InitStructure.DMA_Channel = DMA_Channel_7; /* 通道选择DAC1 */
       
        DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&(DAC->DHR12R1); /* DMA外设地址 DAC通道1数据12位右对齐寄存器 [15:4] */
       
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DAC_Buff; /* DMA 存储器0地址 */


        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; /* 存储器到外设模式 */
       
        DMA_InitStructure.DMA_BufferSize = 2; /* 数据传输量 */


        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*外设非增量模式 */
       
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable ;//DMA_MemoryInc_Enable; /* 存储器增量模式 */
       
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; /* 外设数据长度:16位 */
       
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; /* 存储器数据长度:16位 */
         
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /* 使用循环模式 */
       
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /* 中等优先级 */
       
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; /* 不使用FIFO */        
       
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; /* 不使用FIFO */
       
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; /* 存储器突发单次传输 */
       
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; /* 外设突发单次传输 */
       
        /* 初始化DMA Stream DMA1 的第5个流的通道7 */
       
        DMA_Init(DMA1_Stream5,&DMA_InitStructure);
       
        /* 启动DAM1的通道5 */
       
        DMA_Cmd(DMA1_Stream5,ENABLE);
       
        /* 清除DMA传输完成标记 */
       
//        DMA_ClearITPendingBit(DMA2_Stream5,DMA_IT_TCIF7);


        /* 开启DMA传输完成中断 */


//        DMA_ITConfig(DMA2_Stream7,DMA_IT_TC,ENABLE);


        /* 使能DAC的DMA请求 */
       
        DAC_DMACmd(DAC_Channel_1,ENABLE);


}













分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表