int main(void) { /* Initialize the SAM system */ sysclk_init(); /* Disable the watchdog */ WDT->WDT_MR = WDT_MR_WDDIS; /** Configura o timer */ configure_tc(); /* Configura os botões */ configure_buttons(); pio_set_output(PORT_LED_BLUE , MASK_LED_BLUE ,1,0,0); pio_clear(PIOA, (1 << PIN_LED_BLUE)); while (1) { /* Entra em modo sleep */ pmc_sleep(SAM_PM_SMODE_SLEEP_WFI); } }
int main(void) { int speed = 8192; //Def leds pio_set_output(PORT_LED_GREEN,MASK_LED_GREEN,1,0,0); pmc_enable_periph_clk(ID_LED_GREEN); pio_clear(PORT_LED_GREEN, MASK_LED_GREEN); /* Initialize the SAM system */ sysclk_init(); /* Disable the watchdog */ WDT->WDT_MR = WDT_MR_WDDIS; /** Configura o timer */ configure_tc(); /* Configura os botões */ configure_buttons(); while (1) { /* Entra em modo sleep */ pmc_sleep(SAM_PM_SMODE_SLEEP_WFI); } }
/** * \brief Application entry point for smc_lcd example. * * \return Unused (ANSI-C compatibility). */ int main(void) { sysclk_init(); board_init(); /** Initialize debug console */ configure_console(); /* Disable the watchdog */ WDT->WDT_MR = WDT_MR_WDDIS; /** Configura o timer */ configure_tc(); /* Configura os botões */ configure_buttons(); configure_display(); init_tela(); /** Draw text, image and basic shapes on the LCD */ //ili93xx_set_foreground_color(COLOR_BLACK); //ili93xx_draw_string(10, 20, (uint8_t *)"ili93xx_lcd example"); while (1) { } }
/** * \brief Application entry point. * * \return Unused (ANSI-C compatibility). */ int main(void) { uint8_t uc_key; /* Initialize the SAM3 system */ SystemInit(); board_init(); WDT->WDT_MR = WDT_MR_WDDIS; /* Initialize the console uart */ configure_console(); /* Output example information */ puts(STRING_HEADER); /* configure LED. */ led_config(); /* configure push buttons. */ configure_buttons(); /* Set default priorities for 2 buttons. */ puts("Set INT1's priority higher than INT2.\r"); set_interrupt_priority(INT_PRIOR_HIGH, INT_PRIOR_LOW); /* Display the main menu. */ display_menu(); // Flash the LED. while (1) { while (uart_read(CONSOLE_UART, &uc_key)); switch (uc_key) { case '1': set_interrupt_priority(INT_PRIOR_LOW, INT_PRIOR_HIGH); puts("Set INT2's priority higher than INT1.\n\r\r"); break; case '2': set_interrupt_priority(INT_PRIOR_HIGH, INT_PRIOR_LOW); puts("Set INT1's priority higher than INT2.\n\r\r"); break; case 'h': display_menu(); break; default: puts("Invalid input.\r"); break; } } }
int main(void) { /* Initialize the SAM system */ sysclk_init(); /* Disable the watchdog */ WDT->WDT_MR = WDT_MR_WDDIS; /** Configura o timer */ configure_tc(); /* Configura os botões */ configure_buttons(); while (1) { /* Entra em modo sleep */ } }
/* Main Code */ /************************************************************************/ int main(void) { /* Initialize the SAM system */ sysclk_init(); /* Disable the watchdog */ WDT->WDT_MR = WDT_MR_WDDIS; /* Configura Leds */ configure_leds(); /** Configura o timer */ configure_tc(); /* Configura os botões */ configure_buttons(); while (1) { /* Entra em modo sleep */ pmc_sleep(SAM_PM_SMODE_SLEEP_WFI); }
int main(void) { sysclk_init(); board_init(); /** Initialize debug console */ configure_console(); /** Enable peripheral clock */ pmc_enable_periph_clk(ID_SMC); /** Configure SMC interface for Lcd */ smc_set_setup_timing(SMC, ILI93XX_LCD_CS, SMC_SETUP_NWE_SETUP(2) | SMC_SETUP_NCS_WR_SETUP(2) | SMC_SETUP_NRD_SETUP(2) | SMC_SETUP_NCS_RD_SETUP(2)); smc_set_pulse_timing(SMC, ILI93XX_LCD_CS, SMC_PULSE_NWE_PULSE(4) | SMC_PULSE_NCS_WR_PULSE(4) | SMC_PULSE_NRD_PULSE(10) | SMC_PULSE_NCS_RD_PULSE(10)); smc_set_cycle_timing(SMC, ILI93XX_LCD_CS, SMC_CYCLE_NWE_CYCLE(10) | SMC_CYCLE_NRD_CYCLE(22)); #if ((!defined(SAM4S)) && (!defined(SAM4E))) smc_set_mode(SMC, ILI93XX_LCD_CS, SMC_MODE_READ_MODE | SMC_MODE_WRITE_MODE | SMC_MODE_DBW_8_BIT); #else smc_set_mode(SMC, ILI93XX_LCD_CS, SMC_MODE_READ_MODE | SMC_MODE_WRITE_MODE); #endif /** Initialize display parameter */ g_ili93xx_display_opt.ul_width = ILI93XX_LCD_WIDTH; g_ili93xx_display_opt.ul_height = ILI93XX_LCD_HEIGHT; g_ili93xx_display_opt.foreground_color = COLOR_BLACK; g_ili93xx_display_opt.background_color = COLOR_WHITE; /** Switch off backlight */ aat31xx_disable_backlight(); /** Initialize LCD */ ili93xx_init(&g_ili93xx_display_opt); /** Set backlight level */ aat31xx_set_backlight(AAT31XX_AVG_BACKLIGHT_LEVEL); ili93xx_set_foreground_color(COLOR_WHITE); ili93xx_draw_filled_rectangle(0, 0, ILI93XX_LCD_WIDTH, ILI93XX_LCD_HEIGHT); /** Turn on LCD */ ili93xx_display_on(); ili93xx_set_cursor_position(0, 0); /** Draw text, image and basic shapes on the LCD */ ili93xx_set_foreground_color(COLOR_RED); ili93xx_draw_string(10, 20, (uint8_t *)" 13 - LCD"); ili93xx_set_foreground_color(COLOR_BLACK); ili93xx_draw_string(40, 40, (uint8_t *)" Renan"); ili93xx_draw_string(70, 70, (uint8_t *)"Henrique"); ili93xx_set_foreground_color(COLOR_RED); ili93xx_draw_filled_rectangle(240,110,0,120); ili93xx_set_foreground_color(COLOR_GREEN); ili93xx_draw_filled_rectangle(240, 120, 0,130); /* Configura os botões */ configure_buttons(); configure_tc(); while (1) { } }
int main(void) { /*Status flags to indicate the re-burst for library */ uint16_t status_flag = 0u; uint16_t burst_flag = 0u; uint8_t lft_pressed = 0; uint8_t rgt_pressed = 0; static uint8_t old_position = 0; uint8_t uc_char; uint8_t uc_flag; sysclk_init(); board_init(); configure_buttons(); configure_hall(); wdt_disable(WDT); pmc_enable_periph_clk(ID_PIOC); qt_reset_sensing(); config_sensors(); qt_init_sensing(); /* Set the parameters like recalibration threshold, Max_On_Duration etc in this function by the user */ qt_set_parameters(); init_timer_isr(); qt_filter_callback = 0; configure_console(); printf(STRING_HEADER); configure_lcd(); g_pwm_channel = configure_pwm(); /* Cabeçalho do lcd */ pos_lcd_x = 20; pos_lcd_y = 40; start_lcd(pos_lcd_x, pos_lcd_y, ul_duty, hall_1, hall_2, hall_3, phase); /* Infinite loop */ while (1) { static uint8_t phase_aux; static uint32_t hall_1_aux, hall_2_aux, hall_3_aux, ul_duty_aux; /* Atualiza o display somente quando houver alteração nas variáveis que serão apresentadas */ if(ul_duty_aux != ul_duty) { escreve_int_lcd("dc = ", ul_duty*100/PERIOD_VALUE, pos_lcd_x, 40); ul_duty_aux = ul_duty; } if(phase_aux != phase || hall_1_aux != hall_1 || hall_2_aux != hall_2 || hall_3_aux != hall_3) { escreve_int_lcd("hall1 = ", hall_1, pos_lcd_x, 60); escreve_int_lcd("hall2 = ", hall_2, pos_lcd_x, 80); escreve_int_lcd("hall3 = ", hall_3, pos_lcd_x, 100); escreve_int_lcd("phase = ", phase, pos_lcd_x, 120); phase_aux = phase; hall_1_aux = hall_1; hall_2_aux = hall_2; hall_3_aux = hall_3; } if(motor_run == 0 && ul_duty != 0) Hall_Phase(); uc_char = 0; uc_flag = uart_read(CONSOLE_UART, &uc_char); if (!uc_flag) { if (uc_char == 't') { printf(" duty cicle = %lu \r\n",ul_duty*100/PERIOD_VALUE); printf(" hall1 = %lu \r\n", hall_1); printf(" hall2 = %lu \r\n", hall_2); printf(" hall3 = %lu \r\n", hall_3); printf(" phase = %u \r\n\n", phase); } if (uc_char == 'a'){ if(ul_duty < PERIOD_VALUE) ul_duty++; printf(" duty cicle = %lu \r\n",ul_duty*100/PERIOD_VALUE); } if (uc_char == 's'){ if(ul_duty > INIT_DUTY_VALUE) ul_duty--; printf(" duty cicle = %lu \r\n",ul_duty*100/PERIOD_VALUE); } if (uc_char == 'd') { ensaio = 1; printf(" Ensaio de rampa\r\n"); printf(" para parar pressione a letra 'P'\r\n"); } if (uc_char == 'f') { ensaio = 2; printf(" Ensaio de degrau\r\n"); printf(" para parar pressione a letra 'P'\r\n"); } if (uc_char == 'p') { ensaio = 0; ul_duty = 0; } if (uc_char == 'i') { sel_rot = !sel_rot; printf(" Rotacao invertida\r\n"); printf(" para parar pressione a letra 'P'\r\n"); } } if (time_to_measure_touch) { /* Clear flag: it's time to measure touch */ time_to_measure_touch = 0u; do { /* One time measure touch sensors */ status_flag = qt_measure_sensors(current_time_ms_touch); burst_flag = status_flag & QTLIB_BURST_AGAIN; /*Time critical host application code goes here */ } while (burst_flag); } /* Time Non-critical host application code goes here */ if ((GET_SENSOR_STATE(BOARD_LEFT_KEY_ID) != 0) && (lft_pressed == 0)) { lft_pressed = 1; if(ul_duty > INIT_DUTY_VALUE) ul_duty--; printf(" duty cicle = %lu \r\n",ul_duty*100/PERIOD_VALUE); } else { if ((GET_SENSOR_STATE(BOARD_LEFT_KEY_ID) == 0) && (lft_pressed == 1)) { lft_pressed = 0; } } if ((GET_SENSOR_STATE(BOARD_RIGHT_KEY_ID) != 0) && (rgt_pressed == 0)) { rgt_pressed = 1; if(ul_duty < PERIOD_VALUE) ul_duty++; printf(" duty cicle = %lu \r\n",ul_duty*100/PERIOD_VALUE); } else { if ((GET_SENSOR_STATE(BOARD_RIGHT_KEY_ID) == 0) && (rgt_pressed == 1)) { rgt_pressed = 0; } } if (GET_ROTOR_SLIDER_POSITION(0) != old_position) { old_position = GET_ROTOR_SLIDER_POSITION(0); if (motor_run==0) flag_hab_m = 1; ul_duty = old_position*PERIOD_VALUE/255; } } }
// [main] int main(void) { //! [main_step_sys_init] /* Initialize the SAM system */ sysclk_init(); board_init(); //! [main_step_sys_init] #ifndef BOARD_NO_PUSHBUTTON_2 #if (SAMV71 || SAMV70 || SAMS70 || SAME70) if (GPIO_PUSH_BUTTON_2 == PIO_PB12_IDX) { matrix_set_system_io(matrix_get_system_io() | CCFG_SYSIO_SYSIO12); } ioport_set_pin_dir(GPIO_PUSH_BUTTON_2, IOPORT_DIR_INPUT); ioport_set_pin_mode(GPIO_PUSH_BUTTON_2, GPIO_PUSH_BUTTON_2_FLAGS); ioport_set_pin_sense_mode(GPIO_PUSH_BUTTON_2, GPIO_PUSH_BUTTON_2_SENSE); #endif #endif //! [main_step_console_init] /* Initialize the console uart */ configure_console(); //! [main_step_console_init] /* Output example information */ puts(STRING_HEADER); /* Configure systick for 1 ms */ puts("Configure system tick to get 1ms tick period.\r"); //! [main_step_systick_init] if (SysTick_Config(sysclk_get_cpu_hz() / 1000)) { puts("-F- Systick configuration error\r"); while (1); } //! [main_step_systick_init] #ifndef BOARD_NO_LED_1 puts("Configure TC.\r"); //! [main_step_tc_init] configure_tc(); //! [main_step_tc_init] #endif puts("Configure buttons with debouncing.\r"); //! [main_step_btn_init] configure_buttons(); //! [main_step_btn_init] printf("Press %s to Start/Stop the %s blinking.\r\n", PUSHBUTTON_1_NAME, LED_0_NAME); #ifndef BOARD_NO_PUSHBUTTON_2 printf("Press %s to Start/Stop the %s blinking.\r\n", PUSHBUTTON_2_NAME, LED_1_NAME); #endif //! [main_step_loop] while (1) { /* Wait for LED to be active */ while (!g_b_led0_active); /* Toggle LED state if active */ if (g_b_led0_active) { ioport_toggle_pin_level(LED0_GPIO); printf("1 "); } /* Wait for 500ms */ mdelay(500); } //! [main_step_loop] }
/** * \brief The main application. */ int main(void) { uint8_t i; uint8_t temperature[BUFFER_SIZE]; uint8_t light[BUFFER_SIZE]; char value_disp[5]; uint32_t adc_value; uint32_t light_value; double temp; /* Initialize clocks. */ sysclk_init(); /* Initialize GPIO states. */ board_init(); /* Configure ADC for light sensor. */ configure_adc(); /* Initialize at30tse. */ at30tse_init(); /* Configure IO1 buttons. */ configure_buttons(); /* Initialize SPI and SSD1306 controller. */ ssd1306_init(); ssd1306_clear(); /* Clear internal buffers. */ for (i = 0; i < BUFFER_SIZE; ++i) { temperature[i] = 0; light[i] = 0; } /* Show the start info. */ multi_language_show_start_info(); /* Wait 3 seconds to show the above message. */ delay_s(3); /* Check for valid firmware in SD card. */ check_valid_firmware(); while (true) { /* Set the trigger and jump to bootloader */ if (reset_flag) { jump_to_bootloader(); } /* Refresh page title only if necessary. */ if (app_mode_switch > 0) { app_mode = (app_mode + 1) % 3; /* Clear screen. */ ssd1306_clear(); ssd1306_set_page_address(0); ssd1306_set_column_address(0); if (app_mode == 0) { /* Temperature mode. */ ioport_set_pin_level(OLED1_LED1_PIN, OLED1_LED1_ACTIVE); ioport_set_pin_level(OLED1_LED2_PIN, !OLED1_LED2_ACTIVE); ioport_set_pin_level(OLED1_LED3_PIN, !OLED1_LED3_ACTIVE); multi_language_show_temperature_info(); } else if (app_mode == 1) { /* Light mode. */ ioport_set_pin_level(OLED1_LED2_PIN, OLED1_LED2_ACTIVE); ioport_set_pin_level(OLED1_LED1_PIN, !OLED1_LED1_ACTIVE); ioport_set_pin_level(OLED1_LED3_PIN, !OLED1_LED3_ACTIVE); multi_language_show_light_info(); } else { /* SD mode. */ ioport_set_pin_level(OLED1_LED3_PIN, OLED1_LED3_ACTIVE); ioport_set_pin_level(OLED1_LED1_PIN, !OLED1_LED1_ACTIVE); ioport_set_pin_level(OLED1_LED2_PIN, !OLED1_LED2_ACTIVE); sd_listing_pos = 0; /* Show SD card info. */ display_sd_info(); } app_mode_switch = 0; } /* Shift graph buffers. */ for (i = 0; i < (BUFFER_SIZE - 1); ++i) { temperature[i] = temperature[i + 1]; light[i] = light[i + 1]; } /* Get temperature. */ if (at30tse_read_temperature(&temp) == TWI_SUCCESS) { /* Don't care about negative temperature. */ if (temp < 0) { temp = 0; } /* Update temperature for display. */ /* Note: rescale to 0~24 for better rendering. */ if (temp > 40) { temperature[BUFFER_SIZE - 1] = 24; } else { temperature[BUFFER_SIZE - 1] = (uint8_t)temp * 24 / 40; } } else { /* Error print zero values. */ temperature[BUFFER_SIZE - 1] = 0; } /* Get light sensor information. */ /* Rescale to 0~24 for better rendering. */ adc_start_software_conversion(ADC); adc_value = adc_channel_get_value(ADC, ADC_CHANNEL_0); light[BUFFER_SIZE - 1] = 24 - adc_value * 24 / 1024; if (app_mode == 0) { /* Display temperature in text format. */ sprintf(value_disp, "%d", (uint8_t)temp); ssd1306_set_column_address(98); ssd1306_write_command(SSD1306_CMD_SET_PAGE_START_ADDRESS(0)); ssd1306_write_text(" "); /* Avoid character overlapping. */ if (temp < 10) { ssd1306_clear_char(); } ssd1306_write_text(value_disp); /* Display degree symbol. */ ssd1306_write_data(0x06); ssd1306_write_data(0x06); ssd1306_write_text("c"); /* Refresh graph. */ ssd1306_draw_graph(0, 2, BUFFER_SIZE, 2, temperature); } else if (app_mode == 1) { light_value = 100 - (adc_value * 100 / 1024); sprintf(value_disp, "%lu", light_value); ssd1306_set_column_address(98); ssd1306_write_command(SSD1306_CMD_SET_PAGE_START_ADDRESS(0)); ssd1306_write_text(" "); /* Avoid character overlapping. */ if (light_value < 10) { ssd1306_clear_char(); } ssd1306_write_text(value_disp); ssd1306_write_text("%"); /* Avoid character overlapping. */ if (light_value < 100) { ssd1306_clear_char(); } /* Refresh graph. */ ssd1306_draw_graph(0, 2, BUFFER_SIZE, 2, light); } else { /** * Refresh screen if card was inserted/removed or * browsing content. */ if (sd_update == 1) { /* Clear screen. */ ssd1306_clear(); ssd1306_set_page_address(0); ssd1306_set_column_address(0); if (sd_listing_pos == 0) { /* Show SD card info. */ display_sd_info(); } else { /* List SD card files. */ display_sd_files_unicode(); } sd_update = 0; } } /* Wait and stop screen flickers. */ delay_ms(150); if (app_mode_switch == 0) { pio_enable_interrupt(OLED1_PIN_PUSHBUTTON_1_PIO, OLED1_PIN_PUSHBUTTON_1_MASK); } if (sd_update == 0) { pio_enable_interrupt(OLED1_PIN_PUSHBUTTON_2_PIO, OLED1_PIN_PUSHBUTTON_2_MASK); pio_enable_interrupt(OLED1_PIN_PUSHBUTTON_3_PIO, OLED1_PIN_PUSHBUTTON_3_MASK); } } }
/** * \brief Application entry point. * * \return Unused (ANSI-C compatibility). */ int main(void) { uint8_t uc_key; /* Initialize the SAM4 system */ sysclk_init(); board_init(); WDT->WDT_MR = WDT_MR_WDDIS; /* Enable the pmc clocks of the push buttons for all SAM4. */ pmc_enable_periph_clk(ID_PIOA); pmc_enable_periph_clk(ID_PIOB); pmc_enable_periph_clk(ID_PIOC); /* Initialize the console uart */ configure_console(); /* Output example information */ puts(STRING_HEADER); /* PIO configuration for LEDs and Buttons. */ pio_handler_set_priority(PIOA, PIOA_IRQn, 0); pio_handler_set_priority(PIOB, PIOB_IRQn, 0); pio_handler_set_priority(PIOC, PIOC_IRQn, 0); /* configure LED. */ led_config(); /* configure push buttons. */ configure_buttons(); /* Set default priorities for 2 buttons. */ puts("Set INT1's priority higher than INT2.\r"); set_interrupt_priority(INT_PRIOR_HIGH, INT_PRIOR_LOW); /* Display the main menu. */ display_menu(); // Flash the LED. while (1) { while (uart_read(CONSOLE_UART, &uc_key)); switch (uc_key) { case '1': set_interrupt_priority(INT_PRIOR_LOW, INT_PRIOR_HIGH); puts("Set INT2's priority higher than INT1.\n\r\r"); break; case '2': set_interrupt_priority(INT_PRIOR_HIGH, INT_PRIOR_LOW); puts("Set INT1's priority higher than INT2.\n\r\r"); break; case 'h': display_menu(); break; default: puts("Invalid input.\r"); break; } } }
/** * \brief Application entry point for smc_lcd example. * * \return Unused (ANSI-C compatibility). */ int main(void) { sysclk_init(); board_init(); /** Configura os botões, o TC e desabilita o Watchdog Timer. */ configure_buttons(); WDT->WDT_MR = WDT_MR_WDDIS; configure_tc(); /** Initialize debug console */ configure_console(); /** Enable peripheral clock */ pmc_enable_periph_clk(ID_SMC); /** Configure SMC interface for Lcd */ smc_set_setup_timing(SMC, ILI93XX_LCD_CS, SMC_SETUP_NWE_SETUP(2) | SMC_SETUP_NCS_WR_SETUP(2) | SMC_SETUP_NRD_SETUP(2) | SMC_SETUP_NCS_RD_SETUP(2)); smc_set_pulse_timing(SMC, ILI93XX_LCD_CS, SMC_PULSE_NWE_PULSE(4) | SMC_PULSE_NCS_WR_PULSE(4) | SMC_PULSE_NRD_PULSE(10) | SMC_PULSE_NCS_RD_PULSE(10)); smc_set_cycle_timing(SMC, ILI93XX_LCD_CS, SMC_CYCLE_NWE_CYCLE(10) | SMC_CYCLE_NRD_CYCLE(22)); #if ((!defined(SAM4S)) && (!defined(SAM4E))) smc_set_mode(SMC, ILI93XX_LCD_CS, SMC_MODE_READ_MODE | SMC_MODE_WRITE_MODE | SMC_MODE_DBW_8_BIT); #else smc_set_mode(SMC, ILI93XX_LCD_CS, SMC_MODE_READ_MODE | SMC_MODE_WRITE_MODE); #endif /** Initialize display parameter */ g_ili93xx_display_opt.ul_width = ILI93XX_LCD_WIDTH; g_ili93xx_display_opt.ul_height = ILI93XX_LCD_HEIGHT; g_ili93xx_display_opt.foreground_color = COLOR_BLACK; g_ili93xx_display_opt.background_color = COLOR_WHITE; /** Switch off backlight */ aat31xx_disable_backlight(); /** Initialize LCD */ ili93xx_init(&g_ili93xx_display_opt); /** Set backlight level */ aat31xx_set_backlight(AAT31XX_AVG_BACKLIGHT_LEVEL); ili93xx_set_foreground_color(COLOR_WHITE); ili93xx_draw_filled_rectangle(0, 0, ILI93XX_LCD_WIDTH, ILI93XX_LCD_HEIGHT); /** Turn on LCD */ ili93xx_display_on(); ili93xx_set_cursor_position(0, 0); /** Escreve os nomes no display. */ ili93xx_set_foreground_color(COLOR_BLACK); ili93xx_draw_string(10, 20, (uint8_t *)"Bruna Tavares"); ili93xx_draw_string(10, 40, (uint8_t *)"Bruno Campos"); ili93xx_draw_string(10, 60, (uint8_t *)"Keneth Yamada"); /** Desenha linha */ ili93xx_set_foreground_color(COLOR_BLUEVIOLET); ili93xx_draw_line(0, 90, 240, 90); /** Escreve contador e tempo no display. */ ili93xx_set_foreground_color(COLOR_BLACK); ili93xx_draw_string(10, 110, (uint8_t *)"Contador"); ili93xx_draw_string(10, 300, (uint8_t *)"Tempo "); /** Escreve valores iniciais do contador. */ ili93xx_draw_string(130, 110, (uint8_t *)"000"); ili93xx_draw_string(140, 300, (uint8_t *)"00:00"); while (1) { // Coloca o microcontrolador em modo Sleep aguardando interrupções. pmc_sleep(SAM_PM_SMODE_SLEEP_WFI); } }
/** * \brief Application entry point for pmc_clock switch example. * * \return Unused (ANSI-C compatibility). */ int main(void) { /* Initialize the SAM system */ sysclk_init(); board_init(); /* Initialize the console uart */ configure_console(); /* Output example information */ puts(STRING_HEADER); /* Configure PCK */ ioport_set_pin_mode(GCLK_PIN, GCLK_PIN_MUX); ioport_disable_pin(GCLK_PIN); /* Configure the push button */ configure_buttons(); puts("-I- Press Button "BUTTON_NAME" to continue.\r\n"); /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; for (gs_uc_wait_button = 1; gs_uc_wait_button;) { } puts("\n\r-I- Switch 8Mhz fast RC oscillator to be the source of the main clock \n\r" "-I- The master clock is main clock divided by 2\n\r" "-I- From now on, the UART baud rate is 2400bps. So please change the terminal setting before the next clock switch\r\n" "-I- Press Button "BUTTON_NAME" to switch next clock configuration... \r\n"); /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; /* First switch to slow clock */ pmc_switch_mck_to_sclk(PMC_MCKR_PRES_CLK_1); #if (SAM3S || SAM4S || SAM4C) /* Then cut the PLL B */ pmc_disable_pllbck(); #endif /* Switch the mainck clock to the Fast RC, parameter '1' stands for 8Mhz */ pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_8_MHz); /* And finalize by switching to Fast RC */ pmc_switch_mck_to_mainck(PMC_MCKR_PRES_CLK_2); /* The clock source for the UART is the PCK, so the uart needs re-configuration */ config_uart_and_pck(PMC_PCK_CSS_MAIN_CLK, PMC_PCK_PRES_CLK_2, (CHIP_FREQ_MAINCK_RC_8MHZ / 2)); for (gs_uc_wait_button = 1; gs_uc_wait_button;) { } puts("\n\r-I- Switch the XTAL 32K crystal oscillator to be the source of the slow clock\n\r" "-I- The master clock is slow clock\n\r" "-I- Press Button "BUTTON_NAME" to switch next clock configuration after it has been measured.\r\n"); /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; /* Enable the External 32K oscillator */ pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL); /* If a new value for CSS field corresponds to Main Clock or Slow Clock, * program the CSS field first. */ pmc_switch_mck_to_sclk(PMC_MCKR_PRES_CLK_1); /* The clock source for the UART is the PCK, so the uart needs *re-configuration. */ config_uart_and_pck(PMC_PCK_CSS_SLOW_CLK, PMC_PCK_PRES_CLK_1, BOARD_FREQ_SLCK_XTAL); for (gs_uc_wait_button = 1; gs_uc_wait_button;) { } /* Switch the mainck to the Fast RC, parameter '2' stands for 12Mhz */ pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz); /* If a new value for CSS field corresponds to Main Clock or Slow Clock, * program the CSS field first. */ pmc_switch_mck_to_mainck(PMC_PCK_PRES_CLK_1); /* The clock source for the UART is the PCK, so the uart needs * re-configuration. */ config_uart_and_pck(PMC_PCK_CSS_MAIN_CLK, PMC_PCK_PRES_CLK_1, CHIP_FREQ_MAINCK_RC_12MHZ); puts("\n\r-I- Switch 12Mhz fast RC oscillator to be the source of the main clock\n\r" "-I- The master clock is the main clock\n\r" "-I- Press Button "BUTTON_NAME" to switch next clock configuration after it has been measured.\r\n"); for (gs_uc_wait_button = 1; gs_uc_wait_button;) { } #if SAM4C puts("-I- Switch to 8.192Mhz PLLA clock as the source of the master clock \n\r" "-I- The master clock is PLLA clock divided by 2 \n\r" "-I- Press Button "BUTTON_NAME" to switch next clock configuration... \r\n"); /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; /* Enable the PLLA clock, the mainck equals 32.768K * 250 = 8.192Mhz */ pmc_enable_pllack((250 - 1), 0x3f, 1); #else puts("-I- Switch to 128Mhz PLLA clock as the source of the master clock \n\r" "-I- The master clock is PLLA clock divided by 2 \n\r" "-I- Press Button "BUTTON_NAME" to switch next clock configuration... \r\n"); /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; /* Enable the PLLA clock, the mainck equals 12Mhz * (32-1+1) / 3 = 128Mhz */ pmc_enable_pllack((32 - 1), 0x3f, 3); #endif /* If a new value for CSS field corresponds to PLL Clock, Program the PRES * field first. */ pmc_switch_mck_to_mainck(PMC_MCKR_PRES_CLK_2); /* Delay for a while */ /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; /* Then program the CSS field. */ pmc_switch_mck_to_pllack(PMC_MCKR_PRES_CLK_2); /* The clock source for the UART is the PCK, so the uart needs * re-configuration */ config_uart_and_pck(PMC_PCK_CSS_PLLA_CLK, PMC_PCK_PRES_CLK_2, PMC_CLOCK_SWITCHING_EXAMPLE_FIXED_PLLA/2); for (gs_uc_wait_button = 1; gs_uc_wait_button;) { } puts("\n\r-I- Switch the XTAL 32K crystal oscillator to be the source of the slow clock\n\r" "-I- The master clock is slow clock\n\r" "-I- Press Button "BUTTON_NAME" to switch next clock configuration...\r\n"); /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; /* Switch slow clck to extern 32k xtal */ pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL); /* Delay for a while to make sure the clock is stable */ /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; /* If a new value for CSS field corresponds to Main Clock or Slow Clock, * program the CSS field first. */ pmc_switch_mck_to_mainck(PMC_MCKR_PRES_CLK_2); /* Switch the mck to sclk but keep the PRES field same */ pmc_switch_mck_to_sclk(PMC_MCKR_PRES_CLK_2); /* Then program the PRES field. */ pmc_switch_mck_to_sclk(PMC_MCKR_PRES_CLK_1); /* The clock source for the UART is the PCK, so the uart needs * re-configuration */ config_uart_and_pck(PMC_PCK_CSS_SLOW_CLK, PMC_PCK_PRES_CLK_1, BOARD_FREQ_SLCK_XTAL); for (gs_uc_wait_button = 1; gs_uc_wait_button;) { } /* Switch mainck to external xtal */ pmc_switch_mainck_to_xtal(0, BOARD_OSC_STARTUP_US); /* If a new value for CSS field corresponds to Main Clock or Slow Clock, * program the CSS field first. */ pmc_switch_mck_to_mainck(PMC_MCKR_PRES_CLK_1); /* Then program the PRES field. */ pmc_switch_mck_to_mainck(PMC_MCKR_PRES_CLK_16); /* The clock source for the UART is the PCK, so the uart needs * re-configuration. */ config_uart_and_pck(PMC_PCK_CSS_MAIN_CLK, PMC_PCK_PRES_CLK_16, (BOARD_FREQ_MAINCK_XTAL / 16)); #if SAM4C puts("\n\r-I- Switch the external 8MHz crystal oscillator to be the source of the main clock\n\r" "-I- The master clock is main clock divided by 16\n\r" "-I- Press Button "BUTTON_NAME" to switch next clock configuration...\r\n"); #else puts("\n\r-I- Switch the external 12MHz crystal oscillator to be the source of the main clock\n\r" "-I- The master clock is main clock divided by 16\n\r" "-I- Press Button "BUTTON_NAME" to switch next clock configuration...\r\n"); #endif #if (SAM3S || SAM4S || SAM4C) for (gs_uc_wait_button = 1; gs_uc_wait_button;) { } puts("-I- Switch to 96Mhz PLLB clock as the source of the master clock\n\r" "-I- The master clock is PLLB clock divided by 2 \r"); /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; #if SAM4C /* Enable the PLLB clock, the mainck equals (8Mhz * (11+1) / 1) = 96Mhz * with the initialize counter be 0x3f */ pmc_enable_pllbck(11, 0x3f, 1); #else /* Enable the PLLB clock, the mainck equals (12Mhz * (7+1) / 1) = 96Mhz * with the initialize counter be 0x3f */ pmc_enable_pllbck(7, 0x3f, 1); #endif /* If a new value for CSS field corresponds to PLL Clock, Program the PRES * field first. */ pmc_switch_mck_to_mainck(PMC_MCKR_PRES_CLK_2); /* Then program the CSS field. */ pmc_switch_mck_to_pllbck(PMC_MCKR_PRES_CLK_2); /* The clock source for the UART is the PCK, so the uart needs * re-configuration. */ #if SAM4C config_uart_and_pck(PMC_PCK_CSS_PLLB_CLK, PMC_PCK_PRES_CLK_2, (BOARD_FREQ_MAINCK_XTAL * 12 / 2)); #else config_uart_and_pck(PMC_PCK_CSS_PLLB_CLK, PMC_PCK_PRES_CLK_2, (BOARD_FREQ_MAINCK_XTAL * 8 / 2)); #endif puts("-I- Press Button "BUTTON_NAME" to switch next clock configuration...\r\n"); #endif for (gs_uc_wait_button = 1; gs_uc_wait_button;) { } puts("\r\n\r\n-I- Done.\r\n"); /* Wait for UART transmit done */ while (!uart_is_tx_empty(CONF_UART)) { }; while (1) { } }
int main(void) { uint8_t i; uint8_t temperature[BUFFER_SIZE]; uint8_t light[BUFFER_SIZE]; uint8_t value_disp[5]; uint32_t adc_value; double temp; // Initialize clocks. sysclk_init(); // Initialize GPIO states. board_init(); // Configure ADC for light sensor. configure_adc(); // Initialize at30tse. at30tse_init(); // Configure IO1 buttons. configure_buttons(); // Initialize SPI and SSD1306 controller. ssd1306_init(); ssd1306_clear(); // Clear internal buffers. for (i = 0; i < BUFFER_SIZE; ++i) { temperature[i] = 0; light[i] = 0; } while (true) { /* Refresh page title only if necessary. */ if (app_mode_switch > 0) { app_mode = app_mode_switch - 1; // Clear screen. ssd1306_clear(); ssd1306_set_page_address(0); ssd1306_set_column_address(0); /* Temperature mode. */ if (app_mode == 0) { ioport_set_pin_level(IO1_LED1_PIN, IO1_LED1_ACTIVE); ioport_set_pin_level(IO1_LED2_PIN, !IO1_LED2_ACTIVE); ioport_set_pin_level(IO1_LED3_PIN, !IO1_LED3_ACTIVE); ssd1306_write_text("Temperature sensor:"); } /* Light mode. */ else if (app_mode == 1) { ioport_set_pin_level(IO1_LED2_PIN, IO1_LED2_ACTIVE); ioport_set_pin_level(IO1_LED1_PIN, !IO1_LED1_ACTIVE); ioport_set_pin_level(IO1_LED3_PIN, !IO1_LED3_ACTIVE); ssd1306_write_text("Light sensor:"); } /* SD mode. */ else { ioport_set_pin_level(IO1_LED3_PIN, IO1_LED3_ACTIVE); ioport_set_pin_level(IO1_LED1_PIN, !IO1_LED1_ACTIVE); ioport_set_pin_level(IO1_LED2_PIN, !IO1_LED2_ACTIVE); display_sd_info(); } app_mode_switch = 0; } // Shift graph buffers. for (i = 0; i < BUFFER_SIZE - 1; ++i) { temperature[i] = temperature[i + 1]; light[i] = light[i + 1]; } // Get temperature in a range from 0 to 40 degrees. if (at30tse_read_temperature(&temp) == TWI_SUCCESS) { // Don't care about negative temperature. if (temp < 0) temp = 0; // Update temperature for display. // Note: -12 in order to rescale for better rendering. if (temp < 12) temperature[BUFFER_SIZE - 1] = 0; else temperature[BUFFER_SIZE - 1] = temp - 12; } else { // Error print zero values. temperature[BUFFER_SIZE - 1] = 0; } // Get light sensor information. // Rescale for better rendering. adc_start(ADC); adc_value = adc_get_channel_value(ADC, ADC_CHANNEL_4); light[BUFFER_SIZE - 1] = 24 - adc_value * 24 / 4096; // Print temperature in text format. if (app_mode == 0) { sprintf(value_disp, "%d", (uint8_t)temp); ssd1306_set_column_address(95); ssd1306_write_command(SSD1306_CMD_SET_PAGE_START_ADDRESS(0)); ssd1306_write_text(" "); ssd1306_write_text(value_disp); // Display degree symbol. ssd1306_write_data(0x06); ssd1306_write_data(0x06); ssd1306_write_text("c"); // Refresh graph. ssd1306_draw_graph(0, 1, BUFFER_SIZE, 3, temperature); } else if (app_mode == 1) { sprintf(value_disp, "%lu", 100 - (adc_value * 100 / 4096)); ssd1306_set_column_address(98); ssd1306_write_command(SSD1306_CMD_SET_PAGE_START_ADDRESS(0)); ssd1306_write_text(" "); ssd1306_write_text(value_disp); ssd1306_write_text("%"); // Refresh graph. ssd1306_draw_graph(0, 1, BUFFER_SIZE, 3, light); } else { // Is card has been inserted or removed? if (sd_status_update == 1) { // Clear screen. ssd1306_clear(); ssd1306_set_page_address(0); ssd1306_set_column_address(0); // Show SD card info. display_sd_info(); sd_status_update = 0; } } /* Wait and stop screen flickers. */ delay_ms(50); } }