本帖最后由 lilijin1995 于 2022-10-19 10:47 编辑
#申请原创#
@21小跑堂
3.1 Eg1_LED_GPIO_Output我们所有的实例基本都是基于官方评估板学习的,并且所有实例均参考官方例程修改而来,现在先来利用GPIO要控制LED,主要实现两颗LED的跑马灯效果; 3.1.1硬件设计:硬件过于简单,这里展示一下原理图,根据原理图和实物图可知,两颗灯是通过跳线的方式灵活的让你分配引脚的;这里选择PC4和PC3,不要问为什么,因为我们替代的项目用到的就是PC4和PC3来控制两颗LED,懒得改硬件,由原理图可知,LED是共阳极接法,共阳极接法就是逻辑1灭灯,逻辑0亮灯,故而只要控制GPIO输出高低即可实现LED的亮灭;
3.1.2 软件设计:软件涉及到新建工程的问题,大家自行参考MounRiver Studio,过程过于简单,不可描述!所以不展示! 跑马灯实验我们主要用到的固件库文件是:
需要驱动LED,就要配置GPIO口,下面是LED GPIO配置为推挽输出的代码; 该函数的功能就是用来实现配置 PC3和 PC4 为推挽输出。这里需要注意的是:在配置 CH32V003外设的时候,任何时候都要先使能该 外设的时钟。GPIO 是挂载在 APB2 总线上的外设,在固件库中对挂载在 APB2 总线上的外设时
钟使能是通过函数RCC_APB2PeriphClockCmd()来实现的。 最后两行代码"LED1_OFF();LED2_OFF();"乃是为了初始化LED为关闭状态; void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
LED1_OFF();
LED2_OFF();
}
我们不妨打开GPIO_Init,可以看到初始化GPIO口其实就是配置CFGLR,我们再来看这个寄存器的定义; ![image-20221015145805577](
上图是CFGLR寄存器的的描述,MODEy配置的是输出或输出;CNFy描述的是什么模式下的输入和什么模式下的输出;我们用以驱动LED的,当然选择输出模式并且选择推挽输出模式;y=3或4,故而MODE3=0x01和CNF3=0x00,MODE4=0x01和CNF5=0x00; 根据对LED的开关,其实就是对GPIO口的拉高或拉低;于是就有以下代码 #define LED1_OFF() GPIO_SetBits(GPIOC,GPIO_Pin_3)
#define LED1_ON() GPIO_ResetBits(GPIOC,GPIO_Pin_3)
#define LED2_OFF() GPIO_SetBits(GPIOC,GPIO_Pin_4)
#define LED2_ON() GPIO_ResetBits(GPIOC,GPIO_Pin_4)
void LED_Handle(void)
{
LED1_ON();
LED2_OFF();
Delay_Ms(500);
LED1_OFF();
LED2_ON();
Delay_Ms(500);
}
宏定义中的两个函数GPIO_SetBits和GPIO_ResetBits也是同样操作的是寄存器, 在参考手册中描述如下
BSHR是置位寄存器,写1有效,故而可以拉高对应的引脚;BCR是清零寄存器,写1可以拉低对应的引脚; 3.1.3 下载验证:我们就可以把代码下载到开发板上,看看运行结果是否与我 们要求的一致。运行结果是LED1和LED2以大约1Hz频率交替点亮熄灭; 具体现象可以查看视频; 至此,我们的3.1小结第一个实例的学习就结束了,本章作为 CH32003 的入门第一个例子,详细介绍了 CH32003 的 IO 口操作,希望大家好好理解一下。
3.1.4 本节的视频链接如下:
|
代码不计入字数哦,可以补充下内容,补充完了可以再@21小跑堂一遍~