一次点了半天没亮的LED灯
万万没想到居然有一天一个LED灯让我点了半天才亮,事情要从用CH32F103C8T6说起,短短几天设计完了PCB,物料和钢网也都到了,焊完板子测试了下基本上不短路,通电测电压也是正常的,于是打开了SDK开发包里的demo project,找了个最简单的IO Toggle例程,不过我手里的例程基本上都被各种临时测试程序覆盖了,就包括那个IO反转的例程,现在就是用的最终程序。所以找了一个没怎么动过的ADC例程来实验。
很快啊,我啪的一声打开MDK,然后上来就是一个敲代码,一个下程序,全部没有问题,没有问题啊,没有问题以后,自然是传统点灯,以点到为止,如果继续开发下去,头发就没了,我笑了一下,没有继续开发,这时间,我看到LED并没有亮,两分,两分钟多钟以后,我又看了一下原理图,确定LED接的是PC13,并且不存在方向反了的情况,有人说我是乱焊的,我可不是乱焊的啊,锡膏、钢网、刮刀,训练有素,有备而来,毕竟是练习了两年半的焊接技术,我看着GPIOC和GPIO_Pin_13半天,甚至goto了过去,时钟也是开的GPIOC,怎么可能存在问题呢,单片机不服气,它说我这代码没用,我说我这代码有用,它说没用,我说有用,这是延时,传统点灯讲究的是延时,点灯加delay,I7和AMD都跑不过我这一个delay,三分多钟以后,当时捂着眼,我说婷婷,肯定是哪里出问题了,它也承认我先打开了它时钟啊,因为这时间,如果按传统点灯的点到为止它就亮了,我在想发生甚么事了,LED竟然点不亮,但没关系啊,我又啪的一下解压了一份开发包,很快啊,上来就是一个打开点灯例程,一个复制粘贴改IO,他们又说我是乱改的,我可不是乱改的,开时钟,改端口,复制粘贴我也是练习了两年半的,单片机说它要试试,我说可以,我啪的一声就开始编译,然后上来就是一个插仿真器,一个下代码,这全部没问题啊,没问题以后自然是LED就亮了,后来一对比代码,发现一模一样,就少了一句设置IO口速度。这个固件库,不讲武德,来骗,来偷袭我六十九岁的点灯工程师,我劝它要耗子尾汁,好好反思,不要玩这样的聪明,小聪明啊,库要以完善为贵,不要搞误导,谢谢朋友们。
那么少了一句设置IO口速度会发生什么呢?来看一下GPIO的寄存器说明。

同样的,固件库也是这么定义的IO速度。
而如果不设置IO速度,那么MODE将会写进一个0到相应IO占用的2个位,也就说只能写1,2,3才是设置IO输出,不设置结构体的速度参数也就是写0,IO将会被设置为输入,所以怎么都不会点亮LED。我甚至还用示波器怼了半天的焊盘。
而熟悉ST标准库或HAL库就不会有这个问题。即便是不写速度也可以设置为慢速IO从而能正常点亮灯。