STM32的DAC+DMA双通道输出汉字,在示波器中显示汉字

1,参照野火的输出正弦波的案例,把DAC进行配置,
static void DAC_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
	DAC_InitTypeDef  DAC_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	
			
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
	
  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_T2_TRGO;						
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;	
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;	
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);

  DAC_Init(DAC_Channel_2, &DAC_InitStructure);

  DAC_Cmd(DAC_Channel_1, ENABLE);
 
  DAC_Cmd(DAC_Channel_2, ENABLE);

  DAC_DMACmd(DAC_Channel_2, ENABLE);
}

2.对其 触发时钟进行配置

static void DAC_TIM_Config(void)
{
	
	TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
	
	/* ʹÄÜTIM2ʱÖÓ£¬TIM2CLK Ϊ72M */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
  /* TIM2»ù±¾¶¨Ê±Æ÷ÅäÖà */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
  TIM_TimeBaseStructure.TIM_Period = 250;       									//¶¨Ê±ÖÜÆÚ 20  
  TIM_TimeBaseStructure.TIM_Prescaler = 64;       							//Ô¤·ÖƵ£¬²»·ÖƵ 72M / (0+1) = 72M
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    						//ʱÖÓ·ÖƵϵÊý
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  	//ÏòÉϼÆÊýģʽ
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  /* ÅäÖÃTIM2´¥·¢Ô´ */
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

	/* ʹÄÜTIM2 */
  TIM_Cmd(TIM2, ENABLE);

}
3对DMA进行配置

static void DAC_DMA_Config(void)
{	
	DMA_InitTypeDef  DMA_InitStructure;

	/* ʹÄÜDMA2ʱÖÓ */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
	
	/* ÅäÖÃDMA2 */
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;					//ÍâÉèÊý¾ÝµØÖ·
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit ;				//ÄÚ´æÊý¾ÝµØÖ· DualSine12bit
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;											//Êý¾Ý´«Êä·½ÏòÄÚ´æÖÁÍâÉè
  DMA_InitStructure.DMA_BufferSize = 290;																	//»º´æ´óСΪ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_Channel4, &DMA_InitStructure);
	
  /* ʹÄÜDMA2-14ͨµÀ */
  DMA_Cmd(DMA2_Channel4, ENABLE);
}
4.汉字的点阵数据取




5汉字的的点阵数据的处理
void DAC_Mode_Init(void)
{
	
	uint16_t xbit[32];//xÖá32λ
	uint16_t ybit[32];//yÖá32λ
	uint8_t temp;

	uint16_t i=0,j=0,k=0,w=0;

	DAC_Config();
	DAC_TIM_Config();
	DAC_DMA_Config();
	/*while(1)
	{
	
	
	for(i=0;i<48;i++)
	{
		for(j=0;j<6;j++)
		{
			temp=0x80;
			for(k=0;k<8;k++)
			{
				
				if(Sine12bit[6*i+j] & temp)
				{
					xbit[i]=i*85;
					//ybit[j*8+k]=(32-(j*8+k))*128;
					ybit[j*8+k]=(5-j)*680+(8-k)*85;
				DualSine12bit[w]=(((ybit[j*8+k]))+(xbit[i]<<15));
				w++;
				}
					temp=temp>>1;
			}
		}
	}
6显示结果



你可能感兴趣的:(STM32的DAC+DMA双通道输出汉字,在示波器中显示汉字)