CH32V307-中断嵌套优先级配置

学习目标:

掌握CH32V307沁恒微电子开发流程

例如:

一周掌握 CH32V307开发流程


学习内容:

在完成前序学习GPIO管脚控制以及中断配置以后,这个模块就是进行中断的优先级测试 使用PC4 PA1进行中断优先级配置。在这里先进行 配置,优先级 GPIO的外部硬件状态改变优先级高于串口打印。这里配置PC1中断低 PC6中断高。

学习产出:

完成ch32v307的GPIO外部中断抢占式/响应式优先级配置,并通过串口打印结果显示。

阅读手册:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上述这些从手册中截取的章节来根据需要调整中断抢占式/响应式优先级。

成果展示:

在这里插入图片描述

代码区:

/*
 * Author:白小小张
 * 博客:优快云
 * 模块:单片机ch32v307 系列
 *
 * 有问题 大家可以留言讨论
 *
 * */

//这个模块就是进行中断的优先级测试   使用PC4 PA1进行中断优先级配置
//在这里我先进行 配置,优先级 GPIO的外部硬件状态改变优先级高于串口打印
//这里配置PC1中断低  PC6中断高
#include "debug.h"


void EXTI1_IRQHandler(void)  __attribute__((interrupt(/*"WCH-Interrupt-fast"*/)));
void EXTI9_5_IRQHandler(void)  __attribute__((interrupt(/*"WCH-Interrupt-fast"*/)));

void Interrupt_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    EXTI_ClearITPendingBit(EXTI_Line1);

    EXTI_InitTypeDef EXTI_InitStructure = {0};
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitTypeDef NVIC_InitStructure = {0};
    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;   //响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    EXTI_ClearITPendingBit(EXTI_Line6);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
    EXTI_InitStructure.EXTI_Line = EXTI_Line6;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;   //响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);
    printf("PC1 is %d\r\n",GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1));
    printf("PC6 is %d\r\n",GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6));
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //优先级分组为2   那就是

    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);	
    Interrupt_Init();
    printf("中断初始化成功! \r\n");
    while(1)
    {
        Delay_Ms(10000);
        printf("白小小张学习的一天!\r\n");
    }
}
void EXTI1_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line1)!=RESET)
    {
        printf("EXTI1_IRQ Begin!\r\n");
        Delay_Ms(30000);       //这里配置延迟目的是测试PC4会在PA1中断期间打断中断,真实情况下,中断越简单越好
        EXTI_ClearITPendingBit(EXTI_Line1);
        printf("EXTI1_IRQ END6!\r\n");
    }
}

void EXTI9_5_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line6)!=RESET)
    {
        printf("EXTI9_5_IRQ Begin!\r\n");
        Delay_Ms(10000);

        printf("EXTI9_5_IRQ END!\r\n");
        EXTI_ClearITPendingBit(EXTI_Line6);
    }
}

学习心得:

	⭐截至到这里,就完成了不同GPIO在配置中断优先级,抢占式/响应式时需要注意的步骤,通过串口打印可以观察到中断抢占的标志。

	⭐基于此案例可以进一步进行有关中断服务器抢占的应用

	⭐切忌:眼高手低。尽量避免出现一看就会,一上就废。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值