控制/MCU
看下面这段示例代码。
void main()
{
sys_init()
while(1)
{ //用PA1控制LED亮灭
GPIO_SetBits(GPIOA, GPIO_Pin_1);
delay_ms(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
delay_ms(1000);
}
}
在功能实现上这段代码没有问题。但如果硬件做变动呢?例如更换为其它品牌的mcu或者IO口更改呢?while(1)里面的代码是不是都要发生变动呢?不同的mcu底层库是有区别的。换一个MCU要通篇改动代码非常恶心!工作量也巨大!非常有必要做分层!无论是裸机还是RTOS都要分层。
1,提高对硬件的兼容性。上面已经介绍过了。MCU的软件开发与硬件强相关。在硬件设计时经常会有一供、二供、三供等方案。每换一次硬件就要大改一次代码开发效率低下。
2,增加代码通用性。例如项目A的一部分功能在项目B上曾经实现过,直接从项目B移植过来就行无须改动或者较少改动。
可以按照下图来分层
这一层由MCU库层,由MCU厂家提供。
这一层是对mcu库层的一个封装。当更换MCU时只需对这一层做修改,不会影响到其它层。如果完全将MCU的库封装一遍工作量将十分巨大,也没必要,需要哪个就封装哪个。例如用到uart了那就只把uart的封装一下,像IIC、SPI等无关的可以不用封装。
这一层通过调用MCU_HAL层来实现对外设的驱动。例如,IIC控制电源芯片。驱动通过调用MCU_HAL层实现对电源芯片的操作。在这一层用来实现简单的寄存器读取。
这一层是对外设的基本功能进行一个封装。拿电源芯片举例。当更换电源芯片时,基本功能不会发生变化,比如控制电压电流等。把这些基础功能封装在此。示例代码如下
void set_cur(uint16_t data)//APP层调用这个API API命名不体现任何芯片信息
{
xxx_set_cur();//对芯片进行操作
...........
}
这一层主要写应用功能。通过调用外设功能HAL层实现。当更换MCU或者某一个芯片时APP层无须改动。
全部0条评论
快来发表一下你的评论吧 !