[RISC-V MCU 应用开发] 第一百零七章、CH32V103应用教程——PD0、1引脚的复用

[复制链接]
3580|0
 楼主| RISCVLAR 发表于 2021-8-19 10:55 | 显示全部楼层 |阅读模式
本帖最后由 RISCVLAR 于 2021-8-19 10:55 编辑

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

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

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

3软件设计
本次实验具体程序如下,由于代码量较小,均放在main函数,main函数如下:
Main.c文件
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name          : main.c
  3. * Author             : WCH
  4. * Version            : V1.0.0
  5. * Date               : 2020/04/30
  6. * Description        : Main program body.
  7. *******************************************************************************/

  8. /*
  9. *@Note
  10. GPIO例程:
  11. PA0推挽输出。

  12. */

  13. #include "debug.h"

  14. #define in  1
  15. //#define out 0

  16. /*******************************************************************************
  17. * Function Name  : GPIO_Toggle_INIT
  18. * Description    : Initializes GPIOA.0
  19. * Input          : None
  20. * Return         : None
  21. *******************************************************************************/
  22. void GPIO_Toggle_INIT(void)
  23. {
  24.     GPIO_InitTypeDef  GPIO_InitStructure;

  25.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
  26.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  27.     GPIO_PinRemapConfig(GPIO_Remap_PD01,ENABLE);

  28. #ifdef out
  29.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  30.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  31.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  32.     GPIO_Init(GPIOD, &GPIO_InitStructure);

  33.     GPIO_SetBits(GPIOD, GPIO_Pin_0);
  34.     GPIO_SetBits(GPIOD, GPIO_Pin_1);

  35. #elif  in
  36.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  37.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  38.     GPIO_Init(GPIOD, &GPIO_InitStructure);
  39. #endif
  40. }

  41. /*******************************************************************************
  42. * Function Name  : main
  43. * Description    : Main program.
  44. * Input          : None
  45. * Return         : None
  46. *******************************************************************************/
  47. int main(void)
  48. {
  49.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  50.     Delay_Init();
  51.         USART_Printf_Init(115200);
  52.         printf("SystemClk:%d\r\n",SystemCoreClock);
  53.         printf("GPIO Toggle TEST\r\n");
  54.         GPIO_Toggle_INIT();

  55.         while(1)
  56.     {
  57. #ifdef out
  58.         Delay_Ms(500);
  59.         GPIO_ResetBits(GPIOD, GPIO_Pin_0);
  60.         GPIO_ResetBits(GPIOD, GPIO_Pin_1);
  61.         printf("111111\r\n");
  62.         Delay_Ms(500);

  63.         GPIO_SetBits(GPIOD, GPIO_Pin_0);
  64.         GPIO_SetBits(GPIOD, GPIO_Pin_1);
  65.         printf("222222\r\n");
  66.         Delay_Ms(500);

  67. #elif  in
  68.         if((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0)==1)||(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)==1))
  69.         {
  70.              printf("up\r\n");
  71.              Delay_Ms(500);
  72.         }
  73.         else
  74.         {
  75.              printf("down\r\n");
  76.              Delay_Ms(500);
  77.         }

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

4下载验证
将编译好的程序下载到开发板并复位,当作为输出时,可看到测试板LED灯闪烁,同时串口打印如下:
图片2.png
当作为输入使用时,当将PD0、1引脚接GND或者VCC时,串口打印如下:
图片3.png

CH32V PD01复用.rar

460.76 KB, 下载次数: 6

您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

296

帖子

45

粉丝
快速回复 在线客服 返回列表 返回顶部