打印
[单片机芯片]

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

[复制链接]
2194|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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,我们再来看这个寄存器的定义;

![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 本节的视频链接如下:


LED_GPIO_Output.rar

354.6 KB

使用特权

评论回复
评论
21小跑堂 2022-10-18 11:00 回复TA
代码不计入字数哦,可以补充下内容,补充完了可以再@21小跑堂一遍~ 
沙发
mcu430| | 2022-10-23 10:28 | 只看该作者
不错  详细 详细

使用特权

评论回复
板凳
tpgf| | 2022-11-7 16:26 | 只看该作者
推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力

使用特权

评论回复
地板
paotangsan| | 2022-11-7 16:51 | 只看该作者
所谓的驱动能力,就是指输出电流的能力。

使用特权

评论回复
5
renzheshengui| | 2022-11-7 17:02 | 只看该作者
推挽输出的一个缺点是,如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害

使用特权

评论回复
6
wakayi| | 2022-11-7 17:16 | 只看该作者
请问其他输出模式可以实现跑马灯吗

使用特权

评论回复
7
wowu| | 2022-11-8 08:11 | 只看该作者
这种做跑马灯的试验 是不是一个io口只能连接 一个小灯啊

使用特权

评论回复
8
xiaoqizi| | 2022-11-8 08:27 | 只看该作者
如果不进行初始化LED为关闭状态这个操作,那么一般情况下引脚初始化后是什么状态呢

使用特权

评论回复
9
木木guainv| | 2022-11-8 09:07 | 只看该作者
一般这种情况使用ws2812的话 会不会感觉有点浪费资源呢

使用特权

评论回复
10
lilijin1995|  楼主 | 2022-11-8 20:50 | 只看该作者
木木guainv 发表于 2022-11-8 09:07
一般这种情况使用ws2812的话 会不会感觉有点浪费资源呢

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

使用特权

评论回复
11
昨天| | 2022-11-12 17:04 | 只看该作者
我的学习板,V003F4P6  不能生成.hex 文件,只能生成.bin文件,是那里设置不对。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

162

帖子

7

粉丝