今天是端午佳节,祝大家端午安康。今天空闲下来,分享一下公司运营中的项目,为了不涉及公司商业机密,这里只介绍在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);
#endifled.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);
} 程序编译后,下载到开发板中,呈现的效果如下图:

我要赚赏金
