【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");//
}
}