【东软载波ESF0654 PDS开发板活动】任务调度器+串口

2020-03-12 19:44发布

本帖最后由 wm20031015 于 2019-12-16 09:47 编辑

【东软载波ESF0654 PDS开发板活动】任务调度器+串口

  使用MD库,移植了一下小小调度器过来,同时搞定串口程序,用ES-LINK II的串口上传信息还是很方便。
  为了使用方便,重新用宏封装了一下MD库,接口做到与以前的程序兼容。
  GPIO:
#ifndef        __GPIO__H
#define        __GPIO__H

#include        "md_gpio.h"

//*************************************************************
//GPIO工作模式,默认接收设置为TTL
enum{
        IO_OUT_PP                         = 0x0182,                //推挽输出
        IO_OUT_OD                        = 0x018a,                //开漏输出
        IO_OUT_ODU                        = 0x019a,                //开漏输出,上拉
        IO_OUT_ODD                        = 0x01aa,                //开漏输出,下拉
        IO_IN_PN                        = 0x0181,                //悬浮输入
        IO_IN_PU                        = 0x0191,                //上拉输入
        IO_IN_PD                        = 0x01a1,                //下拉输入
        IO_IN_PNF                        = 0x01c1,                //悬浮输入,打开滤波
        IO_IN_PUF                        = 0x01d1,                //上拉输入,打开滤波
        IO_IN_PDF                        = 0x01e1,                //下拉输入,打开滤波
};
enum{
    GPIO_PIN_0  = 0x0001,
    GPIO_PIN_1  = 0x0002,
    GPIO_PIN_2  = 0x0004,
    GPIO_PIN_3  = 0x0008,
    GPIO_PIN_4  = 0x0010,
    GPIO_PIN_5  = 0x0020,
    GPIO_PIN_6  = 0x0040,
    GPIO_PIN_7  = 0x0080,
    GPIO_PIN_8  = 0x0100,
    GPIO_PIN_9  = 0x0200,
    GPIO_PIN_10 = 0x0400,
    GPIO_PIN_11 = 0x0800,
    GPIO_PIN_12 = 0x1000,
    GPIO_PIN_13 = 0x2000,
    GPIO_PIN_14 = 0x4000,
    GPIO_PIN_15 = 0x8000,

};        
//GPIO初始化
#define        GPIO_Init(GPIOn, PINn, Value, MODEn)        do{                        
        md_gpio_init_t gpio_str;                                                               
        gpio_str.mode = (md_gpio_mode_t)(MODEn>>0);                        
        gpio_str.odos = (md_gpio_odos_t)(MODEn>>2);                        
        gpio_str.pupd = (md_gpio_push_t)(MODEn>>4);                        
        gpio_str.odrv = (md_gpio_out_drive_t)(MODEn>>5);               
        gpio_str.flt  = (md_gpio_filter_t)(MODEn>>6);                        
        gpio_str.type = (md_gpio_type_t)(MODEn>>7);                        
        gpio_str.func = GPIO_FUNC_1;                                                        
        md_gpio_init(GPIOn, MD_##PINn, &gpio_str);                                
        if(Value != 0)        md_gpio_set_pin_high(GPIOn, MD_##PINn);        
        else            md_gpio_set_pin_low(GPIOn, MD_##PINn);        
}while(0)

//GPIO读写操作
#define        GPIO_SetBit(GPIOn, PINn)                        md_gpio_set_pin_high(GPIOn, MD_##PINn)
#define        GPIO_ClrBit(GPIOn, PINn)                        md_gpio_set_pin_low(GPIOn, MD_##PINn)
#define        GPIO_TurnBit(GPIOn, PINn)                        md_gpio_toggle_pin_output(GPIOn, MD_##PINn)
#define        GPIO_ReadBit(GPIOn, PINn)                        md_gpio_get_input_data(GPIOn, MD_##PINn)
#define GPIO_WritePin(GPIOn, PINn, Value)        do{                                
        if(Value != 0) md_gpio_set_pin_high(GPIOn, MD_##PINn);        
        else           md_gpio_set_pin_low(GPIOn, MD_##PINn);        
}while(0)

//GPIO复用功能
#define        GPIO_SetAfMode(GPIOn, PINn, FUNn) md_gpio_set_pin_function(GPIOn, MD_##PINn, FUNn)

//GPIO中断
enum{
        GPIO_IRQ_FALLING         = 0x01,        //下降沿
        GPIO_IRQ_RSING                = 0x02,        //上升沿
};
#define        GPIO_IrqInit(GPIOn, PINn, EDGEn, NewState)        do{                                                
        if(EDGEn & 0x01) md_gpio_is_enabled_trailing_edge_trigger(MD_##PINn);        
        else             md_gpio_disable_trailing_edge_trigger(MD_##PINn);               
        if(EDGEn & 0x02) md_gpio_enable_riging_edge_trigger(MD_##PINn);                        
        else             md_gpio_disable_riging_edge_trigger(MD_##PINn);               
        if(NewState != DISABLE)        md_gpio_enable_external_interrupt(MD_##PINn);        
        else                    md_gpio_disable_external_interrupt(MD_##PINn);        
}while(0)
#define        GPIO_GetIrqStatus(GPIOn, PINn)        md_gpio_get_flag(MD_##PINn)
#define        GPIO_ClearIrq(GPIOn, PINn)                md_gpio_clear_flag(MD_##PINn)

#endif


然后LED就定义就很方便了
#ifndef        __LED__H
#define        __LED__H

//***************************************************************************************
#define        LED_GpioInit()        do{        
        LED0_GpioInit();               
        LED1_GpioInit();               
}while(0)

//LED0
#define        LED0_GpioInit()        GPIO_Init(GPIOC, GPIO_PIN_8, 1, IO_OUT_PP)
#define        LED0_On()                GPIO_ClrBit(GPIOC, GPIO_PIN_8)
#define        LED0_Off()                GPIO_SetBit(GPIOC, GPIO_PIN_8)

//LED1
#define        LED1_GpioInit()        GPIO_Init(GPIOC, GPIO_PIN_9, 1, IO_OUT_PP)
#define        LED1_On()                GPIO_ClrBit(GPIOC, GPIO_PIN_9)
#define        LED1_Off()                GPIO_SetBit(GPIOC, GPIO_PIN_9)

//***************************************************************************************
extern        void        LED_Init(void);

#endif


串口的定义 :

#ifdef  UART2_PC12_PD2
#define UART2_GpioInit()    do{                                    
    GPIO_Init(GPIOC, GPIO_PIN_12, 1, IO_OUT_PP);        
    GPIO_Init(GPIOD, GPIO_PIN_2,  1, IO_IN_PU);              
    GPIO_SetAfMode(GPIOC, GPIO_PIN_12, GPIO_FUNC_5);        
    GPIO_SetAfMode(GPIOD, GPIO_PIN_2,  GPIO_FUNC_5);         
}while(0)
//唤醒中断
#define UART2_Wakeup(NewState)  GPIO_IrqInit(GPIOD, GPIO_PIN_2, GPIO_IRQ_FALLING, NewState)
#define UART2_ReadRxIntFlag()   GPIO_GetIrqStatus(GPIOD, GPIO_PIN_2)
#define UART2_ClrRxIntFlag()    GPIO_ClearIrq(GPIOD, GPIO_PIN_2)
#endif

#define UART_ModelInit(UARTn, tBps, tLen, tStop, tParity)   do{        
    md_uart_init_t  uart_str;                                          
    uart_str.baud        = (uint32_t)tBps;                           
    uart_str.word_length = (uint32_t)tLen;                     
    uart_str.stop_bits   = (uint32_t)tStop;                          
    uart_str.parity      = (uint32_t)tParity;                        
    uart_str.fctl        = (uint32_t)UART_FLOW_CTL_DISABLE;            
    md_uart_init(UARTn, &uart_str);                                                         
    md_uart_clr_flag(UARTn, UART_IT_RXRD);                           
    md_uart_it(UARTn, UART_IT_RXRD, ENABLE);                           
    md_uart_func(UARTn, UART_FUNC_RXEN, ENABLE);               
}while(0)

//中断
#define        UART2_IRQn        BS16T1_UART2_IRQn
#define        UART3_IRQn        BS16T2_UART3_IRQn
#define        UART_Nvic(UARTn_IRQ, Prio, NewState)        md_mcu_irq_config(UARTn_IRQ, Prio, NewState)

//串口初始化
#define UART_Init(UARTx, tBps, tLen, tStop, tParity)   do{        
        UARTx##_GpioInit();                                                               
        UART_InfoInit(UARTx##_NUM);                                          
        UART_ModelInit(UARTx, tBps, tLen, tStop, tParity);                 
        UART_Nvic(UARTx##_IRQn, 3, ENABLE);                                                
}while(0)


这位处理一下看起来就清爽多了:
#include "config.h"

TASK_TYPE    TASK_Led(void)
{
    TASK_Start();
        //LED_Display();            //LED刷新
        LED0_On();
        TASK_WaitX(100);                //等待100ms
        LED0_Off();
        TASK_WaitX(900);                //等待900ms
        LED1_On();
        TASK_WaitX(100);                //等待100ms        
        LED1_Off();
        TASK_WaitX(900);                //等待900ms        
    TASK_End();
}

TASK_TYPE    TASK_Uart(void)
{
    TASK_Start();
        SCP_Check(UART2);
    TASK_WaitX(11);         //等待11ms
    TASK_End();
}


int main()
{
        DELAY_Ms(1000);         //延时等待上电电压稳定
        OSC_Init();             //时钟初始化
        LED_Init();             //LED初始化
        BATT_Init();
        TASK_Init();
        while (1)
        {
                TASK_Run(TASK_Led,   TASK_ID_LED);
                TASK_Run(TASK_Uart,  TASK_ID_UART);
        }
}


电池信息的初始化数据:
#include        "config.h"

BATT_Str BATT_Info;

void        BATT_Init(void)
{
        BATT_InfoInit();
        SCP_Init();

        BATT_Info.Info.Voltage         = 12000;
        BATT_Info.Info.CrgVolt         = 12400;
        BATT_Info.Info.Temp         = 26;
        BATT_Info.Info.Soc                 = 90;
}


通过格西风火串口助手回读,解析:

111.jpg




 

0条回答

一周热门 更多>