今天是端午佳节,祝大家端午安康。今天空闲下来,分享一下公司运营中的项目,为了不涉及公司商业机密,这里只介绍在bootloader阶段点亮板上的RGB灯。板上集成8M norflash,以太网模块,zigbee模块,主要运用在zigbee设备入网管理。板上设置了四颗大的RGB灯,可以通过RGB的颜色变化显示各种工作状态。
该Bootloader工程实现了App固件的OTA远程升级,也为zigbee模块提供了升级的接口,本工程建立在FreeRTOS应用的基础上,本节简单介绍使用RGB的顺时针旋转点亮方式表明当前处在App的OTA升级阶段,逆时针旋转点亮RGB灯表明当前处在给Zigbee模块OTA升级阶段。
自主研发的板卡RGB部分的原理图如下:
虽然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); }
程序编译后,下载到开发板中,呈现的效果如下图: