Renesas Synergy – pierwszy projekt w e2studio
Ustawienia taktowania są zapisane w pliku bsp_clock_cfg.h – listing 6.
List. 6. Plik nagłówkowy bsp_clock_cfg.h
/* generated configuration header file - do not edit */ #ifndef BSP_CLOCK_CFG_H_ #define BSP_CLOCK_CFG_H_ #define BSP_CFG_XTAL_HZ (24000000) /* XTAL 24000000Hz */ #define BSP_CFG_PLL_SOURCE (CGC_CLOCK_MAIN_OSC) /* PLL Src: XTAL */ #define BSP_CFG_HOCO_FREQUENCY (0) /* HOCO 16MHz */ #define BSP_CFG_PLL_DIV (CGC_PLL_DIV_2) /* PLL Div /2 */ #define BSP_CFG_PLL_MUL (20.0) /* PLL Mul x20.0 */ #define BSP_CFG_CLOCK_SOURCE (CGC_CLOCK_PLL) /* Clock Src: PLL */ #define BSP_CFG_ICK_DIV (CGC_SYS_CLOCK_DIV_1) /* ICLK Div /1 */ #define BSP_CFG_PCKA_DIV (CGC_SYS_CLOCK_DIV_2) /* PCLKA Div /2 */ #define BSP_CFG_PCKB_DIV (CGC_SYS_CLOCK_DIV_4) /* PCLKB Div /4 */ #define BSP_CFG_PCKC_DIV (CGC_SYS_CLOCK_DIV_4) /* PCLKC Div /4 */ #define BSP_CFG_PCKD_DIV (CGC_SYS_CLOCK_DIV_2) /* PCLKD Div /2 */ #define BSP_CFG_SDCLK_OUTPUT (1) /* SDCLKout On */ #define BSP_CFG_BCK_DIV (CGC_SYS_CLOCK_DIV_2) /* BCLK Div /2 */ #define BSP_CFG_BCLK_OUTPUT (2) /* BCK/2 */ #define BSP_CFG_UCK_DIV (CGC_USB_CLOCK_DIV_5) /* UCLK Div /5 */ #define BSP_CFG_FCK_DIV (CGC_SYS_CLOCK_DIV_4) /* FCLK Div /4 */ #endif /* BSP_CLOCK_CFG_H_ */
Istnieje też możliwość debugowania konfiguracji projektu. Zamiast Debug As klikamy na Debug Configurations i w nim na zakładkę Debug – rysunek 18.
Rys. 18. Okno konfiguracji debugowania
Po kliknięciu na przycisk Debug otwiera się okno z plikiem startup_S7G2.c.
Na koniec pokażę jak dodać nowy komponent do konfiguracji projektu. Będzie to sprzętowy timer GPT odliczający opóźnienia. Ma on zastąpić możliwość programowego odliczania opóźnień w naszym projekcie. Jak wiemy dodawanie komponentów może by wykonywane w zakładce Threads (rysunek 19).
Rys. 19. Dodanie drivera GPT
Po dodaniu drivera w modułach projektu pojawia się g_timer Timer Driver on r_gpt (rysunek 20), który trzeba skonfigurować w zakładce Properties – rysunek 21.
Rys. 20. Po dodaniu drivera w modułach żywanych w projekcie pojawia się g_timer Timer Driver on r_gpt
Rys. 21. Konfiguracja drivera GPT
Najpierw konfigurujemy przerwania od GPT0 zgłaszane przy przepełnieniu licznika – rysunek 22. Potem we właściwościach licznika (zakładka Threads) wpisujemy:
- Period value=1,
- period unit = seconds i
- Callback = user_gpt_callback.
Tak skonfigurowany timer przepełnia się i zgłasza przerwanie co 1 s.
Rys. 22. Konfigurowanie przerwań od drivera GPT0
Teraz na podstawie nowej konfiguracji Synergy Configurator wygeneruje nowe pliki konfiguracyjne po kliknięciu na Generate Project Content. W pliku hal_data.h konfigurator dopisał definicje pokazane na listingu 7.
List. 7. Zmodyfikowany fragment pliku hal_data.h
extern const timer_instance_t g_timer; #if TIMER_ON_GPT_CALLBACK_USED_g_timer void user_gpt_callback(timer_callback_args_t * p_args); #endif
W pliku hal_data.c konfigurator dopisał definicje konfiguracji licznika – listing 8.
List. 8. zmodyfikowany fragment pliku hal_data.c
#pragma weak user_gpt_callback user_gpt_callback_internal static timer_ctrl_t g_timer_ctrl; static const timer_cfg_t g_timer_cfg = {.mode = TIMER_MODE_PERIODIC,.period = 1,.unit = TIMER_UNIT_PERIOD_SEC,.duty_cycle = 50,.duty_cycle_unit = TIMER_PWM_UNIT_RAW_COUNTS, .channel = 0,.autostart = true,.p_callback = user_gpt_callback,.p_context = &g_timer,.p_extend = &g_timer_extend }; /* Instance structure to use this module. */ const timer_instance_t g_timer = {.p_ctrl = &g_timer_ctrl,.p_cfg = &g_timer_cfg,.p_api = &g_timer_on_gpt }; #if TIMER_ON_GPT_CALLBACK_USED_g_timer /*******************************************************************************************************************//** * @brief This is a weak example callback function. It should be overridden by defining a user callback function * with the prototype below. * - void user_gpt_callback(timer_callback_args_t * p_args) * * @param[in] p_args Callback arguments used to identify what caused the callback. **********************************************************************************************************************/ void user_gpt_callback_internal(timer_callback_args_t * p_args); void user_gpt_callback_internal(timer_callback_args_t * p_args) { /** Do nothing. */ SSP_PARAMETER_NOT_USED(p_args); }