Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
/******************************************************************************
* File Name: main.c
*
* Description: This is the source code for the CYW43907 Hello World Example
* for ModusToolbox.
*
* Related Document: See README.md
*
*
*******************************************************************************
* $ Copyright 2021-2023 Cypress Semiconductor $
*******************************************************************************/
#include "cyhal.h"
#include "cybsp.h"
#include "cy_retarget_io.h"
/*******************************************************************************
* Macros
********************************************************************************/
/* LED blink timer clock value in Hz. */
#define LED_BLINK_TIMER_CLOCK_HZ (5000)
/* LED blink timer period value */
#define LED_BLINK_TIMER_PERIOD (20000)
/*******************************************************************************
* Function Prototypes
*******************************************************************************/
void timer_init(void);
static void isr_timer(void *callback_arg, cyhal_timer_event_t event);
/*******************************************************************************
* Global Variables
*******************************************************************************/
bool timer_interrupt_flag = false;
bool led_blink_active_flag = true;
/* Variable for storing character read from terminal */
uint8_t uart_read_value;
/* Timer object used for blinking the LED */
cyhal_timer_t led_blink_timer;
/*******************************************************************************
* Function Name: main
********************************************************************************
* Summary:
* This is the main function for CYW43907 CPU. It does
* 1. UART console output
* 2. LED Blinking with timer ISR
*
* Parameters:
* void
*
* Return:
* int
*
*******************************************************************************/
int main(void)
{
cy_rslt_t result;
/* Initialize the device and board peripherals */
result = cybsp_init();
/* Board init failed. Stop program execution */
if(result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
/* Enable global interrupts */
__enable_irq();
/* Initialize retarget-io to use the debug UART port */
result = cy_retarget_io_init(CYBSP_DEBUG_UART_TX, CYBSP_DEBUG_UART_RX,
CY_RETARGET_IO_BAUDRATE);
/* retarget-io init failed. Stop program execution */
if(result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
/* Initialize the User LED */
result = cyhal_gpio_init(CYBSP_LED2, CYHAL_GPIO_DIR_OUTPUT,
CYHAL_GPIO_DRIVE_STRONG, CYBSP_LED_STATE_OFF);
/* GPIO init failed. Stop program execution */
if(result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
/* \x1b[2J\x1b[;H - ANSI ESC sequence for clear screen */
printf("\x1b[2J\x1b[;H");
printf("****************** "
"CYW43907 Hello World"
"****************** \r\n\n");
/* Initialize timer to toggle the LED */
timer_init();
printf("Press 'Enter' key to pause or "
"resume blinking the user LED \r\n\r\n");
for (;;)
{
/* Check if 'Enter' key was pressed */
if (cyhal_uart_getc(&cy_retarget_io_uart_obj, &uart_read_value, 1)
== CY_RSLT_SUCCESS)
{
if (uart_read_value == '\r')
{
/* Pause LED blinking by stopping the timer */
if (led_blink_active_flag)
{
cyhal_timer_stop(&led_blink_timer);
printf("LED blinking paused \r\n");
}
else /* Resume LED blinking by starting the timer */
{
cyhal_timer_start(&led_blink_timer);
printf("LED blinking resumed\r\n");
}
/* Move cursor to previous line */
printf("\x1b[1F");
led_blink_active_flag ^= 1;
}
}
/* Check if timer elapsed (interrupt fired) and toggle the LED */
if (timer_interrupt_flag)
{
/* Clear the flag */
timer_interrupt_flag = false;
/* Invert the USER LED state */
cyhal_gpio_toggle(CYBSP_LED2);
}
}
}
/*******************************************************************************
* Function Name: timer_init
********************************************************************************
* Summary:
* This function creates and configures a Timer object. The timer ticks
* continuously and produces a periodic interrupt on every terminal count
* event. The period is defined by the 'period' and 'compare_value' of the
* timer configuration structure 'led_blink_timer_cfg'. Without any changes,
* this application is designed to produce an interrupt every 1 second.
*
* Parameters:
* none
*
*******************************************************************************/
void timer_init(void)
{
cy_rslt_t result;
const cyhal_timer_cfg_t led_blink_timer_cfg =
{
.compare_value = 19999, /* Timer compare value, not used */
.period = LED_BLINK_TIMER_PERIOD, /* Defines the timer period */
.direction = CYHAL_TIMER_DIR_UP, /* Timer counts up */
.is_compare = true, /* Don't use compare mode */
.is_continuous = true, /* Run timer indefinitely */
.value = 0 /* Initial value of counter */
};
/* Initialize the timer object. Does not use input pin ('pin' is NC) and
* does not use a pre-configured clock source ('clk' is NULL). */
result = cyhal_timer_init(&led_blink_timer, NC, NULL);
/* timer init failed. Stop program execution */
if(result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
/* Configure timer period and operation mode such as count direction,
duration. */
result= cyhal_timer_configure(&led_blink_timer, &led_blink_timer_cfg);
if(result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
/* Set the frequency of timer's clock source */
result =cyhal_timer_set_frequency(&led_blink_timer, 10000);
if(result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
/* Assign the ISR to execute on timer interrupt */
cyhal_timer_register_callback(&led_blink_timer, isr_timer, NULL);
/* Set the event on which timer interrupt occurs and enable it */
cyhal_timer_enable_event(&led_blink_timer, CYHAL_TIMER_IRQ_TERMINAL_COUNT,
3, true);
/* Start the timer with the configured settings */
result=cyhal_timer_start(&led_blink_timer);
if(result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
}
/*******************************************************************************
* Function Name: isr_timer
********************************************************************************
* Summary:
* This is the interrupt handler function for the timer interrupt.
*
* Parameters:
* callback_arg Arguments passed to the interrupt callback
* event Timer/counter interrupt triggers
*
*******************************************************************************/
static void isr_timer(void *callback_arg, cyhal_timer_event_t event)
{
(void) callback_arg;
(void) event;
/* Set the interrupt flag and process it from the main while(1) loop */
timer_interrupt_flag = true;
}
/* [] END OF FILE */