【WCH】基于Keil环境CH32F203 GPIO点灯实验

news2024/11/24 16:04:06

【WCH】基于Keil环境CH32F203 GPIO点灯实验


  • 📌相关篇《关于CH32F203程序下载方式说明》
  • ⚡注意编译器版本不要使用AC6版本。

✨如果是首次入门使用,请先看上面的相关篇内容,了解其下载相关事宜后,再进来学习。

📑GPIO模式介绍

  • 🌿在应用手册的第十章介绍GPIO。

GPIO 口可以配置成多种输入或输出模式,内置可关闭的上拉或下拉电阻,可以配置成推挽或开漏
功能。GPIO 口还可以复用成其他功能。

  • 🌴GPIO模式:
  • 浮空输入
  • 上拉输入
  • 下拉输入
  • 模拟输入
  • 开漏输出
  • 推挽输出
  • 复用功能的输入和输出
    在这里插入图片描述
  • 🔖锁定机制

锁定机制可以锁定 IO 口的配置。经过特定的一个写序列后,选定的 IO 引脚配置将被锁定,在下
一个复位前无法更改。

外设的 GPIO 设置一览表:

在这里插入图片描述

⛳注意事项

  • ⚡在使用PCout()操作GPIOC端口上的引脚状态时需要右移13bit.应该是芯片设计上出了bug。其他端口组不需要。
PCout(13>> 13)=1;
PCout(13>> 13)=0;
  • 🔰补充IO状态翻转函数
void GPIO_InverseBits( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin )
{
		  uint32_t odr;
#if defined (CH32F20x_D6)	
		if(GPIOx == GPIOC){
			GPIO_Pin = GPIO_Pin >> 13;
		}	
#endif	
		odr = GPIOx->INDR;

  /* Set selected pins that were at low level, and reset ones that were high */
  GPIOx->BSHR = ((odr & GPIO_Pin) << 16u) | (~odr & GPIO_Pin);
}
  • 🌿或这样写实现:
/**
  * @brief  Toggles the specified GPIO pin
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
  * @param  GPIO_Pin: Specifies the pins to be toggled.
  * @retval None
  */
void GPIO_TogglePin( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin )
{
	uint8_t bitstatus = 0x00;
#if defined (CH32F20x_D6)	
		if(GPIOx == GPIOC){
			GPIO_Pin = GPIO_Pin >> 13;
		}	
#endif	

	  if( ( GPIOx->OUTDR & GPIO_Pin ) != ( uint32_t )Bit_RESET )
    {
        bitstatus = ( uint8_t )Bit_SET;
    }
    else
    {
        bitstatus = ( uint8_t )Bit_RESET;
    }
		
    if( bitstatus != Bit_RESET )
    {
        GPIOx->BCR = GPIO_Pin;
    }
    else
    {      
			GPIOx->BSHR = GPIO_Pin;
    }
}

📝点灯程序代码

  • 📋参考CH32F203 官方的SDK固件包,中的GPIO案例修改而来,修改了IO口状态翻转的相关代码。
#include "debug.h"

/* Global define */


/* Global Variable */


/*********************************************************************
 * @fn      GPIO_Toggle_INIT
 *
 * @brief   Initializes GPIOA.0
 *
 * @return  none
 */
void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    uint8_t i = 0;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n", SystemCoreClock);  //9600 0000

    printf("GPIO Toggle TEST2\r\n");
    GPIO_Toggle_INIT();

    while (1)
    {
        Delay_Ms(250);
        Delay_Ms(250);
        GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)));
        i = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13);
        GPIO_WriteBit(GPIOC, GPIO_Pin_13, (i == 0) ? Bit_SET : Bit_RESET);
        Delay_Ms(250);
        Delay_Ms(250);
        printf("Hello World! \r\n");//


    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

15个前端数据大屏展示图+源代码免费下载

https://download.csdn.net/download/wanghongpu9305/87658655?spm1001.2014.3001.5503 https://download.csdn.net/download/wanghongpu9305/87658730?spm1001.2014.3001.5503 https://download.csdn.net/download/wanghongpu9305/87684844?spm1001.2014.3001.5503 http…

windows Linux :python 脚本 下载日本葵花8号卫星数据L1级产品,自定义分辨率、时间

前言介绍 近期需要用到日本葵花8号卫星数据&#xff0c;用于相关研究&#xff0c;而通过官方提供的下载方法&#xff0c;难以针对性的下载所需要的数据类型&#xff0c;因此这里编写了一个针对葵花8号卫星L1级数据产品的脚本下载&#xff0c;主要实现两个功能&#xff1a;1、自…

为docker安装图形界面和配置远程桌面连接

由于远程桌面访问必须要打开端口3389&#xff0c;所以在启动docker中ubuntu系统的时候要首先将linux系统的3389端口映射出来 docker run -tid -p 3389:3389 --name ceshi --privilegedtrue ceshi /bin/bash 接下来进入到ubuntu中 docker exec -it ceshi /bin/bash 首先安装X…

查找 | 顺序查找、分块查找、二分查找、哈希查找 | 牛客刷题笔记

查找 就平均查找速度而言&#xff0c;下列几种查找速度从慢至快的关系是&#xff1a;顺序、分块、折半、哈希。 顺序查找的时间复杂度为o(n) 分块查找的时间复杂度为o(log2n)到o(n)之间 二分查找的时间复杂度为o(log2n) 哈希查找的时间复杂度为o(1) 用概率查找改进查找效率&am…

本周热门chatGPT之AutoGPT-AgentGPT,可以实现完全自主实现任务,附部署使用教程

AutoGPT 是一个实验性的开源应用程序&#xff0c;它由GPT-4驱动&#xff0c;但有别于ChatGPT的是&#xff0c;​ 这与ChatGPT的底层语言模型一致。 ​AutoGPT 的定位是将LLM的"思想"串联起来&#xff0c;自主地实现你设定的任何目标。 简单的说&#xff0c;你只用提出…

界面组件Telerik ASP.NET MVC使用指南 - 如何自定义网格过滤

Telerik UI for ASP. NET MVC拥有使用JavaScript和HTML5构建网站和移动应用所需的70UI部件&#xff0c;来满足开发者的各种需求&#xff0c;提供无语伦比的开发性能和用户体验。它主要是针对专业级的 ASP.NET开发&#xff0c;通过该产品的强大功能&#xff0c;开发者可以开发出…

消息队列面试题-RocketMQ

1.为什么要使用消息队列&#xff1f; 2.消息队列有什么优点和缺点&#xff1f; 3.如何解决重复消费&#xff1f; 幂等性&#xff1a; 概念&#xff1a;一次和多次请求某一个资源对于资源本身应该具有同样的结果&#xff08;网络超时等问题除外&#xff09;。也就是说&#xf…

前端项目-09-购物车-游客列表-变更选中状态-删除

目录 1-加入购物车成功 2-购物车成功页面跳转 3-游客身份获取购物车列表 4-动态渲染购物车列表 5-处理商品数量 6-删除购物车商品 6.1-删除购物车单个商品 6.2-删除全部选中商品 7-修改产品状态 7.1-修改单个产品的状态​编辑 7.2-修改多个产品的状态 1-加入购物车成功…

【2023】分享一份网友的Linux运维面试题

原只有问题&#xff0c;没有答案。答案是我整理的&#xff0c;如发现有什么问题可以在评论区留言告诉我&#xff01;目录1.grep如何查找一个字符串如何忽略大小写2.kill -9和kill -15有什么区别3.简单描述一下TCP的建立和断开4.Linux服务在什么情况下CPU使用率会超过100%5.服务…

【机器学习(四)】基于KNN算法对鸢尾花类别进行分类预测

文章目录专栏导读1、KNN算法原理2、实战案例-对鸢尾花类别分类预测2.1确定特征和类别2.2对特征进行处理2.3对模型调参&#xff0c;选择最优参数2.4使用分类模型进行预测2.5评估模型&#xff0c;检验模型效果3、完整代码及结果专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c…

nginx-代理多个服务

目录 1.主机多Ip 1.1单网卡多ip主机配置 1.2修改default.conf 1.3server1.conf 1.3server2.conf 1.4测试文件 1.4重启测试 2.主机多端口 2.1server1.conf 2.2server2.conf 3.多域名代理 3.1server1.conf 3.2server2.conf 1.主机多Ip 1.1单网卡多ip主机配置 # 查看…

echart图表渲染合并策略

目录 调用方式 notMerge 普通合并 规则 例子 替换合并 规则 例子 echarts渲染函数setOption 调用方式 chart.setOption(option, {notMerge: boolean;replaceMerge?: string | string[];lazyUpdate: boolean; }); notMerge false &#xff08;默认&#xff09; 如果…

【Unity URP】2种描边方案:模板测试和正面剔除

写在前面 风格化不像PBR&#xff0c;好像没有套路可言&#xff0c;&#xff0c;&#xff0c;简直是《怎么好看怎么来》的最大化实践了&#xff01;感觉出的PBRNPR也是为了更好地利用PBR资产才诞生的这样一个渲染方案。&#xff08;当然我的评价非常非常的片面&#xff0c;瞎说…

帆软FineReport学习篇(四)——父子格设置

帆软FineReport学习篇(四)——父子格设置 1.概念 子单元格设置父单元格后,子单元格随父单元格进行扩展 简易的说,子单元格根据父单元格分组显示2 对比示意图 2.1 左父格对比示意图 2.2 上父格对比示意图 3 制作分组报表 3.1 新建普通报表WorkBook2.cpt 3.1.1 点击文件➡点…

OldWang带你了解MySQL(六)

文章目录&#x1f525;SQL函数&#x1f525;单行函数&#x1f525;字符函数&#x1f525;数字函数&#x1f525;日期函数&#x1f525;转换函数&#x1f525;通用函数&#x1f525;SQL函数 函数介绍 函数是 SQL 的一个非常强有力的特性&#xff0c;函数能够用于下面的目的&a…

【 SpringBoot ⽇志⽂件 】

文章目录一、⽇志的作用二、认识⽇志三、⾃定义⽇志打印3.1 在程序中得到⽇志对象3.2 使⽤⽇志对象打印⽇志3.3 ⽇志格式说明四、⽇志级别4.1 ⽇志级别的作用4.2 ⽇志级别的分类与使⽤4.2.1 ⽇志级别的分类4.2.2 ⽇志使⽤4.2.2.1 配置全局日志级别4.2.2.2 配置局部文件夹的日志…

【通过Cpython3.9源码看看python的内存回收机制】

一&#xff1a;建立对象引用计数 1. 相关代码 void _Py_NewReference(PyObject *op) {if (_Py_tracemalloc_config.tracing) {_PyTraceMalloc_NewReference(op);} #ifdef Py_REF_DEBUG_Py_RefTotal; #endifPy_SET_REFCNT(op, 1); #ifdef Py_TRACE_REFS_Py_AddToAllObjects(op…

【算法】AB3DMOT之Sutherland Hodgman多边形裁剪

在AB3MOT模型中有一个步骤为计算IOU时&#xff0c;需要先计算两个立体在地面的投影2D形状&#xff0c;然后计算两个投影的重叠部分&#xff0c;实际上为多边形的裁剪算法。 AB3MOT classmethod def box2corners3d_camcoord(cls, bbox):Takes an objects 3D box with the repr…

懒人式迁移服务器深度学习环境(完全不需要重新下载)

换服务器了&#xff1f;想迁移原来服务器上的深度学习环境&#xff0c;但又觉得麻烦懒得重新安装一遍anaconda、pytorch&#xff1f;有没有办法能不费吹灰之力直接迁移&#xff1f;接下来跟着我一起&#xff0c;懒汉式迁移。   本方法适用于在同一内网下的两台服务器之间互相…

【深度强化学习】(8) iPPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下多智能体深度强化学习算法 ippo&#xff0c;并基于 gym 环境完成一个小案例。完整代码可以从我的 GitHub 中获得&#xff1a;https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model 1. 算法原理 多智能体的情形相比于单智…