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
不错详细 详细 推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力 所谓的驱动能力,就是指输出电流的能力。 推挽输出的一个缺点是,如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害
请问其他输出模式可以实现跑马灯吗 这种做跑马灯的试验 是不是一个io口只能连接 一个小灯啊 如果不进行初始化LED为关闭状态这个操作,那么一般情况下引脚初始化后是什么状态呢 一般这种情况使用ws2812的话 会不会感觉有点浪费资源呢 木木guainv 发表于 2022-11-8 09:07
一般这种情况使用ws2812的话 会不会感觉有点浪费资源呢
我们有个产品,我直接用PWM+DMA驱动2812,够用,不过内存用了90%多{:lol:} 我的学习板,V003F4P6不能生成.hex 文件,只能生成.bin文件,是那里设置不对。
页:
[1]