5. SDK说明
本文档主要是协助用户快速熟悉杰理 AC82N 系列通用 MCU 的 SDK 流程和框架,来完成通用 MCU 的相关软件开发工作。
5.1. SDK目录框架
5.2. 应用功能配置
Note
SDK的配置信息在app_config.h文件中。
/* 系统打印总开关 */
#define CONFIG_DEBUG_ENABLE
//*********************************************************************************//
// UART配置 //
//*********************************************************************************//
#define TCFG_DB_UART_ENABLE ENABLE_THIS_MOUDLE //打印串口使能
#define TCFG_DB_UART_RX_PORT NO_CONFIG_PORT //串口接收脚配置(用于打印可以选择NO_CONFIG_PORT)
#define TCFG_DB_UART_TX_PORT IO_PORTA_04 //串口发送脚配置
#define TCFG_DB_UART_BAUDRATE 1000000 //串口波特率配置
//*********************************************************************************//
// VM 配置 //
//*********************************************************************************//
#define TCFG_VM_SIZE 16 //n kbyte
#define TCFG_VM_INIT_FAST 0 //VM快速初始化
//*********************************************************************************//
// USB 配置 //
//*********************************************************************************//
#define TCFG_PC_ENABLE ENABLE_THIS_MOUDLE//PC模块使能
#define TCFG_UDISK_ENABLE DISABLE_THIS_MOUDLE//U盘模块使能
#define TCFG_OTG_USB_DEV_EN BIT(0)//USB0 = BIT(0) USB1 = BIT(1)
#undef USB_DEVICE_CLASS_CONFIG
#define USB_DEVICE_CLASS_CONFIG (SPEAKER_CLASS|HID_CLASS|CDC_CLASS)
#undef USB_MALLOC_ENABLE
#define USB_MALLOC_ENABLE ENABLE_THIS_MOUDLE
//*********************************************************************************//
// 时钟配置 //
//*********************************************************************************//
#define TCFG_CLOCK_PLL_HZ (480 * 1000000L) //系统PLL时钟设置 240M or 480M
#define TCFG_CLOCK_SYS_HZ (96 * 1000000L) //默认系统时钟设置(CPU运行时钟)
#define TCFG_CLOCK_LSB_HZ (48 * 1000000L) //默认LSB时钟设置(一般外设时钟)
//*********************************************************************************//
// key 配置 //
//*********************************************************************************//
#define KEY_IO_NUM_MAX 3
#define KEY_AD_NUM_MAX 10
#define KEY_IR_NUM_MAX 21
#define KEY_TOUCH_NUM_MAX 3
//*********************************************************************************//
// iokey 配置 //
//*********************************************************************************//
#define TCFG_IOKEY_ENABLE ENABLE_THIS_MOUDLE //是否使能IO按键
#define TCFG_IOKEY_0_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_0_ONE_PORT IO_PORTA_03 //IO按键端口
#define TCFG_IOKEY_1_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_1_ONE_PORT IO_PORTA_06 //IO按键端口
#define TCFG_IOKEY_2_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_2_ONE_PORT IO_PORTA_07 //IO按键端口
//*********************************************************************************//
// adkey 配置 //
//*********************************************************************************//
#define TCFG_ADKEY_ENABLE ENABLE_THIS_MOUDLE //是否使能AD按键
#define TCFG_ADKEY_PORT IO_PORTA_00 //AD按键端口(需要注意选择的IO口是否支持AD功能)
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PA0
#define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉
#if TCFG_ADKEY_EXTERN_UP_ENABLE
#define R_UP 220 //22K,外部上拉阻值在此自行设置
#else
#define R_UP 100 //10K,内部上拉默认10K
#endif
//*********************************************************************************//
// irkey 配置 //
//*********************************************************************************//
#define TCFG_IRKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能ir按键
#define TCFG_IRKEY_PORT IO_PORTA_02 //IR按键端口
//*********************************************************************************//
// tocuh key 配置 //
//*********************************************************************************//
#define TCFG_TOUCH_KEY_ENABLE DISABLE_THIS_MOUDLE //是否使能触摸按键
#define TCFG_TOUCH_KEY0_PRESS_DELTA 100//变化阈值,当触摸产生的变化量达到该阈值,则判断被按下,每个按键可能不一样,可先在驱动里加到打印,再反估阈值
#define TCFG_TOUCH_KEY0_PORT IO_PORTA_08 //触摸按键key0 IO配置
#define TCFG_TOUCH_KEY0_VALUE 0x12 //触摸按键key0 按键值
//key1配置
#define TCFG_TOUCH_KEY1_PRESS_DELTA 100//变化阈值,当触摸产生的变化量达到该阈值,则判断被按下,每个按键可能不一样,可先在驱动里加到打印,再反估阈值
#define TCFG_TOUCH_KEY1_PORT IO_PORTA_09 //触摸按键key1 IO配置
#define TCFG_TOUCH_KEY1_VALUE 0x34 //触摸按键key1 按键值
//*********************************************************************************//
// LCD SPI1 配置 //
//*********************************************************************************//
#define TCFG_HW_SPI1_PORT_CLK IO_PORTC_04
#define TCFG_HW_SPI1_PORT_DO IO_PORTC_05
#define TCFG_HW_SPI1_PORT_DI NO_CONFIG_PORT
#define TCFG_HW_SPI1_PORT_D2 NO_CONFIG_PORT
#define TCFG_HW_SPI1_PORT_D3 NO_CONFIG_PORT
#define TCFG_HW_SPI1_BAUD 24000000L
#define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI1_ROLE SPI_ROLE_MASTER
//*********************************************************************************//
// FLASH SPI2 配置 //
//*********************************************************************************//
#define TCFG_NORFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_HW_SPI2_PORT_CLK IO_PORTA_10
#define TCFG_HW_SPI2_PORT_DO IO_PORTA_09
#define TCFG_HW_SPI2_PORT_DI IO_PORTA_11
#define TCFG_HW_SPI2_PORT_CS IO_PORTA_12
#define TCFG_HW_SPI2_BAUD 1000000L
#define TCFG_HW_SPI2_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI2_ROLE SPI_ROLE_MASTER
//*********************************************************************************//
// 内置FLASH设备配置 //
//*********************************************************************************//
//描述:配合USB的MSD可将内部flash的部分区域枚举成为U盘
#define TCFG_MSFC_DEV_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_MSFC_DEV_ADDR 384 //枚举成msd的地址(Kbyte)
#define TCFG_MSFC_DEV_SIZE 124 //枚举成msd的大小(Kbyte)
//*********************************************************************************//
// LOWPOWER 配置 //
//*********************************************************************************//
#define TCFG_LOWPOWER_LOWPOWER_SEL SLEEP_EN
#define TCFG_VDDIOM_LEVEL VDDIOM_VOL_33V//VDDIO配置
/*---------Power Wakeup IO------------------*/
#define POWER_WAKEUP_IO IO_PORTA_02
#define POWER_WAKEUP_EDGE RISING_EDGE
#define TCFG_SFC_FAST_BOOT_ENABLE DISABLE//快速启动使能
//*********************************************************************************//
// 长按复位 配置 //
//*********************************************************************************//
#define PINR_RESET_IO IO_PORTA_00
#define PINR_RESET_LVL 0 // 0下降沿 1上升沿
#define PINR_PRESS_TIME 8 // 0/1/2/4/8/16 秒
#define PINR_RESET_RELASE 1 // 0释放后复位 1立即复位
#define PINR_PROTECT_EN 0 // 写保护使能
//*********************************************************************************//
// 供电电源 配置 //
//*********************************************************************************//
//干电池标压1.5V,出厂电压为1.6V多一些,关断电压为0.9V(保守一点用1.0V)
#define BATTERY_TYPE_2_DRY_DELL (0) //2节干电池(3.2V),放电管理
#define BATTERY_TYPE_3_DRY_DELL (1) //3节干电池(4.8V),放电管理
#define BATTERY_TYPE_4_DRY_DELL (2) //4节干电池(6.4V),放电管理
#define BATTERY_TYPE_LITHIUM_DELL (3) //锂电池(4.2V),充放电管理
#define TCFG_BATTERY_TYPE_SEL BATTERY_TYPE_3_DRY_DELL
#define TCFG_BAT_DET_IO NO_CONFIG_PORT //检测电池的IO
//若TCFG_BAT_DET_IO为NO_CONFIG_PORT,则TCFG_BAT_AD_CHANNEL默认配置为AD_ANA_PMU_CH_VPWR_DIV_4
//若TCFG_BAT_DET_IO为实际IO(例如IO_PORT_PA0),则TCFG_BAT_AD_CHANNEL需配置为对应AD通道(如AD_CH_PA0)
#define TCFG_BAT_AD_CHANNEL AD_ANA_PMU_CH_VPWR_DIV_4 //电池检测的AD通道
#if (TCFG_BATTERY_TYPE_SEL == BATTERY_TYPE_LITHIUM_DELL)
#define TCFG_CHARGE_DET_IO IO_PORTA_06 //USB插入检测io
#define TCFG_CHARGE_FULL_IO IO_PORTA_09 //充满检测io
#endif
//*********************************************************************************//
// AT_CHAR蓝牙串口配置 //
//*********************************************************************************//
#define TCFG_AT_CHAR_UART_TX_PORT IO_PORTC_04
#define TCFG_AT_CHAR_UART_RX_PORT IO_PORTC_03
#define TCFG_AT_CHAR_UART_BAUDRATE 115200
5.3. 异常打印配置
Note
异常配置信息在app_config.c文件中。
#ifdef CONFIG_RELEASE_ENABLE
const int config_asser = 0;
#else
const int config_asser = 1;
#endif
5.4. 中断优先级配置
Note
中断优先级配置在setup.c文件中。
注册中断时,在该表上查到对应中断优先级,则使用表里面配置的,否则使用注册接口传入的优先级参数
中断优先级设置0 ~7
static const struct irq_info irq_index_2_priority_table[] = {
{IRQ_TICK_TMR_IDX, 1},
{IRQ_TIME0_IDX, 0},
{IRQ_TIME1_IDX, 0},
{IRQ_TIME2_IDX, 0},
{IRQ_TIME3_IDX, 0},
{IRQ_UART0_IDX, 0},
{IRQ_UART1_IDX, 0},
{IRQ_UART2_IDX, 0},
{IRQ_SPI0_IDX, 3},
{IRQ_SPI1_IDX, 3},
{IRQ_SPI2_IDX, 3},
{IRQ_IIC0_IDX, 0},
{IRQ_IIC1_IDX, 0},
{IRQ_PORT_IDX, 3},
{IRQ_SARADC_IDX, 0},
{IRQ_GPCNT_IDX, 0},
{IRQ_USB_SOF_IDX, 3},
{IRQ_USB_CTRL_IDX, 3},
{IRQ_MCPWM_TMR_IDX, 0},
{IRQ_PMU_SOFT_IDX, 0},
{IRQ_PMU_TIMER0_IDX, 0},
{IRQ_PMU_TIMER1_IDX, 0},
{IRQ_QDEC_IDX, 0},
{IRQ_PAP_IDX, 0},
{IRQ_LCD_IDX, 0},
{IRQ_MCPWM_CHX_IDX, 0},
{IRQ_DMA_GEN0_IDX, 0},
{IRQ_DMA_GEN1_IDX, 0},
{IRQ_DMA0_IDX, 0},
{IRQ_DMA1_IDX, 0},
{IRQ_AUDIO_IDX, 6},
{IRQ_APA_IDX, 6},
{IRQ_HADC_IDX, 0},
{IRQ_SOFT0_IDX, 0},
{IRQ_SOFT1_IDX, 0},
{IRQ_SOFT2_IDX, 0},
{IRQ_SOFT3_IDX, 0},
};
5.5. SDK运行流程
Note
应用主循环在app_main.c文件中。
void app_main(void) { bool ret; struct sys_event event; log_info("app_main!\n"); syscfg_vm_init(); onchip_device_init(); key_driver_init(); user_usb_otg_init(); while (1) { wdt_clear(); #if TCFG_USB_SLAVE_ENABLE && TCFG_USB_SLAVE_MSD_ENABLE if (usb_device != NULL) { USB_MassStorage(usb_device); } #endif ret = sys_event_get(&event); if (ret == FALSE) { continue; } switch (event.type) { case SYS_KEY_EVENT: app_key_event_handler(&event); break; case SYS_MSG_EVENT: app_msg_event_handler(&event); break; case SYS_DEVICE_EVENT: app_device_event_handler(&event); break; } } }app_main()完成相关初始化之后,进入主循环,等待接收事件并处理事件。事件类型分为按键事件,消息事件和设备事件。在event.h中可自定义事件。
以下为事件相关的API。
5.5.1. sys_event_notify
事件通知函数,系统有事件发生时调用此函数。
bool sys_event_notify(struct sys_event *e); 参数: ========== ==================== e 事件结构体 返回值 FALSE/TRUE ========== ====================
5.5.2. sys_event_clear
清空事件列表。
void sys_event_clear(void);
5.5.3. sys_event_get
从事件列表获取事件。
bool sys_event_get(struct sys_event *e); 参数: ========== ==================== e 事件结构体 返回值 FALSE/TRUE ========== ====================
5.5.4. sys_event_init
事件初始化。
void sys_event_init(void);