聊一聊MCU的軟件分層

2023-07-07 15:22:46 來源:火焰電子


(資料圖片)

一、MCU級軟件有必要分層嗎?

1.1 如果不分層會怎樣?

看下面這段示例代碼。

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.2 軟件分層的目的

1,提高對硬件的兼容性。上面已經介紹過了。MCU的軟件開發與硬件強相關。在硬件設計時經常會有一供、二供、三供等方案。每換一次硬件就要大改一次代碼開發效率低下。

2,增加代碼通用性。例如項目A的一部分功能在項目B上曾經實現過,直接從項目B移植過來就行無須改動或者較少改動。

二、 代碼層次

2.1 代碼分層

可以按照下圖來分層

2.2 MCU庫層

這一層由MCU庫層,由MCU廠家提供。

2.3 MCU_HAL層

這一層是對mcu庫層的一個封裝。當更換MCU時只需對這一層做修改,不會影響到其它層。如果完全將MCU的庫封裝一遍工作量將十分巨大,也沒必要,需要哪個就封裝哪個。例如用到uart了那就只把uart的封裝一下,像IIC、SPI等無關的可以不用封裝。

2.4 外設驅動層

這一層通過調用MCU_HAL層來實現對外設的驅動。例如,IIC控制電源芯片。驅動通過調用MCU_HAL層實現對電源芯片的操作。在這一層用來實現簡單的寄存器讀取。

2.5 外設功能層

這一層是對外設的基本功能進行一個封裝。拿電源芯片舉例。當更換電源芯片時,基本功能不會發生變化,比如控制電壓電流等。把這些基礎功能封裝在此。示例代碼如下

void set_cur(uint16_t data)//APP層調用這個API API命名不體現任何芯片信息 {  xxx_set_cur();//對芯片進行操作  ...........}

2.6 APP層

這一層主要寫應用功能。通過調用外設功能HAL層實現。當更換MCU或者某一個芯片時APP層無須改動。

標簽:

上一篇:分享幾種常用的電平轉換電路
下一篇:最后一頁