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

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


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

📑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->OUTDR ;

  /* 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;
    }
}
  • ⚡在实际测试中,使用IO状态翻转函数来改变引脚状态频繁操作情况下会出现异常,目前不知道是说明原因导致的,在STM32上不存这个情况,而且在stm32中已经将状态翻转函数封装到库函数里面了。在CH32F203中还是尽量少用这种方式,在CH32中没有将列入此函数。

📝点灯程序代码

  • 📋参考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");//


    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值