查看: 1861|回复: 0

CH32V103应用教程——GPIO(天问CH32V)

[复制链接]

41

主题

167

帖子

3099

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3099
发表于 2021-11-27 09:45:37 | 显示全部楼层 |阅读模式
本帖最后由 zly188 于 2021-11-27 09:52 编辑

本章通过点亮LED作为CH32V103系列MCU应用开发的第一个教程,其LED灯控制使用到GPIO外设的基本输出功能,本章将通过点亮LED对CH32V103的GPIO进行基本的学习了解。


1、GPIO简介及其库函数介绍
GPIO,全称为通用输入输出端口,其可与外部设备连接实现MCU与外部设备的通讯、控制、信号采集等功能。本教程即通过CH32V103的GPIO与LED连接,实现MCU对LED的输出控制。关于CH32V103 GPIO的具体介绍,可参考CH32V103应用手册和数据手册。


进行LED点亮程序编写之前,需对GPIO固件库进行了解。GPIO相关的函数和定义分布在固件库文件ch32v10x_gpio.c和头文件ch32v10x_gpio.h文件中,LED点亮程序需要调用GPIO固件库文件中某些函数,GPIO库函数相关函数如下:

  1. void GPIO_DeInit(GPIO_TypeDef* GPIOx);
  2. void GPIO_AFIODeInit(void);
  3. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
  4. void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
  5. uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  6. uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
  7. uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  8. uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
  9. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  10. void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  11. void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
  12. void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
  13. void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  14. void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
  15. void GPIO_EventOutputCmd(FunctionalState NewState);
  16. void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
  17. void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
复制代码
1.1、void GPIO_DeInit(GPIO_TypeDef* GPIOx)
功  能:将GPIOx外围寄存器初始化为其默认重置值。
参  数:GPIOx用来选择GPIO外设,取值可为GPIOA-GPIOG。

1.2、void GPIO_AFIODeInit(void)
功  能:将复用功能(重映射,事件控制与EXTI设置)重设为默认值。通俗理解可认为此函数功能为初始化所有的复用功能。
参  数:无。

1.3、void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
功  能: GPIO初始化函数,根据GPIO_InitStructure中的指定参数初始化GPIO外设寄存器。
参  数:GPIOx用来选择GPIO外设,取值可为GPIOA-GPIOG;GPIO_InitStructure为GPIO_InitTypedef类型结构体指针,指向包含GPIO外设配置信息的GPIO_InitTypedef结构体。

1.4、void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
功  能:初始化结构体成员,即用其默认值填充每个GPIO_StructInit成员,包括GPIO_Pin、GPIO_Speed、GPIO_Mode等。
参  数:GPIO_StructInit为指向结构体GPIO_InitTypedef的指针,待初始化。

1.5、uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功  能:读取指定端口管脚的输入(0或1)。
参  数:GPIOx用来选择GPIO外设,取值可为GPIOA-GPIOG;GPIO_Pin用来选择待读取的端口位。

1.6、uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
功  能:读取指定的GPIO输入数据端口。
参  数:无。

1.7、uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功  能:读取指定端口管脚的输出(0或1)。
参  数:GPIOx用来选择GPIO外设,取值可为GPIOA-GPIOG;GPIO_Pin用来选择待读取的端口位。

1.8、uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
功  能:读取指定的GPIO输出数据端口。
参  数:无。

1.9、void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功  能:设置指定的数据端口位,可理解为将指定的引脚设置为高电平。
参  数:GPIOx用来选择GPIO外设,取值可为GPIOA-GPIOG;GPIO_Pin用来选择待设置的端口位。

1.10、void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功  能:清除指定的数据端口位,可理解为将指定的引脚设置为低电平。
参  数:GPIOx用来选择GPIO外设,取值可为GPIOA-GPIOG;GPIO_Pin用来选择待设置的端口位。

1.11、void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
功  能:设置或清除指定的数据端口位,可理解为将指定的引脚设置为高电平或低电平。
参  数:GPIOx用来选择GPIO外设,取值可为GPIOA-GPIOG;GPIO_Pin用来选择待设置的端口位;BitVal为指定待写入的值,该参数必须取枚举BitAction的其中一个值。

1.12、void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
功  能:向指定的GPIO端口写入数据
参  数:GPIOx用来选择GPIO外设,取值可为GPIOA-GPIOG;PortVal为待写入端口数据寄存器(ODR寄存器)的值。

1.13、void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
功  能:锁定GPIO管脚配置寄存器。
参  数:GPIOx用来选择GPIO外设,取值可为GPIOA-GPIOG;,GPIO_Pin为待锁定的端口位。

1.14、void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
功  能:选择GPIO管脚用作事件输出
参  数:GPIO_PortSource为选择用作事件输出的GPIO端口;GPIO_PinSource为事件输出的管脚。

1.15、void GPIO_EventOutputCmd(FunctionalState NewState)
功  能:使能或失能事件输出
参  数:NewState为管脚重映射的新状态,该参数可以取ENABLE或DISABLE。

1.16、void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
功  能:更改指定管脚的映射。
参  数:GPIO_Remap为选择重映射的管脚;NewState为管脚重映射的新状态,该参数可以取ENABLE或DISABLE。

1.17、void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
功  能:选择GPIO管脚用作外部中断线路。
参  数:GPIO_PortSource为选择用作外部中断线源的GPIO端口;GPIO_PinSource为待设置的外部中断线路。


2、硬件设计
由于本次教程为点亮LED,需用到LED。开发板上带有单个LED(PC8)和八个LED(PB8-PB5),内部电路已经连接。电路图如下:
单个LED

图片1.png

8个LED流水灯
图片2.png

3、软件设计
本章将讲解点亮单个LED点亮程序。通过控制CH32V103 GPIO引脚的电平高低实现LED闪烁,图形化程序如下:
点亮单个LED
图片3.png

单个LED闪烁
图片4.png

使用HAL库写程序按下面步骤进行:
定义一个GPIO_InitTypeDef类型结构体,结构体成员包括GPIO_Pin、GPIO_Mode、GPIO_Speed;
使能GPIO时钟,否则GPIO引脚不工作,本次实验使能GPIOA时钟;
配置GPIO_InitTypeDef类型结构体成员参数,及配置GPIO引脚为对应引脚、GPIO模式为推挽输出、GPIO口输出速度为相应值;
调用库函数,初始化GPIO;
调用库函数,设置GPIO引脚输出电平。点亮单个LED
  1. #include <CH32V103.h>

  2. void LED_Init(void)
  3. {
  4.   GPIO_InitTypeDef  GPIO_InitStructure;  //定义一个GPIO_InitTypeDef类型的结构体
  5.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能与LED相关的GPIO端口时钟
  6.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;       //配置GPIO引脚
  7.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //设置GPIO模式为推挽输出
  8.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //设置GPIO口输出速度
  9.   GPIO_Init(GPIOC, &GPIO_InitStructure);     //调用库函数,初始化GPIOC
  10.   GPIO_SetBits(GPIOC,GPIO_Pin_8);    //设置引脚输出高电平
  11. }

  12. int main(void)
  13. {
  14.   CH32_Init();
  15.   LED_Init();     //LED初始化
  16.   GPIO_SetBits(GPIOC,GPIO_Pin_8);
  17.   while(1){

  18.   }
  19.   return 1;
  20. }
复制代码


单个LED闪烁
  1. #include <CH32V103.h>

  2. void LED_Init(void)
  3. {
  4.   GPIO_InitTypeDef  GPIO_InitStructure;  //定义一个GPIO_InitTypeDef类型的结构体
  5.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能与LED相关的GPIO端口时钟
  6.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;       //配置GPIO引脚
  7.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //设置GPIO模式为推挽输出
  8.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //设置GPIO口输出速度
  9.   GPIO_Init(GPIOC, &GPIO_InitStructure);     //调用库函数,初始化GPIOC
  10.   GPIO_SetBits(GPIOC,GPIO_Pin_8);    //设置引脚输出高电平
  11. }

  12. int main(void)
  13. {
  14.   uint8_t i = 0;
  15.   CH32_Init();
  16.   LED_Init();     //LED初始化
  17.   while(1){
  18.     delay(250);
  19.     GPIO_WriteBit(GPIOC, GPIO_Pin_8, (i==0) ? (i=Bit_SET):(i=Bit_RESET)); //设置PC8引脚状态翻转
  20.   }
  21.   return 1;
  22. }
复制代码

教学视频:





回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|好好搭搭在线 ( © 好好搭搭在线 浙ICP备19030393号-1 )

GMT+8, 2024-4-19 15:22 , Processed in 0.346610 second(s), 25 queries .

Powered by Discuz!

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表