STM32F429 HAL库 DAC+DMA+TIM6外部触发产生波形

DAC配置

DAC_HandleTypeDef DAC1_Handler;//DAC句柄
void DAC_Timer_Init(u16 arr,u16 psc);

//初始化DAC
void DAC1_Init(void)
{
    DAC_ChannelConfTypeDef DACCH1_Config;
    
    DAC1_Handler.Instance=DAC;
    HAL_DAC_Init(&DAC1_Handler);                 //初始化DAC
    
    DACCH1_Config.DAC_Trigger=DAC_TRIGGER_T6_TRGO;             //定时器2的更新触发
    DACCH1_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;//DAC1输出缓冲关闭
    HAL_DAC_ConfigChannel(&DAC1_Handler,&DACCH1_Config,DAC_CHANNEL_1);//DAC通道1配置
    
    HAL_DAC_Start(&DAC1_Handler,DAC_CHANNEL_1);  //开启DAC通道1
	
	DACDMA_Config();//初始化DMA
	
	DAC_Timer_Init(90-1,1);
}

//DAC底层驱动,时钟配置,引脚 配置
//此函数会被HAL_DAC_Init()调用
//hdac:DAC句柄
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{      
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_DAC_CLK_ENABLE();             //使能DAC时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();			//开启GPIOA时钟
	
    GPIO_Initure.Pin=GPIO_PIN_4;            //PA4
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}

TIM6配置

TIM_HandleTypeDef TIM6_Handler;      //定时器句柄

//通用定时器6中断初始化
//arr:自动重装值
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器6!
void DAC_Timer_Init(u16 arr,u16 psc)                        //定时器6初始化
{
	__HAL_RCC_TIM6_CLK_ENABLE();                            //使能TIM6时钟
	
    TIM6_Handler.Instance=TIM6;                             //通用定时器6
    TIM6_Handler.Init.Prescaler=arr;                     	//分频系数
    TIM6_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;       //向上计数器
    TIM6_Handler.Init.Period=psc;                        	//自动装载值
    TIM6_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频因子
    HAL_TIM_Base_DeInit(&TIM6_Handler);                     //时基复位
    HAL_TIM_Base_Init(&TIM6_Handler);						//定时器6初始化
	TIM6->CR2 &= ~(0x0070);									//清除定时器6MMS位
	TIM6->CR2 |= 0x0020;									//选择定时器更新事件作为触发输出
	__HAL_TIM_ENABLE(&TIM6_Handler);						//开启定时器6
}

DMA配置

DMA_HandleTypeDef  DAC1DMA_Handler;      //DMA句柄

//DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
void DACDMA_Config(void)
{ 
    __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能 
    
    //Tx DMA配置
    DAC1DMA_Handler.Instance=DMA1_Stream5;                            //数据流选择
    DAC1DMA_Handler.Init.Channel=DMA_CHANNEL_7;                                //通道选择
    DAC1DMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
    DAC1DMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    DAC1DMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    DAC1DMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;    //外设数据长度:16位
    DAC1DMA_Handler.Init.MemDataAlignment=DMA_PDATAALIGN_HALFWORD;       //存储器数据长度:16位
    DAC1DMA_Handler.Init.Mode=DMA_CIRCULAR;                            //循环模式
    DAC1DMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    DAC1DMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    DAC1DMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    DAC1DMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    DAC1DMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
    
    HAL_DMA_DeInit(&DAC1DMA_Handler);   
    HAL_DMA_Init(&DAC1DMA_Handler);
	
	DMA1_Stream5->CR|=1;	//使能DMA(别用什么辣鸡库函数了)
	
	__HAL_LINKDMA(&DAC1_Handler,DMA_Handle1,DAC1DMA_Handler);    //将DMA与DAC1联系起来
	
	//启动DAC和DMA
	HAL_DAC_Start_DMA(&DAC1_Handler,DAC_CHANNEL_1,(uint32_t*)TriWave_Value, 210,DAC_ALIGN_12B_R);
} 

三角波数据

//210个点
u16 TriWave_Value[]={0 ,
39 ,78 ,117 ,156 ,195 ,234 ,273 ,312 ,351 ,390 ,429 ,468 ,507 ,546 ,585 ,624 ,663 ,702 ,741 ,780 ,819 ,858 ,897 ,936 ,975 ,
1014 ,1053 ,1092 ,1131 ,1170 ,1209 ,1248 ,1287 ,1326 ,1365 ,1404 ,1443 ,1482 ,1521 ,1560 ,1599 ,1638 ,1677 ,1716 ,1755 ,1794 ,1833 ,1872 ,1911 ,1950 ,
1989 ,2028 ,2067 ,2106 ,2145 ,2184 ,2223 ,2262 ,2301 ,2340 ,2379 ,2418 ,2457 ,2496 ,2535 ,2574 ,2613 ,2652 ,2691 ,2730 ,2769 ,2808 ,2847 ,2886 ,2925 ,
2964 ,3003 ,3042 ,3081 ,3120 ,3159 ,3198 ,3237 ,3276 ,3315 ,3354 ,3393 ,3432 ,3471 ,3510 ,3549 ,3588 ,3627 ,3666 ,3705 ,3744 ,3783 ,3822 ,3861 ,3900 ,
3939 ,3978 ,4017 ,4056 ,4095 ,4056 ,4017 ,3978 ,3939 ,3900 ,3861 ,3822 ,3783 ,3744 ,3705 ,3666 ,3627 ,3588 ,3549 ,3510 ,3471 ,3432 ,3393 ,3354 ,3315 ,
3276 ,3237 ,3198 ,3159 ,3120 ,3081 ,3042 ,3003 ,2964 ,2925 ,2886 ,2847 ,2808 ,2769 ,2730 ,2691 ,2652 ,2613 ,2574 ,2535 ,2496 ,2457 ,2418 ,2379 ,2340 ,
2301 ,2262 ,2223 ,2184 ,2145 ,2106 ,2067 ,2028 ,1989 ,1950 ,1911 ,1872 ,1833 ,1794 ,1755 ,1716 ,1677 ,1638 ,1599 ,1560 ,1521 ,1482 ,1443 ,1404 ,1365 ,
1326 ,1287 ,1248 ,1209 ,1170 ,1131 ,1092 ,1053 ,1014 ,975 ,936 ,897 ,858 ,819 ,780 ,741 ,702 ,663 ,624 ,585 ,546 ,507 ,468 ,429 ,390 ,
351 ,312 ,273 ,234 ,195 ,156 ,117 ,78 ,39};

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值