本帖最后由 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;
}
通过格西风火串口助手回读,解析:
一周热门 更多>