嵌入式开发学习之--点亮LED灯(下)
接上一篇文章,这一篇,我们来具体学习一下点亮LED灯的main文件该如何写。
首先需要创建一个main()函数和一个SystemInit()函数,这里注意的是,这是在启动文件的汇编语言中已经固定好的,即使你用不到SystemInit(),你要么创建,要么去屏蔽启动文件里对应位置的代码,否则编译会报错。
如图,编译报错找不到SystemInit()
创建好一个main()函数和一个SystemInit()函数后,点击编译按钮,可以看到0错误,0警告。基础框架已经搭好,现在要做的就是通过控制寄存器,来控制PH10引脚输出一个低电平。这里我们要借助另一样工具,就是芯片手册。
芯片手册
每一款芯片都有他对应的芯片手册,里面详细的记载了芯片的使用方法,想要嵌入式能力提升,阅读芯片手册的能力是十分重要的。
如图,这是STMF4系列的芯片手册关于通用I/O口的资料(野火资料中有),根据介绍,这个端口模式寄存器MODERy(y=0...15)以两位来操作一个引脚,可以将0到15的每个引脚分别配置成00(输入)、01(通用输出)、10(复用功能)、11(模拟模式)四种模式,我们要配置PH10,根据表格找到MODER10,是第20,21位。因为我们是一个普通输出,所以将两位配置成01,通用输出模式。这里需要注意的是配置时最好是进行位操作,去配置对应位而不是直接赋值,不然可能会影响到其它引脚的配置。
因为通用输出模式又分为输出推挽和输出开漏两种,开漏需要加上拉电阻,不合适,所以选择输出推挽。由图可见,将第10位配置成0。
接着往后看,配置完输出模式后,还需要配置输出速度,通过介绍可以看到也是两位配置一个引脚的速度,一共有4种速度。因为即使低速也是MHZ级别的,对于我们led灯完全够用。所以配置哪种速度都可以。
继续往后看,还有一个上拉下拉寄存器,对于输出来说,上拉下拉不会影响高低电平,但是上拉能增强一点输出能力,所以我们这里选择配置成上拉电阻(01)。
继续往后看,输入寄存器IDR,和我们没什么关系,我们要的是输出,所以略过,再接着是ODR寄存器,介绍说通过BSRR寄存器可以对应的将其置位(置1)和复位(置0)。
可以看到第10位和第26位分别是对10引脚置位和复位,也就是置1置0,需要注意如果同时对10引脚又置0又置1,最终还是置1。
再往后还有一些复用功能寄存器,我们用不到,就不一一介绍了,等需要的时候再回头查阅就好。到此为止,关于这个引脚的寄存器配置就全有了。但是还缺少一个关键的配置,就是时钟,想要对应的引脚工作,就必须打开相应的时钟。所有的GPIO口都是挂在AHB1上的,所以我们需要使能AHB1时钟。
至此,整个点亮LED的程序便完整了。下面是具体代码,编译没有问题,烧写进开发板。
下载成功。
开发板红色的LED灯成功点亮。
总结:
点亮led灯虽然很简单,但它背后所涉及的知识也是很全面的,当你懂得如何点亮led灯背后的原理时,其实就是懂得了引脚控制,寄存器配置等等。其他的更加复杂的功能,也不过是在这基础上的演变,看时钟图,看寄存器功能,找对应引脚进行对应配置,再去结合上层逻辑,也就是这样了。