嵌入式韌體開發之四 重新組織MDK工程

2021-09-10 16:35:21 字數 1858 閱讀 5368

將led作為驅動**單獨提取出來,劃分到驅動的層次中。首先編寫led.**件,來定義型別和介面,**如下。

#ifndef led_h

#define led_h

typedef enum led_num

led_num_t;

void led_init(void);

void led_on(led_num_t num);

void led_off(led_num_t num);

#endif

實現led.**件中定義的介面函式,編寫在led.c原始檔中,**如下(根據需要新增其他led燈的else**)。

#include "stm32f10x.h"                  // device header

#include "led.h"

void led_init(void)

void led_on(led_num_t num)

void led_off(led_num_t num)

這裡解釋一下怎麼將之前的

unsigned int *rcc_apb2enr = (unsigned int *)0x40021018;

*rcc_apb2enr = 0x8;

**改為

rcc->apb2enr |= rcc_apb2enr_iopben;

的。首先要明確的是,通過檢視stm32的手冊,我們知道rcc_apb2enr暫存器的位址是0x40021018。並且上面的**意味著*rcc_apb2enr和rcc->apb2enr是對等的。

在stm32f10x.h的標頭檔案中會找到如下定義:

#define rcc                 ((rcc_typedef *) rcc_base)

這裡知道rcc並定義成乙個指標,其指向的位址是rcc_base,繼續跟**,會看到如下的定義。

#define rcc_base              (ahbperiph_base + 0x1000)

#define ahbperiph_base        (periph_base + 0x20000)

#define periph_base           ((uint32_t)0x40000000)

那麼rcc_base的值就是0x40021000。

接下來再來看指標的型別rcc_typedef

typedef struct

rcc_typedef;

這是乙個結構體,apb2enr位於0x18偏移處(每個成員32位,佔4個位元組,前面有24個位元組,16進製制值為0x18),那麼

rcc->apb2enr的位址就應該是結構體基位址加成員apb2enr的偏移位址=0x40021000+0x18=0x40021018。

將「= 0x8」改為「|= rcc_apb2enr_iopben」是為了只修改對應的位,避免將其他位強制置為0。rcc_apb2enr_iopben的定義如下:

#define  rcc_apb2enr_iopben                  ((uint32_t)0x00000008)

改寫main.c,**如下。

#include "led.h"

void ldelay(unsigned int loop)

int main(void)

}

按照前面的工程管理方式,新增目錄及檔案,實現如下圖所示的層次結構。

重新編譯並**

拓展四之嵌入式開發工具

一 偵錯程式 gdb 1 gdb命令 file filename 裝入想要除錯的可執行檔案 kill filename 終止正在除錯的程式 break file function 在 file檔案的 function函式中設定乙個斷點 clear 刪除乙個斷點,這個命令需要指定 行或者函式名作為引數...

嵌入式之yocto 開發

初學者,個人見解未必正確,此博文僅供交流,還望斧正。yocto與bsp兩者之間的關係 開發流程是怎樣的。修改配置檔案,編譯,燒寫。以上資訊是2017年的,今天20180623,完善一下它,強迫症犯了,而且對一些不能理解的東西,現在或許明白了。yocto的作用 yocto與bsp兩者之間的關係 它們兩...

嵌入式開發之NorFlash 和NandFlash

author tiger john time 2013 07 11 重新修改 mail jibo.tiger gmail.com blog 摘要 作為乙個嵌入式工程師,要對norflash 和nandflash要有最起碼的認知。本文通過從啟動方式 讀寫方式 容量成本 可靠性 壽命以及是使用型上進行了...