lilijin1995 发表于 2022-10-15 15:25

CH32V003配置GPIO配置推挽输出实现跑马灯

本帖最后由 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,过程过于简单,不可描述!所以不展示!跑马灯实验我们主要用到的固件库文件是:ch32v00x_gpio.c
需要驱动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,我们再来看这个寄存器的定义;!(上图是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 本节的视频链接如下:https://www.bilibili.com/video/BV1S8411W7qh/?vd_source=2bbde87de845d5220b1d8ba075c12fb0

mcu430 发表于 2022-10-23 10:28

不错详细 详细

tpgf 发表于 2022-11-7 16:26

推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力

paotangsan 发表于 2022-11-7 16:51

所谓的驱动能力,就是指输出电流的能力。

renzheshengui 发表于 2022-11-7 17:02

推挽输出的一个缺点是,如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害

wakayi 发表于 2022-11-7 17:16

请问其他输出模式可以实现跑马灯吗

wowu 发表于 2022-11-8 08:11

这种做跑马灯的试验 是不是一个io口只能连接 一个小灯啊

xiaoqizi 发表于 2022-11-8 08:27

如果不进行初始化LED为关闭状态这个操作,那么一般情况下引脚初始化后是什么状态呢

木木guainv 发表于 2022-11-8 09:07

一般这种情况使用ws2812的话 会不会感觉有点浪费资源呢

lilijin1995 发表于 2022-11-8 20:50

木木guainv 发表于 2022-11-8 09:07
一般这种情况使用ws2812的话 会不会感觉有点浪费资源呢

我们有个产品,我直接用PWM+DMA驱动2812,够用,不过内存用了90%多{:lol:}

昨天 发表于 2022-11-12 17:04

我的学习板,V003F4P6不能生成.hex 文件,只能生成.bin文件,是那里设置不对。
页: [1]
查看完整版本: CH32V003配置GPIO配置推挽输出实现跑马灯