0% found this document useful (0 votes)
79 views

Main4 C

This document contains C code to configure a microcontroller to generate a sine wave signal using a DAC and display the output voltage on an LCD screen. It initializes GPIO pins, clocks, timers and interrupts. The main function contains an infinite loop that uses timer interrupts to increment through arrays containing sine wave sample values and send them to the DAC. It also calculates and displays the output voltage on the LCD.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
79 views

Main4 C

This document contains C code to configure a microcontroller to generate a sine wave signal using a DAC and display the output voltage on an LCD screen. It initializes GPIO pins, clocks, timers and interrupts. The main function contains an infinite loop that uses timer interrupts to increment through arrays containing sine wave sample values and send them to the DAC. It also calculates and displays the output voltage on the LCD.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

/* Includes */ #include <stddef.h> #include "stm32l1xx.h" #include "discover_board.h" #include "stm32l_discovery_lcd.

h" USART_InitTypeDef USART_InitStructure; void Init_GPIOs (void); void RCC_Configuration(void); void Config_DAC(void); void Init_NVIC (void) ; void Display(void); void TIM2_Config(void); void EXTI0_Config(void); void TIM2_IRQHandler(void); void EXTI0_IRQHandler(void); static volatile uint32_t TimingDelay; RCC_ClocksTypeDef RCC_Clocks; uint16_t Sine12bit[50] = {1500,1593,1687,1875,2062,2156,2250,2343,2437,2625,2812,2906,3000,2906,2812,2718 ,2625,2437,2343,2250,2156,2062,187 5,1687,1593,1500,1406,1312,1125,937,843,750,656,562,375,187,93,0,93,187,375, 562 ,656,750,843,937,1125,1312,1406,1500}; uint16_t Sine12bit2[50] = {750,796,843,937,1031,1078,1125,1171,1218,1312,1406,1453,1500,1453,1406,1359,131 2,1218,1171,1125,1078,1031,937,843, 796,750,703,656,562,468,421,375,328,281,187,93,46,0,46,93,187,281,328,375,421,46 8,562,656,703,750}; uint16_t posicion=0; uint16_t pulsacion=0; uint16_t flag=0; void Config_Systick(){ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); } int main(void){ RCC_Configuration(); /* Init I/O ports */ Init_GPIOs (); /* Init Systick */ Config_Systick(); EXTI0_Config(); TIM2_Config(); Init_NVIC (); Config_DAC(); /* Initializes the LCD glass */ LCD_GLASS_Init(); LCD_GLASS_ScrollSentence((uint8_t*)" ** PRACTICA DAC ** ",1,100); /* Infinite loop */ while (1){ if(flag==1){ if(posicion<50){ if (pulsacion==0){ DAC_SetChannel1Data(DAC_Align_12b_R, Sine12bit[posicion]); Display(); posicion++; } else{ DAC_SetChannel1Data(DAC_Align_12b_R, Sine12bit2[posicion]);

Display(); posicion++; } }else{ posicion=0; } flag=0; } } return 0; } void __assert_func(const char *file, int line, const char *func, const char *fai ledexpr){ while(1) {} } void __assert(const char *file, int line, const char *failedexpr){ __assert_func (file, line, NULL, failedexpr); } void RCC_Configuration(void){ /* Enable the GPIOs Clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_ GPIOC| RCC_AHBPeriph_GPIOD| RCC_AHBPeriph_GPIOE| RCC_AHBPeriph_GPIOH, ENABLE); /* Enable comparator clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP | RCC_APB1Periph_LCD | RCC_APB1Periph _PWR,ENABLE); /* Enable SYSCFG */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG , ENABLE); /* Allow access to the RTC */ PWR_RTCAccessCmd(ENABLE); /* Reset Backup Domain */ RCC_RTCResetCmd(ENABLE); RCC_RTCResetCmd(DISABLE); /*!< LSE Enable */ RCC_LSEConfig(RCC_LSE_ON); /*!< Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) /*!< LCD Clock Source Selection */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); } void Init_GPIOs (void){ GPIO_InitTypeDef GPIO_InitStructure; /* Configure User Button pin as input */ GPIO_InitStructure.GPIO_Pin = USER_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(BUTTON_GPIO_PORT, &GPIO_InitStructure); /* Configure Output for LCD */ /* Port A */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_8 | GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init( GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource1,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOA, GPIO_PinSource2,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOA, GPIO_PinSource3,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,GPIO_AF_LCD) ;

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOA, GPIO_PinSource15,GPIO_AF_LCD) ; /* Configure Output for LCD */ /* Port B */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 \ | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin _15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init( GPIOB, &GPIO_InitStructure); #define USE_ALL_LCD_SEGMENTS GPIO_PinAFConfig(GPIOB, GPIO_PinSource3,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource4,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource5,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource8,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource9,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource10,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource11,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource12,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_LCD) ; /* Configure Output for LCD */ /* Port C*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 \ | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |GPIO_Pin_11 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init( GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource0,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOC, GPIO_PinSource1,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOC, GPIO_PinSource2,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOC, GPIO_PinSource3,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOC, GPIO_PinSource6,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOC, GPIO_PinSource7,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOC, GPIO_PinSource8,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOC, GPIO_PinSource9,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOC, GPIO_PinSource10,GPIO_AF_LCD) ; GPIO_PinAFConfig(GPIOC, GPIO_PinSource11,GPIO_AF_LCD) ; } void Delay(uint32_t nTime){ TimingDelay = nTime; while(TimingDelay != 0); } void TimingDelay_Decrement(void){ if (TimingDelay != 0x00){ TimingDelay--; } } void Config_DAC(void){ DAC_InitTypeDef DAC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* Configure PA.04 (DAC_OUT1) in analog mode -------------------------*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Enable DAC clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO ; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; /* DAC Channel1 Init */ DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* Enable DAC Channel1 */ DAC_Cmd(DAC_Channel_1, ENABLE); } void Display(void){ uint8_t disp[3]; uint8_t unidades = 0; uint8_t decimas= 0; uint8_t ch[1] = "V"; uint16_t voltaje= 0; if(pulsacion==0){ voltaje = 300*DAC_GetDataOutputValue(DAC_Channel_1); }else{ voltaje = 150*DAC_GetDataOutputValue(DAC_Channel_1); } LCD_GLASS_Clear(); disp[2] =(voltaje /100); //Guardamos en el segundo dispo las unidades del voltaj e a mostrar unidades = disp[2]+ 0x30; disp[1] = (voltaje - (100 * disp[2]))/10; decimas = disp[1]+ 0x30; LCD_GLASS_WriteChar(&unidades, POINT_ON, COLUMN_OFF, 1);//Escribe las unidades LCD_GLASS_WriteChar(&decimas, POINT_OFF, COLUMN_OFF, 2);//Escribe las decimas LCD_GLASS_WriteChar(ch, POINT_OFF, COLUMN_OFF, 3);//Escribe el carcter } void TIM2_Config(void){ NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM_TimeBaseInitStruct.TIM_Prescaler=(uint16_t)(16000000/5000)-1;// cada tic est a cada 0.2 ms TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period=50; TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update); /* TIM enable counter */ TIM_Cmd(TIM2, ENABLE); TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Timing; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Disable; TIM_OCInitStructure.TIM_Pulse=1; TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OC2Init(TIM2,&TIM_OCInitStructure); TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE); TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable); TIM_ARRPreloadConfig(TIM2,DISABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }

void TIM2_IRQHandler(void){ if(TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET){ flag=1; TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); } } void Init_NVIC (void) { NVIC_InitTypeDef NVIC_InitStructure; /* Enable the TIM2 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line0) != RESET){ if(pulsacion==0){ pulsacion=1; }else{ pulsacion=0; } EXTI_ClearFlag(EXTI_Line0); } EXTI_ClearITPendingBit(EXTI_Line0); /* Clear the EXTI line 0 pending bit */ } void EXTI0_Config(void){ EXTI_InitTypeDef EXTI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable GPIOA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* Configure PA0 pin as input floating */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Connect EXTI0 Line to PA0 pin */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); /* Configure EXTI0 line */ EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable and set EXTI0 Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

You might also like