下面介绍一下IO的初始化,IO初始化无非就是将IO设为输入/输出/开漏/准双向等模式,然后反转 IO输出,或者读IO的状态。另外也可能配置为中断。
Void GPIO_Init() {
/* PB.0 配置为输出,PD.4 配置为输入模式 */
GPIO_SetMode(PB, BIT0, GPIO_PMD_OUTPUT); GPIO_SetMode(PD, BIT4, GPIO_PMD_INPUT);
/* PD.0 配置为输出*/
GPIO_SetMode(PD, BIT0, GPIO_PMD_OUTPUT);
/*从PB0输出0*/
PB0 = 0;
/* 将 PB5 配置为输入模式并使能上升沿中断 */
GPIO_SetMode(PB, BIT5, GPIO_PMD_INPUT);
GPIO_EnableInt(PB, 5, GPIO_INT_RISING);
NVIC_EnableIRQ(GPABC_IRQn);
/* 将 PE2 配置为输入模式,打开内部上拉,并使能下降沿中断 */
GPIO_SetMode(PE, BIT2, GPIO_PMD_INPUT);
GPIO_ENABLE_PULL_UP(PE, BIT2);
GPIO_EnableInt(PE, 2, GPIO_INT_FALLING);
NVIC_EnableIRQ(GPDEF_IRQn);
/* 将 PA2 配置为 EINT0 引脚,并使能下降沿中断 */
SYS->PA_L_MFP = (SYS->PA_L_MFP & ~ SYS_PA_L_MFP_PA2_MFP_Msk) |
SYS_PA_L_MFP_PA2_MFP_EINT0;
GPIO_SetMode(PA, BIT2, GPIO_PMD_INPUT);
GPIO_EnableEINT0(PA, 2, GPIO_INT_FALLING);
NVIC_EnableIRQ(EINT0_IRQn);
/* 使能消抖功能并选择消抖采样周期。因为PB.5和PE.2以及PA.2都使能了中断,所以最好打开消抖功能 */
GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_HCLK, GPIO_DBCLKSEL_1);
GPIO_ENABLE_DEBOUNCE(PB, BIT5);
GPIO_ENABLE_DEBOUNCE(PE, BIT2);
GPIO_ENABLE_DEBOUNCE(PA, BIT2);
} void GPABC_IRQHandler(void)
{
/* 检查是否发生PB.5 中断 */
if (PB->ISRC & BIT5) {
PB->ISRC = BIT5;/*清除PB.5中断标志*/
PD0 = PD0 ^ 1;
printf("PB.5 INT occurred. \n");
} else {
/* 不期望的其它中断 */
PA->ISRC = PA->ISRC;
PB->ISRC = PB->ISRC; PC->ISRC = PC->ISRC; printf("Un-expected interrupts. \n");
}
} void GPDEF_IRQHandler(void)
{
/*检查是否发生PE.2 中断*/
if (PE->ISRC & BIT2) {
PE->ISRC = BIT2; PD0 = PD0 ^ 1; printf("PE.2 INT occurred. \n");
} else {
/* 不期望的其它中断 */
PD->ISRC = PD->ISRC;
PE->ISRC = PE->ISRC; PF->ISRC = PF->ISRC; printf("Un-expected interrupts. \n");
} } void EINT0_IRQHandler(void)
{
/* 清除 PA.2中断标志 */
PA->ISRC = BIT2;
PD0 = PD0 ^ 1;/*反转PD.0*/ printf("PA.2 EINT0 occurred. \n");
}
|