下面介绍一下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");
- }
|