目前在单片机的开发方式当中,最常见的开发方式有寄存器开发和固件库开发,使用寄存器开发单片机和固件库开发的主要区别在于编程的方式和开发的复杂度。
使用寄存器开发单片机是直接操作硬件寄存器来实现功能。开发者需要了解硬件寄存器的功能和编程方式,手动配置寄存器的值来实现所需的功能。这种方式需要对硬件和寄存器编程有深入的了解,对硬件的控制更加精细,可以实现更高的性能和更低的功耗。但是,这种开发方式编写的代码较为底层,需要编写大量的底层驱动代码,开发复杂度较高,对开发者的要求也较高。固件库开发则是使用预先编写好的固件库来开发单片机应用。固件库是一组封装了底层硬件操作的函数和接口,开发者可以直接调用这些函数和接口来实现所需的功能,而不需要直接操作硬件寄存器。这种方式简化了开发过程,减少了对硬件的了解和编程的复杂度,使得开发更加快速和方便。但是,由于固件库是对硬件的抽象封装,可能会存在一定的性能损失和功能限制。
总的来说,使用寄存器开发单片机可以实现更高的性能和更低的功耗,但开发复杂度较高;而使用固件库开发则更加方便快速,但可能存在性能损失和功能限制。选择哪种开发方式应根据具体需求和开发者的经验来决定。
本文章将使用寄存器开发的方式来点亮stm32的led灯。
我们以stm32f103zet6这款开发板为例,点亮GPIOB,pin5 的 led灯:
在点亮led时,所使用的寄存器有APB2外设时钟使能寄存器、CRL、ODR.
接下来进行led驱动代码(led.c)的程序编写:
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void){
RCC->APB2ENR|=1<<3;
RCC->APB2ENR|=1<<6;
//GPIOB.5
GPIOB->CRL&=0xFF0FFFFF;
GPIOB->CRL|=0x00300000;
GPIOB->ODR|=1<<5;
//GPIOE.5
GPIOE->CRL&=0xFF0FFFFF;
GPIOE->CRL|=0x00300000;
GPIOE->ODR|=1<<5;
}
led.h程序如下:
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
以上led模块就配置完成了。
接下来编写main函数模块:
#include "stm32f10x.h"
#include "led.h"
int main(void)
{
LED_Init();
while(1){
GPIOB->ODR|=1<<5;
GPIOE->ODR|=1<<5;
GPIOB->ODR&=~(1<<5);
}
}
以上就是使用寄存器开发的方式点亮led灯的程序部分。
注意:在将程序烧录到开发板当时应该先编译再下载到开发板。如果初次下载到开发板当中没有反应,可以按一下复位按钮,再查看板子的灯是否发生变化。
我们以stm32f103zet6开发板为例,结果如下图所示: