草帽王子 发表于 2021-9-10 15:30:11

第一百零七章:CH32V103应用教程——PD0、1引脚的复用

本帖最后由 草帽王子 于 2021-9-10 15:29 编辑

本章教程主要讲述如何进行PD0、1引脚的复用。正常情况下,PD0、1引脚是作为外部晶振引脚使用的,但是某些情况下,我们需要使用重映射功能,把其复用为普通引脚作为输入输出引脚使用。

1、GPIO简介

由数据手册引脚描述可知,外部晶振两个引脚可重映射为PD0、1引脚使用。

2、硬件设计

可使用杜邦线将PD0、1引脚与测试板LED灯连接,测试其输出功能,或与VCC或者GND连接测试其输入功能。

3、软件设计


本次实验具体程序如下,由于代码量较小,均放在main函数,main函数如下:


Main.c文件
/********************************** (C) COPYRIGHT *******************************

* File Name          : main.c

* Author             : WCH

* Version            : V1.0.0

* Date               : 2020/04/30

* Description      : Main program body.

*******************************************************************************/



/*

*@Note

GPIO例程:

PA0推挽输出。



*/



#include "debug.h"



#define in1

//#define out 0



/*******************************************************************************

* Function Name: GPIO_Toggle_INIT

* Description    : Initializes GPIOA.0

* Input          : None

* Return         : None

*******************************************************************************/

void GPIO_Toggle_INIT(void)

{

    GPIO_InitTypeDefGPIO_InitStructure;



    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

    GPIO_PinRemapConfig(GPIO_Remap_PD01,ENABLE);



#ifdef out

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOD, &GPIO_InitStructure);



    GPIO_SetBits(GPIOD, GPIO_Pin_0);

    GPIO_SetBits(GPIOD, GPIO_Pin_1);



#elifin

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

#endif

}



/*******************************************************************************

* Function Name: main

* Description    : Main program.

* Input          : None

* Return         : None

*******************************************************************************/

int main(void)

{

      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    Delay_Init();

      USART_Printf_Init(115200);

      printf("SystemClk:%d\r\n",SystemCoreClock);

      printf("GPIO Toggle TEST\r\n");

      GPIO_Toggle_INIT();



      while(1)

    {

#ifdef out

      Delay_Ms(500);

      GPIO_ResetBits(GPIOD, GPIO_Pin_0);

      GPIO_ResetBits(GPIOD, GPIO_Pin_1);

      printf("111111\r\n");

      Delay_Ms(500);



      GPIO_SetBits(GPIOD, GPIO_Pin_0);

      GPIO_SetBits(GPIOD, GPIO_Pin_1);

      printf("222222\r\n");

      Delay_Ms(500);



#elifin

      if((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0)==1)||(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)==1))

      {

             printf("up\r\n");

             Delay_Ms(500);

      }

      else

      {

             printf("down\r\n");

             Delay_Ms(500);

      }



#endif

      }

}
Main.c文件主要包含两个函数:GPIO_Toggle_INIT函数和main函数,GPIO_Toggle_INIT函数主要进行PD0、1引脚的配置,注意作为重映射功能要使用GPIO_PinRemapConfig(GPIO_Remap_PD01,ENABLE)函数。main函数就是主函数,进行输入输出的运行。

4、下载验证


将编译好的程序下载到开发板并复位,当作为输出时,可看到测试板LED灯闪烁,同时串口打印如下:

当作为输入使用时,当将PD0、1引脚接GND或者VCC时,串口打印如下:





页: [1]
查看完整版本: 第一百零七章:CH32V103应用教程——PD0、1引脚的复用