ICU使用指南
ICU模块是基于S100芯片解决方案的一个软件子模块,在整个系统属于基础服务软件。在S100整体设计中,ICU软件主要是对系统内有输入捕获属性的硬件进行软件抽象并统一管理,硬件层IP涉及到PWM和GPIO两个硬件。本文重点介绍GPIO中断的配置和实现。
GPIO中断使用指南
S100 MCU中,GPIO共有四个IO组,分别是3个PORT,GPIO0,GPIO1,GPIO2,GPIO_AON。其中,前三组共计提供88个 Pin,而GPIO_AON组则提供12个Pin。该部分可参考 mcu/Config/McalCdd/gen_s100_sip_B_mcu1/Port/src/Port_PBcfg.c 。所有的Pin支持的中断触发模式包括:上升沿、下降沿、双边沿以及高/低电平触发。
| ISR Function | IRQ | IRQ Define | Description |
|---|---|---|---|
| Gpio0_ExtIsr | 68 | MCUSYS_GPIO0_INTR | Gpio Mode |
| Gpio1_ExtIsr | 69 | MCUSYS_GPIO1_INTR | Gpio Mode |
| Gpio2_ExtIsr | 70 | MCUSYS_GPIO2_INTR | Gpio Mode |
| Gpio3_ExtIsr | 361 | AON_WAKEUP_GPIO_INTR | Gpio Mode |
Port配置
S100 MCU上的每个Pin支持至少一个功能,因此在使用GPIO中断之前需要通过Port子系统配置Pin的功能和属性,也就是重定义过程。以 GPIO_MCU[20] 和 GPIO_MCU[21] 为例子,这两个Pin的功能如下:
| FUNC0 | IO TYPE0 | FUNC1 | IO TYPE1 | FUNC2 | IO TYPE2 | FUNC3 | IO TYPE3 |
|---|---|---|---|---|---|---|---|
| SPI3_CSN0 | O | DEBUG_OUT5 | O | TRC_CTL | O | GPIO_MCU[20] | IO |
| SPI3_CSN1 | IO | PPS_IN0 | I | TRC_CLK | O | GPIO_MCU[21] | IO |
需要将两个Pin配置为FUNC3,即GPIO模式,关于Port的介绍和使用可以查阅 Port使用指南 和 Port开发指南 这两个章节。具体的配置文件为 mcu/Config/McalCdd/gen_s100_sip_B_mcu1/Port/src/Port_PBcfg.c。
static const Port_Lld_PinConfigType Port_McuPinConfigs[PORT_MCU_MAX_NUM]=
{
...
/* Pin Id, Pin name, IsUsed, ModeChang, SchmittTriger, InputEnable, IsUsedGpio, DirChang, PinMode, Config Type, Pull Type, Drive Strength, GpioDir, GpioData*/
{(uint8)20, "SPI3_CSN0", (boolean)TRUE, {(boolean)TRUE, (boolean)FALSE, (boolean)TRUE, (boolean)TRUE, (boolean)FALSE, GPIO, PORT_PIN_CONFIG_TYPE0, PORT_PULL_UP, PORT_DRIVE_DEFAULT, PORT_PIN_DIR_IN, PORT_PIN_LEVEL_LOW}},
/* Pin Id, Pin name, IsUsed, ModeChang, SchmittTriger, InputEnable, IsUsedGpio, DirChang, PinMode, Config Type, Pull Type, Drive Strength, GpioDir, GpioData*/
{(uint8)21, "PWR_SHDN_N", (boolean)TRUE, {(boolean)TRUE, (boolean)FALSE, (boolean)TRUE, (boolean)TRUE, (boolean)FALSE, GPIO, PORT_PIN_CONFIG_TYPE0, PORT_PULL_UP, PORT_DRIVE_DEFAULT, PORT_PIN_DIR_IN, PORT_PIN_LEVEL_LOW}},
...
}
ICU配置
ICU文件列表:
- mcu/McalCdd/Icu/src/Icu_Lld_Gpio.c
- mcu/McalCdd/Icu/src/Icu_Lld.c
- mcu/McalCdd/Icu/src/Icu.c
- mcu/McalCdd/Icu/inc/Icu_Lld_Gpio.h
- mcu/McalCdd/Icu/inc/Icu_Lld.h
- mcu/McalCdd/Icu/inc/Icu_Types.h
- mcu/McalCdd/Icu/inc/Icu.h
GPIO中断功能由ICU统一管理,其引脚的详细属性(如中断类型、回调函数等)均需通过ICU配置。具体的配置文件为 mcu/Config/McalCdd/gen_s100_sip_B_mcu1/Icu/src/Icu_PBCfg.c ,通过修改 Icu_ConfigType 、 Icu_Lld_IpConfigType 、 Gpio_Icu_IpConfigType、 Icu_Lld_ChannelConfigType 、 Icu_ChannelConfigType 、 Gpio_Icu_ChannelConfigType 等结构体实现。 其中, Gpio_Icu_ChannelConfigType 是关键结构,负责定义中断回调函数、触发类型及中断屏蔽位等。
Icu_ConfigType
#define ICU_CONF_IPS_PB 1
#define ICU_CONF_CHS_PB 2
/** @brief Array of configured Icu channels */
const Icu_ConfigType Icu_Config = {
/** @brief Number of configured Icu ips */
.nNumInstances = ICU_CONF_IPS_PB,
/** @brief Number of configured Icu channels */
.NumChannels = ICU_CONF_CHS_PB,
/** @brief Number of configured Icu channels */
.Icu_ChannelConfigPtr = Icu_ChConfig_PB,
/** @brief Pointer to array of Icu channels */
.Icu_LldConfigPtr = Icu_Lld_IpConfig_PB,
};
| Parameter | Description |
|---|---|
| nNumInstances | GPIO控制器实例数 |
| NumChannels | 通道数(或引脚数) |
| Icu_ChannelConfigPtr | 指向 Icu_ChannelConfigType 结构体的指针 |
| Icu_LldConfigPtr | 指向 Icu_Lld_IpConfigType 结构体的指针 |
Icu_Lld_IpConfigType
#define ICU_CONF_IPS_PB 1
/** @brief Array of high level Icu channel Config Type*/
static Icu_Lld_IpConfigType Icu_Lld_IpConfig_PB[ICU_CONF_IPS_PB] = {
/** @brief gpio module 0 */
{
/**< id of gpio icu module in the Icu configuration */
.instanceNo = 0,
/**< The IP type used. */
.InstanceMode = ICU_GPIO_MODULE,
/**< gpio IP configure type. */
.GpioConfig = &Icu_Gpio_IpConfig_PB[0],
},
};
| Parameter | Description |
|---|---|
| instanceNo | 控制器实例(如0 - GPIO0) |
| InstanceMode | GPIO或者PWM模式 |
| GpioConfig | 指向 Icu_Lld_ChannelConfigType 结构体的指针 |
Gpio_Icu_IpConfigType
#define ICU_GPIO_CONF_MODS_PB 1
/** @brief Array of gpio Icu ip Config Type channels */
static Gpio_Icu_IpConfigType Icu_Gpio_IpConfig_PB[ICU_GPIO_CONF_MODS_PB] = {
/** @brief gpio module 1 */
{
/**< Number of gpio channels in the Icu configuration */
.NumChannels = 2,
/**< The Instance index used for the configuration of channel */
.instanceNo = 0,
/**< id of gpio icu module in the Icu configuration */
.ChannelsConfig = Icu_Gpio_ChannelConfig_PB[0],
},
};
| Parameter | Description |
|---|---|
| NumChannels | 通道数 |
| instanceNo | 控制器实例(如0 - GPIO0) |
| ChannelsConfig | 指向 Gpio_Icu_ChannelConfigType 结构体的指针 |
Icu_ChannelConfigType
#define ICU_CONF_CHS_PB 2
/** @brief Array of high level Icu channel Config Type*/
static Icu_ChannelConfigType Icu_ChConfig_PB[ICU_CONF_CHS_PB] = {
/** @brief icu CH 0 */
{
/** Assigned ICU channel id*/
.ChannelId = 0,
/** @brief Pointer to the lld gpio channel pointer configuration, gpio 4 channel 0 */
.Icu_LldChannelConfigPtr = &Icu_Lld_Gpio_ChannelConfig_PB[0][0],
},
/** @brief icu CH 1 */
{
/** Assigned ICU channel id*/
.ChannelId = 1,
/** @brief Pointer to the lld gpio channel pointer configuration, gpio 4 channel 1 */
.Icu_LldChannelConfigPtr = &Icu_Lld_Gpio_ChannelConfig_PB[0][1],
},
};
| Parameter | Description |
|---|---|
| ChannelId | 通道标识符 |
| Icu_LldChannelConfigPtr | 指向 Icu_Lld_ChannelConfigType 结构的指针 |
Icu_Lld_ChannelConfigType
#define ICU_GPIO_CONF_MODS_PB 1
/** @brief Array of Gpio Channel ConfigType channels*/
static Icu_Lld_ChannelConfigType Icu_Lld_Gpio_ChannelConfig_PB[ICU_GPIO_CONF_MODS_PB][32] = {
/** @brief gpio module 0 */
{
/** @brief gpio mod 0 channel 20 */
{
.ChannelMode = ICU_GPIO_MODULE,
.instanceNo = 0,
.gpioHwChannelConfig = &Icu_Gpio_ChannelConfig_PB[0][0],
},
/** @brief gpio mod 0 channel 21 */
{
.ChannelMode = ICU_GPIO_MODULE,
.instanceNo = 0,
.gpioHwChannelConfig = &Icu_Gpio_ChannelConfig_PB[0][1],
},
},
};
| Parameter | Description |
|---|---|
| ChannelMode | GPIO或者PWM模式 |
| instanceNo | 控制器实例(如0 - GPIO0) |
| gpioHwChannelConfig | 指向 Gpio_Icu_ChannelConfigType 结构体的指针 |