初级会员

- 积分
- 179
- 金钱
- 179
- 注册时间
- 2018-10-2
- 在线时间
- 26 小时
|

楼主 |
发表于 2019-5-24 18:36:44
|
显示全部楼层
////////dac
#include "dac.h"
#include "dma.h"
DAC_HandleTypeDef DAC1_Handler;//DAC句柄
//初始化DAC
void DAC1_Init(void)
{
DAC_ChannelConfTypeDef DACCH1_Config;
DAC1_Handler.Instance=DAC;
DAC1_Handler.DMA_Handle1=&DAC1_DMA_Handler;
HAL_DAC_Init(&DAC1_Handler); //初始化DAC
DACCH1_Config.DAC_Trigger=DAC_TRIGGER_NONE; //不使用触发功能
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
}
//DAC底层驱动,时钟配置,引脚 配置
//此函数会被HAL_DAC_Init()调用
//hdac AC句柄
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);
}
//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void DAC1_Set_Vol(u16 vol)
{
double temp=vol;
temp/=1000;
temp=temp*4096/3.3;
HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp);//12位右对齐数据格式设置DAC值
}
//////timer
#include "timer.h"
#include "led.h"
#include "dac.h"
#include "waveform.h"
TIM_HandleTypeDef TIM2_Handler;
u16 i=0;
//通用定时器2初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!(定时器3挂在APB1上,时钟为HCLK/2)
void TIM2_Init(u16 arr,u16 psc)
{
TIM2_Handler.Instance=TIM2; //通用定时器2
TIM2_Handler.Init.Prescaler=psc; //分频
TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM2_Handler.Init.Period=arr; //自动装载值
TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM2_Handler);
HAL_TIM_Base_Start(&TIM2_Handler); //Time Base Start
__HAL_TIM_URS_ENABLE(&TIM2_Handler);
}
/*
void HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef * sMasterConfig)
{
MasterOutputTrigger
}
*/
//定时器底册驱动,开启时钟
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
__HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM2时钟
}
}
/////dma
#include "dma.h"
#include "usart.h"
#include "dac.h"
DMA_HandleTypeDef DAC1_DMA_Handler; //DMA句柄
//DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_Streamx MA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//chx MA通道选择,@ref DMA_channel DMA_CHANNEL_0~DMA_CHANNEL_7
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx)
{
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
}else
{
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
}
__HAL_LINKDMA(&DAC1_Handler,DMA_Handle1,DAC1_DMA_Handler); //将DMA与DAC1联系起来(发送DMA)
//Tx DMA配置
DAC1_DMA_Handler.Instance=DMA_Streamx; //数据流选择
DAC1_DMA_Handler.Init.Channel=chx; //通道选择
DAC1_DMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设
DAC1_DMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
DAC1_DMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
DAC1_DMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
DAC1_DMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
DAC1_DMA_Handler.Init.Mode=DMA_CIRCULAR; //外设普通模式
DAC1_DMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
DAC1_DMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE; //关闭FIFO模式
DAC1_DMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL; //随便设的,因为已经被关掉了
DAC1_DMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
DAC1_DMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
HAL_DMA_DeInit(&DAC1_DMA_Handler);
HAL_DMA_Init(&DAC1_DMA_Handler);
}
//////数组
u32 Sine12bit[256] = { //正弦波描点
2048, 2098, 2148, 2198, 2248, 2298, 2348, 2398, 2447, 2496,
2545, 2594, 2642, 2690, 2737, 2785, 2831, 2877, 2923, 2968,
3013, 3057, 3100, 3143, 3185, 3227, 3267, 3307, 3347, 3385,
3423, 3460, 3496, 3531, 3565, 3598, 3631, 3662, 3692, 3722,
3750, 3778, 3804, 3829, 3854, 3877, 3899, 3920, 3940, 3958,
3976, 3992, 4007, 4021, 4034, 4046, 4056, 4065, 4073, 4080,
4086, 4090, 4093, 4095, 4095, 4095, 4093, 4090, 4086, 4080,
4073, 4065, 4056, 4046, 4034, 4021, 4007, 3992, 3976, 3958,
3940, 3920, 3899, 3877, 3854, 3829, 3804, 3778, 3750, 3722,
3692, 3662, 3631, 3598, 3565, 3531, 3496, 3460, 3423, 3385,
3347, 3307, 3267, 3227, 3185, 3143, 3100, 3057, 3013, 2968,
2923, 2877, 2831, 2785, 2737, 2690, 2642, 2594, 2545, 2496,
2447, 2398, 2348, 2298, 2248, 2198, 2148, 2098, 2047, 1997,
1947, 1897, 1847, 1797, 1747, 1697, 1648, 1599, 1550, 1501,
1453, 1405, 1358, 1310, 1264, 1218, 1172, 1127, 1082, 1038,//150
995, 952, 910, 868, 828, 788, 748, 710, 672, 635,
599, 564, 530, 497, 464, 433, 403, 373, 345, 317,
291, 266, 241, 218, 196, 175, 155, 137, 119, 103,//30
88, 74, 61, 49, 39, 30, 22, 15, 9, 5,
2, 0, 0, 0, 2, 5, 9, 15, 22, 30,
39, 49, 61, 74, 88, 103, 119, 137, 155, 175,
196, 218, 241, 266, 291, 317, 345, 373, 403, 433,
464, 497, 530, 564, 599, 635, 672, 710, 748, 788,
828, 868, 910, 952, 995, 1038, 1082, 1127, 1172, 1218,
1264, 1310, 1358, 1405, 1453, 1501, 1550, 1599, 1648, 1697,//70
1747, 1797, 1847, 1897, 1947, 1997 };
////main
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "adc.h"
#include "dac.h"
#include "waveform.h"
#include "timer.h"
#include "dma.h"
u16 x=0;///中间变量
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz
delay_init(168); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化KEY
MY_ADC_Init(); //初始化ADC1
DAC1_Init(); //初始化DAC1
TIM2_Init(10,84);
MYDMA_Config(DMA1_Stream5,DMA_CHANNEL_7);
HAL_DAC_Start_DMA(&DAC1_Handler,DAC_CHANNEL_1, Sine12bit, 256, DAC_ALIGN_12B_R);//开始发送
while(1)
{
/*
for(x=0;x<=255;x++)
HAL_DAC_SetValue(&DAC1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,Sine12bit[x]);
*/
}
}
|
|