fixed the incosnsitent led pattern by using systick to call led_tick()
This commit is contained in:
		
							
								
								
									
										8
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								Makefile
									
									
									
									
									
								
							@@ -21,17 +21,14 @@ SD_VER2         = 1
 | 
			
		||||
SD_VER3         = 1
 | 
			
		||||
 | 
			
		||||
SD_VERSION      = $(SD_VER1).$(SD_VER2).$(SD_VER3)
 | 
			
		||||
SD_VERSION_FULL = $(SD_VERSION)
 | 
			
		||||
SD_FILENAME		  = $(SD_NAME)_nrf52_$(SD_VERSION)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SD_API_PATH     = $(SD_PATH)/$(SD_FILENAME)_API
 | 
			
		||||
SD_HEX          = $(SD_PATH)/$(SD_FILENAME)_softdevice.hex
 | 
			
		||||
 | 
			
		||||
LD_FILE   			= $(SRC_PATH)/linker/$(SD_NAME)_v$(SD_VER1).ld
 | 
			
		||||
 | 
			
		||||
MERGED_FNAME   = $(OUTPUT_FILENAME)_$(SD_NAME)_$(SD_VERSION_FULL)
 | 
			
		||||
RELEASE_DIR     = bin/$(BOARD)/$(SD_VERSION_FULL)
 | 
			
		||||
MERGED_FNAME   = $(OUTPUT_FILENAME)_$(SD_NAME)_$(SD_VERSION)
 | 
			
		||||
RELEASE_DIR     = bin/$(BOARD)/$(SD_VERSION)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
MK_DIS_FIRMWARE = "$(SD_NAME) $(SD_VERSION)"
 | 
			
		||||
@@ -45,7 +42,6 @@ OUTPUT_FILENAME = $(BOARD)_bootloader-$(GIT_VERSION)
 | 
			
		||||
#******************************************************************************
 | 
			
		||||
NRFUTIL = adafruit-nrfutil
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ifneq ($(JLINK),)
 | 
			
		||||
NRFJPROG = nrfjprog -s $(JLINK)
 | 
			
		||||
else
 | 
			
		||||
 
 | 
			
		||||
@@ -136,8 +136,6 @@ static void wait_for_events(void)
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    led_tick();
 | 
			
		||||
 | 
			
		||||
    if ((m_update_status == BOOTLOADER_COMPLETE) ||
 | 
			
		||||
        (m_update_status == BOOTLOADER_TIMEOUT) ||
 | 
			
		||||
        (m_update_status == BOOTLOADER_RESET) )
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								src/boards.c
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								src/boards.c
									
									
									
									
									
								
							@@ -80,10 +80,17 @@ void board_init(void)
 | 
			
		||||
 | 
			
		||||
  // Init app timer (use RTC1)
 | 
			
		||||
  app_timer_init();
 | 
			
		||||
 | 
			
		||||
  // Configure Systick for led blinky
 | 
			
		||||
  extern uint32_t SystemCoreClock;
 | 
			
		||||
  SysTick_Config(SystemCoreClock/1000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void board_teardown(void)
 | 
			
		||||
{
 | 
			
		||||
  // Disable systick, turn off LEDs
 | 
			
		||||
  SysTick->CTRL = 0;
 | 
			
		||||
 | 
			
		||||
  // Disable and reset PWM for LEDs
 | 
			
		||||
  led_pwm_teardown();
 | 
			
		||||
 | 
			
		||||
@@ -104,12 +111,20 @@ void board_teardown(void)
 | 
			
		||||
  NRF_CLOCK->TASKS_LFCLKSTOP = 1UL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint32_t _systick_count = 0;
 | 
			
		||||
void SysTick_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
  _systick_count++;
 | 
			
		||||
 | 
			
		||||
  led_tick();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint32_t tusb_hal_millis(void)
 | 
			
		||||
{
 | 
			
		||||
  return ( ( ((uint64_t)app_timer_cnt_get())*1000*(APP_TIMER_CONFIG_RTC_FREQUENCY+1)) / APP_TIMER_CLOCK_FREQ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pwm_teardown(NRF_PWM_Type* pwm )
 | 
			
		||||
{
 | 
			
		||||
  pwm->TASKS_SEQSTART[0] = 0;
 | 
			
		||||
@@ -126,7 +141,7 @@ void pwm_teardown(NRF_PWM_Type* pwm )
 | 
			
		||||
  pwm->SEQ[0].CNT  = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint16_t led_duty_cycles[PWM0_CH_NUM];
 | 
			
		||||
static uint16_t led_duty_cycles[PWM0_CH_NUM] = { 0 };
 | 
			
		||||
 | 
			
		||||
#if LEDS_NUMBER > PWM0_CH_NUM
 | 
			
		||||
#error "Only " PWM0_CH_NUM " concurrent status LEDs are supported."
 | 
			
		||||
@@ -136,10 +151,11 @@ void led_pwm_init(uint32_t led_index, uint32_t led_pin)
 | 
			
		||||
{
 | 
			
		||||
  NRF_PWM_Type* pwm    = NRF_PWM0;
 | 
			
		||||
 | 
			
		||||
  pwm->ENABLE = 0;
 | 
			
		||||
 | 
			
		||||
  nrf_gpio_cfg_output(led_pin);
 | 
			
		||||
  pwm->PSEL.OUT[led_index] = led_pin;
 | 
			
		||||
 | 
			
		||||
  pwm->ENABLE = 1;
 | 
			
		||||
  pwm->MODE            = PWM_MODE_UPDOWN_Up;
 | 
			
		||||
  pwm->COUNTERTOP      = 0xff;
 | 
			
		||||
  pwm->PRESCALER       = PWM_PRESCALER_PRESCALER_DIV_16;
 | 
			
		||||
@@ -150,7 +166,10 @@ void led_pwm_init(uint32_t led_index, uint32_t led_pin)
 | 
			
		||||
  pwm->SEQ[0].CNT      = 4; // default mode is Individual --> count must be 4
 | 
			
		||||
  pwm->SEQ[0].REFRESH  = 0;
 | 
			
		||||
  pwm->SEQ[0].ENDDELAY = 0;
 | 
			
		||||
  pwm->LOOP = 0;
 | 
			
		||||
 | 
			
		||||
  pwm->ENABLE = 1;
 | 
			
		||||
 | 
			
		||||
  pwm->EVENTS_SEQEND[0] = 0;
 | 
			
		||||
  pwm->TASKS_SEQSTART[0] = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -171,7 +190,7 @@ static uint32_t primary_cycle_length;
 | 
			
		||||
static uint32_t secondary_cycle_length;
 | 
			
		||||
#endif
 | 
			
		||||
void led_tick() {
 | 
			
		||||
    uint32_t millis = tusb_hal_millis();
 | 
			
		||||
    uint32_t millis = _systick_count;
 | 
			
		||||
 | 
			
		||||
    uint32_t cycle = millis % primary_cycle_length;
 | 
			
		||||
    uint32_t half_cycle = primary_cycle_length / 2;
 | 
			
		||||
@@ -202,24 +221,34 @@ static uint32_t rgb_color;
 | 
			
		||||
static bool temp_color_active = false;
 | 
			
		||||
void led_state(uint32_t state)
 | 
			
		||||
{
 | 
			
		||||
    enum {
 | 
			
		||||
      CYCLE_NORMAL = 4000,
 | 
			
		||||
      CYCLE_WRITING = 100
 | 
			
		||||
    };
 | 
			
		||||
    uint32_t new_rgb_color = rgb_color;
 | 
			
		||||
    uint32_t temp_color = 0;
 | 
			
		||||
    switch (state) {
 | 
			
		||||
        case STATE_USB_MOUNTED:
 | 
			
		||||
          new_rgb_color = 0x00ff00;
 | 
			
		||||
          primary_cycle_length = 4000;
 | 
			
		||||
          primary_cycle_length = CYCLE_NORMAL;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case STATE_BOOTLOADER_STARTED:
 | 
			
		||||
        case STATE_USB_UNMOUNTED:
 | 
			
		||||
          new_rgb_color = 0xff0000;
 | 
			
		||||
          primary_cycle_length = 300;
 | 
			
		||||
          primary_cycle_length = CYCLE_NORMAL;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case STATE_WRITING_STARTED:
 | 
			
		||||
          temp_color = 0xff0000;
 | 
			
		||||
          primary_cycle_length = CYCLE_WRITING;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case STATE_WRITING_FINISHED:
 | 
			
		||||
          // Empty means to unset any temp colors.
 | 
			
		||||
          primary_cycle_length = CYCLE_NORMAL;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case STATE_BLE_CONNECTED:
 | 
			
		||||
          new_rgb_color = 0x0000ff;
 | 
			
		||||
          #ifdef LED_SECONDARY_PIN
 | 
			
		||||
@@ -228,6 +257,7 @@ void led_state(uint32_t state)
 | 
			
		||||
          primary_cycle_length = 500;
 | 
			
		||||
          #endif
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case STATE_BLE_DISCONNECTED:
 | 
			
		||||
          new_rgb_color = 0xff00ff;
 | 
			
		||||
          #ifdef LED_SECONDARY_PIN
 | 
			
		||||
@@ -236,6 +266,7 @@ void led_state(uint32_t state)
 | 
			
		||||
          primary_cycle_length = 300;
 | 
			
		||||
          #endif
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        default:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user