本帖最后由 lishuihua 于 2024-7-21 16:54 编辑
基本原理是通过改变PWM占空比来实现小灯从暗到亮变化,即呼吸效果。
在上一篇测评的基础上,增加一个TCPWM配置,配置CLOCK SIGNAL为16bit Divider 0 clik,配置PWM Mode为PWM模式,输出PWM到P5[2],即小灯LED4位置。
完整代码如下:
- #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 (10000)
- /* LED blink timer period value */
- #define LED_BLINK_TIMER_PERIOD (9)
- /*******************************************************************************
- * 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;
- /* variables related to pwm*/
- uint16_t timer_count = 2000;
- cyhal_pwm_t pwm_led2_control;
- /*******************************************************************************
- * Function Prototypes
- *******************************************************************************/
- void timer_init(void);
- static void isr_timer(void *callback_arg, cyhal_timer_event_t event);
- /*******************************************************************************
- * Function Name: main
- ********************************************************************************
- * Summary:
- * This is the main function. It sets up a timer to trigger a periodic interrupt.
- * The main while loop checks for the status of a flag set by the interrupt and
- * toggles an LED at 1Hz to create an LED blinky. Will be achieving the 1Hz Blink
- * rate based on the The LED_BLINK_TIMER_CLOCK_HZ and LED_BLINK_TIMER_PERIOD
- * Macros,i.e. (LED_BLINK_TIMER_PERIOD + 1) / LED_BLINK_TIMER_CLOCK_HZ = X ,Here,
- * X denotes the desired blink rate. The while loop also checks whether the
- * 'Enter' key was pressed and stops/restarts LED blinking.
- *
- * Parameters:
- * none
- *
- * Return:
- * int
- *
- *******************************************************************************/
- int main(void)
- {
- cy_rslt_t result;
- #if defined (CY_DEVICE_SECURE)
- cyhal_wdt_t wdt_obj;
- /* Clear watchdog timer so that it doesn't trigger a reset */
- result = cyhal_wdt_init(&wdt_obj, cyhal_wdt_get_max_timeout_ms());
- CY_ASSERT(CY_RSLT_SUCCESS == result);
- cyhal_wdt_free(&wdt_obj);
- #endif /* #if defined (CY_DEVICE_SECURE) */
- /* 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_fc(CYBSP_DEBUG_UART_TX, CYBSP_DEBUG_UART_RX,
- CYBSP_DEBUG_UART_CTS,CYBSP_DEBUG_UART_RTS,CY_RETARGET_IO_BAUDRATE);
- /* retarget-io init failed. Stop program execution */
- if (result != CY_RSLT_SUCCESS)
- {
- CY_ASSERT(0);
- }
- /* Initialize the User LED */
- init_cycfg_pins();
- result = cyhal_gpio_init(CYBSP_USER_LED, 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("****************** "
- "HAL: Hello World! Example "
- "****************** \r\n\n");
- printf("Hello World!!!\r\n\n");
- printf("For more projects, "
- "visit our code examples repositories:\r\n\n");
- printf("https://github.com/Infineon/"
- "Code-Examples-for-ModusToolbox-Software\r\n\n");
- /* Initialize timer to toggle the LED */
- timer_init();
- pwm_init();
- printf("LED Breathing.\r\n");
- while(1);
- #if 0
- 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_USER_LED);
- }
- }
- #endif
- }
- /*******************************************************************************
- * 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
- *
- * Return:
- * void
- *******************************************************************************/
- static void isr_timer1(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;
- }
- static void isr_timer(void* callback_arg, cyhal_timer_event_t event)
- {
- (void)callback_arg;
- (void)event;
- if(timer_count > 0)
- timer_count -= 1;
- if(timer_count == 0)
- {
- timer_count = 2000;
- //cyhal_gpio_toggle(CYBSP_USER_LED1);
- }
- if(timer_count < 1000)
- {
- cyhal_pwm_set_duty_cycle(&pwm_led2_control,timer_count/10.0,10000);
- }
- else {
- cyhal_pwm_set_duty_cycle(&pwm_led2_control, (2000-timer_count)/10.0,10000);
- }
- }
- /*******************************************************************************
- * 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
- *
- * Return :
- * void
- *
- *******************************************************************************/
- void timer_init(void)
- {
- cy_rslt_t result;
- const cyhal_timer_cfg_t led_blink_timer_cfg =
- {
- .compare_value = 0, /* Timer compare value, not used */
- .period = LED_BLINK_TIMER_PERIOD, /* Defines the timer period */
- .direction = CYHAL_TIMER_DIR_UP, /* Timer counts up */
- .is_compare = false, /* 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 */
- cyhal_timer_configure(&led_blink_timer, &led_blink_timer_cfg);
- /* Set the frequency of timer's clock source */
- cyhal_timer_set_frequency(&led_blink_timer, LED_BLINK_TIMER_CLOCK_HZ);
- /* 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,
- 7, true);
- /* Start the timer with the configured settings */
- cyhal_timer_start(&led_blink_timer);
- }
- void pwm_init(void)
- {
- cyhal_pwm_init_cfg(&pwm_led2_control,&tcpwm_0_group_1_cnt_6_hal_config);
- cyhal_pwm_start(&pwm_led2_control);
- }
- /* [] END OF FILE */
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|