初级会员

- 积分
- 89
- 金钱
- 89
- 注册时间
- 2016-6-6
- 在线时间
- 16 小时
|
5金钱
我想程序运行就不断产生正弦波,之前用的 DAC_SetChannel1Data(DAC_Align_12b_R, adcx); 但是 用示波器显示不出波形,lcd上显示好好的。后来想是不是必须用DMA的事,但搞了好久,只有当时钟触发的时候才有显示,但 我想能不能不用时钟,或者改用软件 或者不用。 int main(void)
{
u8 dacval;
u8 hun=0, m;
u16 i=0,PA4=0,PA5=0,New = 0 , adcx = 0,k = 0;
u16 ksinv=1,ksinvi=0;//按键user2参数
delay_init(); //延时函数初始化
LCD_Init(); //LCD初始化
KEY_Init();
LED_Init();
DAC_DMA_Config();
Init_All_Periph();//所有初始化 包括DAC
LCD_Clear(RED);
LCD_DrawLine(120,0,120,320);
LCD_DrawLine(0,160,240,160);
while(1)
{
if(1)//按键处理 这里可以不看
{
if(hun<5) //减慢读点速度
{
if (KEY_Scan(1))
{ LED0=!LED0;
hun++;
LCD_ShowString(60,100,200,16,16,"spend:");
LCD_ShowxNum(140,100,hun,5,16,0X80);
}
}
else{hun=0;}
for( m=0;m<hun;m++)
{delay_ms(20);
}
LED1=0;//判断灯 按键好使
else ksinvi=0;
if(i < 1024) i+=2;
else i = 0;
if(KEY2 == 0)
{
LCD_Fast_DrawPoint(k,PA5,YELLOW);
USART_SendData(USART1, PA5);
}
else
{
USART_SendData(USART1, PA4);
}
LCD_Fast_DrawPoint(k,PA4,BLUE);
if(k < 240)
{
k++;
LCD_ShowString(60,150,200,16,16,"PA4 DAC VOL:");
LCD_ShowxNum(140,150,PA4,5,16,0X80);
}
else //画图后到头了就清屏
{ k=0;
LCD_Clear(RED);
LCD_DrawLine(120,0,120,320);
LCD_DrawLine(0,160,240,160);
LCD_ShowString(60,170,200,16,16,"PA4 DAC VOL:");
LCD_ShowString(60,190,200,16,16,"PA0 ADC VOL:");
LCD_ShowString(60,210,200,16,16,"PA5 DAC2 VOL:");
LCD_ShowString(60,230,200,16,16,"SIN VOL:");
}
LCD_ShowxNum(140,170,PA4,5,16,0X80);
LCD_ShowxNum(140,190,adcx,5,16,0X80);
LCD_ShowxNum(140,210,PA5,5,16,0X80);
LCD_ShowxNum(140,230,dacval,5,16,0X80);
}
//这里才是转换关键
dacval=Sine_WAVE[i];
//DAC_SetChannel1Data(DAC_Align_12b_R, dacval);
PA4 = DAC_GetDataOutputValue(DAC_Channel_1); //用这个读取传输过程的电压值显示,但是没结果啊
/*ADC的值**********************************************************/
adcx=Get_Adc(ADC_Channel_0); //得到ADC转换值 A0
DAC_SetChannel2Data(DAC_Align_12b_R, adcx);
PA5=DAC_GetDataOutputValue(DAC_Channel_2); //得到DA转换 PA4
/*******************************************************/
}
}
void DAC_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
/* 使能DMA2时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
/* 配置DMA2 */
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address; //外设数据地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine_WAVE; //内存数据地址 Sine_WAVE
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向内存至外设
DMA_InitStructure.DMA_BufferSize = 1024; //缓存大小为32字节
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设数据地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存数据地址自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //外设数据以字为单位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //内存数据以字为单位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高DMA通道优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非内存至内存模式
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
DMA_Cmd(DMA2_Channel3, ENABLE);
}
void DAC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
DAC_DeInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA通道时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //使能DAC通道时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software; //DAC_Trigger_T2_TRGO;// //Software
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//不使用波形发生
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
//DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭 BOFF1=1
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable ; //DAC1输出缓存打开,提高端口驱动能力 BOFF1=0
DAC_Init(DAC_Channel_1, &DAC_InitStructure); //初始化DAC通道1
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1
DAC_Cmd(DAC_Channel_2, ENABLE); //使能DAC2
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
DAC_SetChannel2Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
DAC_DMACmd(DAC_Channel_1, ENABLE);
DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);
}
|
|