將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要有最起碼的認知。本文通過從啟動方式 讀寫方式 容量成本 可靠性 壽命以及是使用型上進行了...