[单片机芯片] CH32V003配置GPIO配置推挽输出实现跑马灯

[复制链接]
2951|11
 楼主| lilijin1995 发表于 2022-10-15 15:25 | 显示全部楼层 |阅读模式
本帖最后由 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的亮灭;

1966993-20221015152112367-79777915.png

3.1.2 软件设计:

软件涉及到新建工程的问题,大家自行参考MounRiver Studio,过程过于简单,不可描述!所以不展示!

跑马灯实验我们主要用到的固件库文件是:

  1. ch32v00x_gpio.c

需要驱动LED,就要配置GPIO口,下面是LED GPIO配置为推挽输出的代码;

该函数的功能就是用来实现配置 PC3和 PC4 为推挽输出。这里需要注意的是:在配置 CH32V003外设的时候,任何时候都要先使能该

外设的时钟。GPIO 是挂载在 APB2 总线上的外设,在固件库中对挂载在 APB2 总线上的外设时


钟使能是通过函数RCC_APB2PeriphClockCmd()来实现的。

最后两行代码"LED1_OFF();LED2_OFF();"乃是为了初始化LED为关闭状态;

  1. void LED_Init(void)
  2. {
  3.      GPIO_InitTypeDef GPIO_InitStructure = {0};

  4.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  5.      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
  6.      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  7.      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.      GPIO_Init(GPIOC, &GPIO_InitStructure);
  9.      LED1_OFF();
  10.      LED2_OFF();
  11. }

我们不妨打开GPIO_Init,可以看到初始化GPIO口其实就是配置CFGLR,我们再来看这个寄存器的定义;

![image-20221015145805577]( 1966993-20221015152211652-1060367293.png

上图是CFGLR寄存器的的描述,MODEy配置的是输出或输出;CNFy描述的是什么模式下的输入和什么模式下的输出;我们用以驱动LED的,当然选择输出模式并且选择推挽输出模式;y=3或4,故而MODE3=0x01和CNF3=0x00,MODE4=0x01和CNF5=0x00;

根据对LED的开关,其实就是对GPIO口的拉高或拉低;于是就有以下代码

  1. #define     LED1_OFF()       GPIO_SetBits(GPIOC,GPIO_Pin_3)
  2. #define     LED1_ON()       GPIO_ResetBits(GPIOC,GPIO_Pin_3)
  3. #define     LED2_OFF()       GPIO_SetBits(GPIOC,GPIO_Pin_4)
  4. #define     LED2_ON()       GPIO_ResetBits(GPIOC,GPIO_Pin_4)

  5. void LED_Handle(void)
  6. {
  7.      LED1_ON();
  8.      LED2_OFF();
  9.      Delay_Ms(500);
  10.      LED1_OFF();
  11.      LED2_ON();
  12.      Delay_Ms(500);

  13. }

宏定义中的两个函数GPIO_SetBits和GPIO_ResetBits也是同样操作的是寄存器, 在参考手册中描述如下

1966993-20221015152248000-1698337319.png

1966993-20221015152306489-641365348.png


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, 下载次数: 27

评论

代码不计入字数哦,可以补充下内容,补充完了可以再@21小跑堂一遍~  发表于 2022-10-18 11:00
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%多
昨天 发表于 2022-11-12 17:04 | 显示全部楼层
我的学习板,V003F4P6  不能生成.hex 文件,只能生成.bin文件,是那里设置不对。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

165

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部