(資料圖片)
看下面這段示例代碼。
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); }}
在功能實(shí)現(xiàn)上這段代碼沒有問題。但如果硬件做變動呢?例如更換為其它品牌的mcu或者IO口更改呢?while(1)里面的代碼是不是都要發(fā)生變動呢?不同的mcu底層庫是有區(qū)別的。換一個(gè)MCU要通篇改動代碼非常惡心!工作量也巨大!非常有必要做分層!無論是裸機(jī)還是RTOS都要分層。
1,提高對硬件的兼容性。上面已經(jīng)介紹過了。MCU的軟件開發(fā)與硬件強(qiáng)相關(guān)。在硬件設(shè)計(jì)時(shí)經(jīng)常會有一供、二供、三供等方案。每換一次硬件就要大改一次代碼開發(fā)效率低下。
2,增加代碼通用性。例如項(xiàng)目A的一部分功能在項(xiàng)目B上曾經(jīng)實(shí)現(xiàn)過,直接從項(xiàng)目B移植過來就行無須改動或者較少改動。
可以按照下圖來分層
這一層由MCU庫層,由MCU廠家提供。
這一層是對mcu庫層的一個(gè)封裝。當(dāng)更換MCU時(shí)只需對這一層做修改,不會影響到其它層。如果完全將MCU的庫封裝一遍工作量將十分巨大,也沒必要,需要哪個(gè)就封裝哪個(gè)。例如用到uart了那就只把uart的封裝一下,像IIC、SPI等無關(guān)的可以不用封裝。
這一層通過調(diào)用MCU_HAL層來實(shí)現(xiàn)對外設(shè)的驅(qū)動。例如,IIC控制電源芯片。驅(qū)動通過調(diào)用MCU_HAL層實(shí)現(xiàn)對電源芯片的操作。在這一層用來實(shí)現(xiàn)簡單的寄存器讀取。
這一層是對外設(shè)的基本功能進(jìn)行一個(gè)封裝。拿電源芯片舉例。當(dāng)更換電源芯片時(shí),基本功能不會發(fā)生變化,比如控制電壓電流等。把這些基礎(chǔ)功能封裝在此。示例代碼如下
void set_cur(uint16_t data)//APP層調(diào)用這個(gè)API API命名不體現(xiàn)任何芯片信息 { xxx_set_cur();//對芯片進(jìn)行操作 ...........}
這一層主要寫應(yīng)用功能。通過調(diào)用外設(shè)功能HAL層實(shí)現(xiàn)。當(dāng)更換MCU或者某一個(gè)芯片時(shí)APP層無須改動。
標(biāo)簽: