第一个实验内容从了解HC32F460PETB的通用输入输出(GPIO)端口开始,本次实验内容为利用开发板上的四个独立按键(SW2、SW3、SW4、SW5)控制四个LED(D23、D26、D27、D30)的亮、灭,并且使用了按键所在端口的外部中断功能。
一、实验资源
1、HC32F460-EVB;
2、Keil V5.28;
3、ST-LINK调试器
二、资源简介
1、GPIO
HC32F460PETB最多有83个GPIO引脚,其中的81个端口都具有5V电压容限,方便应用。每个端口都可配置为具有中断功能,具备多种工作模式,同一个端口最多支持64个可选的复用功能,还有一个比较特色的功能是同一个端口可以配置为同时支持两种功能。
手册中“通用控制”章节部分下图中高亮文字描述存在文本错误,首先是没有“PFRSxy”寄存器,但是有个“PFSRxy”功能选择寄存器;再有就是相应的控制位在“PCRxy”通用控制寄存器。
2、INTC
HC32F460中断控制器(INTC)看上去也是非常复杂,功能亦是非常强大,合理有效的利用中断可提升系统运行效率。本次实验中只是使用了其中的外部管脚中断。如:
外部管脚的中断源支持多种非触发方式,包括上升沿、下降沿、双边沿、低电平等,使用非常灵活。
从配置中断到使能中断,直到最终中断响应、处理中断期间有很多的步骤,要做的事也比较多,要在大量的应用中去体会,《ARM Cortex™-M4F技术参考手册》这本书还是要好好琢磨的。好在这次实验中有官方的DEMO可以做参考,对提升理解能力非常有帮助。
三、代码实现
根据原理图确定GPIO端口及中断配置:
功能实现的代码部分参考了官方DEMO,下面是部分片断:
void Sw2_Init(void)//KEY0
{
stc_exint_config_t stcExtiConfig; //外部中断配置
stc_irq_regi_conf_t stcIrqRegiConf; //中断请求
stc_port_init_t stcPortInit; //GPIO初始化
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcExtiConfig);
MEM_ZERO_STRUCT(stcIrqRegiConf);
MEM_ZERO_STRUCT(stcPortInit);
/**************************************************************************/
/* External Int Ch.3 */
/**************************************************************************/
stcExtiConfig.enExitCh = ExtiCh03; //外部中断通道3
/* Filter setting */
stcExtiConfig.enFilterEn = Enable; //启用过滤功能
stcExtiConfig.enFltClk = Pclk3Div8;
/* Both edge */
// stcExtiConfig.enExtiLvl = ExIntBothEdge; //检测方式下降或上升边缘检测
stcExtiConfig.enExtiLvl = ExIntFallingEdge; //下降沿
// stcExtiConfig.enExtiLvl = ExIntRisingEdge; //上升沿
// stcExtiConfig.enExtiLvl = ExIntLowLevel; //低电平
EXINT_Init(&stcExtiConfig);//外部中断初始化
/* Set PD03 as External Int Ch.3 input 将PD03设置为外部中断 Ch.3输入*/
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enExInt = Enable;//使能外部中断
PORT_Init(SW2_PORT, SW2_PIN, &stcPortInit);//PD3中断
/* Select External Int Ch.3 */
stcIrqRegiConf.enIntSrc = INT_PORT_EIRQ3;//PD3
/* Register External Int to Vect.No.000 */
stcIrqRegiConf.enIRQn = Int000_IRQn;//定义中断号为000
/* Callback function */
stcIrqRegiConf.pfnCallback = &KEY_ExtInt_Callback;
/* Registration IRQ */
enIrqRegistration(&stcIrqRegiConf);
/* Clear pending */
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
/* Set priority */
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15);//中断优先级别15
/* Enable NVIC */
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
}
中断回调函数:
void KEY_ExtInt_Callback(void)
{
if (Set == EXINT_Irq**Get(ExtiCh03))//SW2
{
LED0_TOGGLE(); //D23
EXINT_Irq**Clr(ExtiCh03);
}
if (Set == EXINT_Irq**Get(ExtiCh04))
{
LED1_TOGGLE(); //D26
EXINT_Irq**Clr(ExtiCh04);
}
if (Set == EXINT_Irq**Get(ExtiCh05))//SW4
{
LED2_TOGGLE(); //D27
EXINT_Irq**Clr(ExtiCh05);
}
if (Set == EXINT_Irq**Get(ExtiCh06))//SW5
{
LED3_TOGGLE(); //D30
EXINT_Irq**Clr(ExtiCh06);
}
}
四、实验总结
实验结果符合预期,对HC32F460的GPIO及INTC的使用配置有了初步的了解和认识。实验中应该体现出按键产生不同类型“边沿”触发中断的不同反应,可是代码中还没有实践,后面要进一步进行完善。
|