这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取逻辑分析仪】+MK64之循环点亮RGB灯(bootloader阶段)

共3条 1/1 1 跳转至

【换取逻辑分析仪】+MK64之循环点亮RGB灯(bootloader阶段)

专家
2024-06-10 18:43:03   被打赏 33 分(兑奖)     打赏

     今天是端午佳节,祝大家端午安康。今天空闲下来,分享一下公司运营中的项目,为了不涉及公司商业机密,这里只介绍在bootloader阶段点亮板上的RGB灯。板上集成8M norflash,以太网模块,zigbee模块,主要运用在zigbee设备入网管理。板上设置了四颗大的RGB灯,可以通过RGB的颜色变化显示各种工作状态。

      该Bootloader工程实现了App固件的OTA远程升级,也为zigbee模块提供了升级的接口,本工程建立在FreeRTOS应用的基础上,本节简单介绍使用RGB的顺时针旋转点亮方式表明当前处在App的OTA升级阶段,逆时针旋转点亮RGB灯表明当前处在给Zigbee模块OTA升级阶段。

       自主研发的板卡RGB部分的原理图如下:

原理图.png      虽然MK64的方案已经慢慢退出市场舞台,但工程中的外设驱动还是值得荐介的。关于RGB及工程中的部分代码,这里分享一下。

main.c

#include  "globals.h"
#include  "thmain.h"

void BOARD_RTCInit(void);
void THMAIN_TASKS_CREATE(void);

void delay_ms(int i)
{  
    int l, a;
	
    for (a=0; a<i; a++)
    {
        for (l=0; l<1000; l++);
    }
}

int main(void)
{	
    MPU_Type *base = MPU; 

    __enable_irq();
    base->CESR &= ~MPU_CESR_VLD_MASK;
    BOARD_BootClockRUN();
    delay_ms(200);
	
    BOARD_InitPins();
    BOARD_InitDebugConsole();  
    PRINTF("boot: start run!\r\n");
    THMAIN_TASKS_CREATE();
    vTaskStartScheduler();
	
    /* should not reach this statement */
    for (;;);
} 

void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName)
{
    if (pcTaskName != NULL)
    {
	PRINTF("\r\n\tTask %s StackOverflow!!!!!\r\n");
    }
		
    for(;;);
}

void THMAIN_TASKS_CREATE(void) 
{
    sys_thread_new("thmain_thread", thmain_thread, NULL, THMAIN_STACKSIZE, THMAIN_PRIORITY);
}

pin_mux.c

#include "globals.h"

void BOARD_InitPins(void)
{
    gpio_pin_config_t  enet_reset;
    gpio_pin_config_t    fbd_pin_config;
     
    CLOCK_EnableClock(kCLOCK_PortA);
    CLOCK_EnableClock(kCLOCK_PortB);
    CLOCK_EnableClock(kCLOCK_PortC);
    CLOCK_EnableClock(kCLOCK_PortD);
    CLOCK_EnableClock(kCLOCK_PortE);
		 
    /* Initialize UART0 pins below */
    PORT_SetPinMux(PORTB, 16u, kPORT_MuxAlt3); 
    PORT_SetPinMux(PORTB, 17u, kPORT_MuxAlt3);
    	 
    /* Initialize   UART1 pins below */ 
    PORT_SetPinMux(PORTE,0u,kPORT_MuxAlt3 ); 
    PORT_SetPinMux(PORTE,1u,kPORT_MuxAlt3);
		  		
    /* enet */
    PORT_SetPinMux(PORTB, 1u, kPORT_MuxAlt4);	
    PORT_SetPinMux(PORTB, 0u, kPORT_MuxAlt4);
 
    /* Affects PORTA_PCR13 register */
    PORT_SetPinMux(PORTA, 13u, kPORT_MuxAlt4);
    /* Affects PORTA_PCR12 register */
    PORT_SetPinMux(PORTA, 12u, kPORT_MuxAlt4);
    /* Affects PORTA_PCR14 register */
    PORT_SetPinMux(PORTA, 14u, kPORT_MuxAlt4);
    /* Affects PORTA_PCR5 register */
    PORT_SetPinMux(PORTA, 5u, kPORT_MuxAlt4);
    /* Affects PORTA_PCR16 register */
    PORT_SetPinMux(PORTA, 16u, kPORT_MuxAlt4);
    /* Affects PORTA_PCR17 register */
    PORT_SetPinMux(PORTA, 17u, kPORT_MuxAlt4);
    /* Affects PORTA_PCR15 register */
    PORT_SetPinMux(PORTA, 15u, kPORT_MuxAlt4);
	
    PORT_SetPinMux(PORTA,4u,kPORT_MuxAsGpio);
    enet_reset.pinDirection=kGPIO_DigitalOutput;
    enet_reset.outputLogic=0;	 
    GPIO_PinInit(GPIOA, 4u, (const gpio_pin_config_t *)&enet_reset);
		
    GPIO_WritePinOutput(GPIOA, 4U, 1); 	
    PORT_SetPinMux(PORTE, 24u, kPORT_MuxAsGpio);
  
    fbd_pin_config.pinDirection= kGPIO_DigitalInput;
    GPIO_PinInit(GPIOE, 24u, (const gpio_pin_config_t *)&fbd_pin_config);
		  
    //LED
    PORT_SetPinMux(PORTC, 4u, kPORT_MuxAsGpio);   
    PORT_SetPinMux(PORTC, 5u, kPORT_MuxAsGpio);  
    PORT_SetPinMux(PORTC, 6u, kPORT_MuxAsGpio);  
    PORT_SetPinMux(PORTC, 7u, kPORT_MuxAsGpio);  
    PORT_SetPinMux(PORTC, 8u, kPORT_MuxAsGpio);  
    PORT_SetPinMux(PORTC, 9u, kPORT_MuxAsGpio);  
    PORT_SetPinMux(PORTC, 10u, kPORT_MuxAsGpio);  
    PORT_SetPinMux(PORTC, 11u, kPORT_MuxAsGpio);  
    PORT_SetPinMux(PORTC, 12u, kPORT_MuxAsGpio);  
    PORT_SetPinMux(PORTC, 13u, kPORT_MuxAsGpio);   
    PORT_SetPinMux(PORTC, 14u, kPORT_MuxAsGpio);  
    PORT_SetPinMux(PORTC, 15u, kPORT_MuxAsGpio);  
     	
    fbd_pin_config.pinDirection=kGPIO_DigitalOutput;
    fbd_pin_config.outputLogic=0;	 
    GPIO_PinInit(GPIOC, 4u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 5u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 6u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 7u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 8u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 9u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 10u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 11u, (const gpio_pin_config_t *)&fbd_pin_config); 
    GPIO_PinInit(GPIOC, 12u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 13u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 14u, (const gpio_pin_config_t *)&fbd_pin_config);
    GPIO_PinInit(GPIOC, 15u, (const gpio_pin_config_t *)&fbd_pin_config);
    
    //zigbee reset 
    PORT_SetPinMux(PORTD, 2u, kPORT_MuxAsGpio);
 
    fbd_pin_config.pinDirection=kGPIO_DigitalOutput;
    fbd_pin_config.outputLogic=0;	 
    GPIO_PinInit(GPIOD, 2u, (const gpio_pin_config_t *)&fbd_pin_config);	
    GPIO_WritePinOutput(GPIOD, 2U, 1);  
		
     //zigbee MISO
     PORT_SetPinMux(PORTA, 19u, kPORT_MuxAsGpio);
 
    fbd_pin_config.pinDirection=kGPIO_DigitalOutput;
    fbd_pin_config.outputLogic=0;	 
    GPIO_PinInit(GPIOA, 19u, (const gpio_pin_config_t *)&fbd_pin_config);	
    GPIO_WritePinOutput(GPIOA, 19U, 1);  
		
    //zigbee INT
    PORT_SetPinMux(PORTB, 19u, kPORT_MuxAsGpio);
    fbd_pin_config.pinDirection=kGPIO_DigitalOutput;
    fbd_pin_config.outputLogic=0;	 
    GPIO_PinInit(GPIOB, 19u, (const gpio_pin_config_t *)&fbd_pin_config);	
    GPIO_WritePinOutput(GPIOB, 19U, 1);  	
}

led.h

#ifndef __LED_H 
#define __LED_H

#define LED1_RED_ON            GPIO_WritePinOutput(GPIOC, 4U, 0)
#define LED1_RED_OFF           GPIO_WritePinOutput(GPIOC, 4U, 1)
#define LED1_GRN_ON            GPIO_WritePinOutput(GPIOC, 5U, 0)
#define LED1_GRN_OFF           GPIO_WritePinOutput(GPIOC, 5U, 1)
#define LED1_BLU_ON            GPIO_WritePinOutput(GPIOC, 6U, 0)
#define LED1_BLU_OFF           GPIO_WritePinOutput(GPIOC, 6U, 1)

#define LED2_RED_ON            GPIO_WritePinOutput(GPIOC, 7U, 0)
#define LED2_RED_OFF           GPIO_WritePinOutput(GPIOC, 7U, 1)
#define LED2_GRN_ON            GPIO_WritePinOutput(GPIOC, 8U, 0)
#define LED2_GRN_OFF           GPIO_WritePinOutput(GPIOC, 8U, 1)
#define LED2_BLU_ON            GPIO_WritePinOutput(GPIOC, 9U, 0)
#define LED2_BLU_OFF           GPIO_WritePinOutput(GPIOC, 9U, 1)

#define LED3_RED_ON            GPIO_WritePinOutput(GPIOC, 10U, 0)
#define LED3_RED_OFF           GPIO_WritePinOutput(GPIOC, 10U, 1)
#define LED3_GRN_ON            GPIO_WritePinOutput(GPIOC, 11U, 0)
#define LED3_GRN_OFF           GPIO_WritePinOutput(GPIOC, 11U, 1)
#define LED3_BLU_ON            GPIO_WritePinOutput(GPIOC, 12U, 0)
#define LED3_BLU_OFF           GPIO_WritePinOutput(GPIOC, 12U, 1)

#define LED4_RED_ON            GPIO_WritePinOutput(GPIOC, 13U, 0)
#define LED4_RED_OFF           GPIO_WritePinOutput(GPIOC, 13U, 1)
#define LED4_GRN_ON            GPIO_WritePinOutput(GPIOC, 14U, 0)
#define LED4_GRN_OFF           GPIO_WritePinOutput(GPIOC, 14U, 1)
#define LED4_BLU_ON            GPIO_WritePinOutput(GPIOC, 15U, 0)
#define LED4_BLU_OFF           GPIO_WritePinOutput(GPIOC, 15U, 1)

//---------------------------------------------------------------------------
#define LED1_R()                {LED1_RED_ON;  LED1_GRN_OFF; LED1_BLU_OFF;}
#define LED1_G()                {LED1_RED_OFF; LED1_GRN_ON;  LED1_BLU_OFF;}
#define LED1_B()                {LED1_RED_OFF; LED1_GRN_OFF; LED1_BLU_ON; }
#define LED1_Y()                {LED1_RED_ON;  LED1_GRN_ON;  LED1_BLU_OFF;}
#define LED1_I()                {LED1_RED_OFF; LED1_GRN_ON;  LED1_BLU_ON; }
#define LED1_P()                {LED1_RED_ON;  LED1_GRN_OFF; LED1_BLU_ON; }
#define LED1_W()                {LED1_RED_ON;  LED1_GRN_ON;  LED1_BLU_ON; }

#define LED2_R()                {LED2_RED_ON;  LED2_GRN_OFF; LED2_BLU_OFF;}
#define LED2_G()                {LED2_RED_OFF; LED2_GRN_ON;  LED2_BLU_OFF;}
#define LED2_B()                {LED2_RED_OFF; LED2_GRN_OFF; LED2_BLU_ON; }
#define LED2_Y()                {LED2_RED_ON;  LED2_GRN_ON;  LED2_BLU_OFF;}
#define LED2_I()                {LED2_RED_OFF; LED2_GRN_ON;  LED2_BLU_ON; }
#define LED2_P()                {LED2_RED_ON;  LED2_GRN_OFF; LED2_BLU_ON; }
#define LED2_W()                {LED2_RED_ON;  LED2_GRN_ON;  LED2_BLU_ON; }

#define LED3_R()                {LED3_RED_ON;  LED3_GRN_OFF; LED3_BLU_OFF;}
#define LED3_G()                {LED3_RED_OFF; LED3_GRN_ON;  LED3_BLU_OFF;}
#define LED3_B()                {LED3_RED_OFF; LED3_GRN_OFF; LED3_BLU_ON; }
#define LED3_Y()                {LED3_RED_ON;  LED3_GRN_ON;  LED3_BLU_OFF;}
#define LED3_I()                {LED3_RED_OFF; LED3_GRN_ON;  LED3_BLU_ON; }
#define LED3_P()                {LED3_RED_ON;  LED3_GRN_OFF; LED3_BLU_ON; }
#define LED3_W()                {LED3_RED_ON;  LED3_GRN_ON;  LED3_BLU_ON; }

#define LED4_R()                {LED4_RED_ON;  LED4_GRN_OFF; LED4_BLU_OFF;}
#define LED4_G()                {LED4_RED_OFF; LED4_GRN_ON;  LED4_BLU_OFF;}
#define LED4_B()                {LED4_RED_OFF; LED4_GRN_OFF; LED4_BLU_ON; }
#define LED4_Y()                {LED4_RED_ON;  LED4_GRN_ON;  LED4_BLU_OFF;}
#define LED4_I()                {LED4_RED_OFF; LED4_GRN_ON;  LED4_BLU_ON; }
#define LED4_P()                {LED4_RED_ON;  LED4_GRN_OFF; LED4_BLU_ON; }
#define LED4_W()                {LED4_RED_ON;  LED4_GRN_ON;  LED4_BLU_ON; }

//---------------------------------------------------------------------------
#define LED_ALL_RED()           LED1_R();LED2_R();LED3_R();LED4_R();
#define LED_ALL_GRN()           LED1_G();LED2_G();LED3_G();LED4_G();
#define LED_ALL_BLU()           LED1_B();LED2_B();LED3_B();LED4_B();
#define LED_ALL_YLL()           LED1_Y();LED2_Y();LED3_Y();LED4_Y();
#define LED_ALL_IND()           LED1_I();LED2_I();LED3_I();LED4_I();
#define LED_ALL_PRP()           LED1_P();LED2_P();LED3_P();LED4_P();
#define LED_ALL_WHT()           GPIO_ClearPinsOutput(GPIOC, 0xFFFF);

#define LED_ALL_OFF()           GPIO_SetPinsOutput(GPIOC, 0xFFFF)

extern void LEDClockwiseFlash(void);
extern void LEDRevClockwiseFlash(void);

#endif

led.c

#include "globals.h"
#include "const.h"
#include "led.h"

/**********************************************************************
* FunctionName   : LEDClockwiseFlash()
* Description    : 顺时针依次点亮
* EntryParameter : None
* ReturnValue    : None
***********************************************************************/
void LEDClockwiseFlash(void)
{
    static u8 tmpCnt = 0;
	
    LED_ALL_OFF();
    switch (tmpCnt++ % 4)
    {
	case 0: LED3_G(); break;
	case 1: LED4_G(); break;
	case 2: LED2_G(); break;
	case 3: LED1_G(); break;
	default: break;
    }
}

/***********************************************************************
* FunctionName   : LEDClockwiseFlash()
* Description    : 逆时针环闪
* EntryParameter : None
* ReturnValue    : None
************************************************************************/
void LEDRevClockwiseFlash(void)
{
    static u8 tmpCnt = 0;
	
    LED_ALL_OFF();  
    switch (tmpCnt++ % 4)
    {
	case 0: LED1_B(); break;
	case 1: LED2_B(); break;
	case 2: LED4_B(); break;
	case 3: LED3_B(); break;
	default: break;
    }		
}

thmain.c

#include  "globals.h"
#include  "thmain.h"
#include  "uptader.h"
#include  "zbl.h"
#include  "board.h"
#include  "spi.h" 
#include  "led.h" 

void vPortStopTickTimer(void);
void INT_SYS_DisableIRQ(IRQn_Type irqNumber);
void vPortClearTickTimerInterrupt(void);

__asm void BootJump(uint32_t address)
{
	  LDR  SP, [R0];
	  LDR  PC, [R0,#4];
}

void LoadApp(uint8_t res)
{
    int i;
		
    PRINTF("boot: jump to app!\r\n");
    __disable_irq();
    UART_Deinit(UART1);
    vPortStopTickTimer();
    vPortClearTickTimerInterrupt();
		
    DSPI_Deinit(EXAMPLE_DSPI_MASTER_BASEADDR);
    for (i=0; i<FSL_FEATURE_INTERRUPT_IRQ_MAX; i++)
    {
	INT_SYS_DisableIRQ((IRQn_Type)i);
	NVIC_ClearPendingIRQ((IRQn_Type)i);
    }
		
    SCB->VTOR = FLASH_APP_BASE;
    BootJump(FLASH_APP_BASE);
}

void thmain_thread(void *arg)
{	
    static uint8_t Clockwisetimes= 30;
    static uint8_t Counterclockwise= 30;

    for (;;)
    {
	while(Clockwisetimes--)
	{
	    LEDClockwiseFlash();
	    OSA_TimeDelay(100);	
	    Counterclockwise = 30;
	}
	while(Counterclockwise--)
	{
	    LEDRevClockwiseFlash();
	    OSA_TimeDelay(100);	
	    Clockwisetimes = 30;
	}
    }
}

void OSA_TimeDelay(uint32_t delay)
{
    vTaskDelay(delay/portTICK_RATE_MS);
}

static inline void INT_SYS_DisableIRQ(IRQn_Type irqNumber)
{
    /* check IRQ number */
    assert(0 <= irqNumber);
    assert(irqNumber <= FSL_FEATURE_INTERRUPT_IRQ_MAX);
    /* call core API to disable the IRQ*/
    NVIC_DisableIRQ(irqNumber);
}

    程序编译后,下载到开发板中,呈现的效果如下图:

旋转灯闪.gif

K64P144M120SF5.pdf

旋转灯闪效果.zip




关键词: 换取     手持数字示波器    

专家
2024-06-10 19:02:45     打赏
2楼

谢谢分享


高工
2024-06-10 19:37:19     打赏
3楼

谢谢分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]