学习目标:
掌握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在配置中断优先级,抢占式/响应式时需要注意的步骤,通过串口打印可以观察到中断抢占的标志。
⭐基于此案例可以进一步进行有关中断服务器抢占的应用
⭐切忌:眼高手低。尽量避免出现一看就会,一上就废。