中断配置完整流程
本帖最后由 崔嵬岱宗 于 2024-11-21 09:54 编辑在QCC51XX的开发板上配置中断首先需要知道以下函数:
1.PioCommonPioBank(uint8 pio)
作用:根据 PIO 引脚编号获取其所在的 Bank(硬件分组)<PIO 引脚在硬件实现中分组管理,一个 Bank 中包含多个 PIO>
输入参数:指定的 PIO 引脚编号,例如 20 表示 PIO20。
返回值:返回对应的 Bank 编号(uint16 类型)。
2.PioCommonPioMask(uint8 pio)
作用:获取指定 PIO 在其 Bank 中的位置掩码(Mask)<一个 Bank 内的 PIO 按位排列,每个 PIO 对应一个掩码>
输入参数:指定的 PIO 引脚编号。
返回值:返回掩码值(uint32 类型),用于标识该 PIO 在 Bank 中的位置。
3.PioSetMapPins32Bank(uint16 bank, uint32 mask, uint32 bits)
作用:将指定的 PIO 引脚映射(mapping)到软件控制模式,使软件能够对该引脚进行操作。
输入参数:
bank:PIO 引脚所属的 Bank。
mask:需要操作的 PIO 掩码。
bits:指定需要映射的 PIO。
返回值:返回 0 表示成功,非 0 表示失败。
4.PioSetDir32Bank(uint16 bank, uint32 mask, uint32 dir)
作用:设置指定 PIO 的方向(输入或输出)。
输入参数:
bank:PIO 引脚所属的 Bank。<pio所属的硬件分组>
mask:需要操作的 PIO 掩码。<具体哪个pio>
dir:0 表示输入模式。1 表示输出模式。
返回值:返回 0 表示成功,非 0 表示失败。
5.PioSet32Bank(uint16 bank, uint32 mask, uint32 bits)
作用:设置 PIO 的电平状态。
如果是输入模式,启用弱上拉(bits = 1)或弱下拉(bits = 0)。
如果是输出模式,设置为高电平(bits = 1)或低电平(bits = 0)。
输入参数:
bank:PIO 引脚所属的 Bank。
mask:需要操作的 PIO 掩码。
bits:指定电平状态:1 表示高电平或启用弱上拉。0 表示低电平或启用弱下拉。
返回值:返回 0 表示成功,非 0 表示失败。
6.PanicNotZero(int status)
作用:检查函数返回值是否为非 0,如果是非 0,则触发错误。
7.PioMonitorRegisterTask(Task task, uint8 pio)
作用:将指定的 PIO 注册为中断源,并指定任务(Task)作为中断处理程序。
输入参数:
task:任务结构体,包含中断处理函数。
pio:需要注册为中断源的 PIO 编号。
返回值:成功返回 0,失败返回非 0。
功能说明:注册后,当 PIO 状态变化时,会触发指定任务的处理函数。例如,中断触发时系统会向任务发送 MESSAGE_PIO_CHANGED 消息
以上函数知道后可以根据hall_effect.c(传感器)来配置中断,简洁方法具体如下:
1.定义变量:
uint16 bank;
uint32 mask;
2. 配置 PIO20 引脚:
bank = PioCommonPioBank(20);
mask = PioCommonPioMask(20);
PanicNotZero(PioSetMapPins32Bank(bank, mask, mask));
PanicNotZero(PioSetDir32Bank(bank, mask, 0)); // 输入模式
PanicNotZero(PioSet32Bank(bank, mask, mask)); // 上拉
3.注册中断处理任务
PioMonitorRegisterTask(&the_volume_service.volume_message_handler_task, 20);// 我这里设置的volume_service.c中的任务处理结构体(包含中断处理函数)
4.在中断处理函数中实现中断后的行为
static void volumeMessageHandler(Task task, MessageId id, Message message)
{
UNUSED(task);
switch(id)
{
case MESSAGE_PIO_CHANGED: // 如果电平有变化
{
... ... // 对中断的处理
... ...
至此一个完整的中断配置完成
支持,很厉害啊 非常感谢分享! thank you 阿里嘎多
页:
[1]