記得剛接觸單片機(jī)的時(shí)候使用的是STC89C52單片和keil 開(kāi)發(fā)環(huán)境,記得當(dāng)時(shí)寫(xiě)程序都是把程序要實(shí)現(xiàn)的功能全部放到一個(gè)main.c的函數(shù)中去,剛開(kāi)始完成的功能還是比較簡(jiǎn)單。后來(lái)學(xué)習(xí)了STM32F407 知道了還有固件庫(kù)這么個(gè)可以加快開(kāi)發(fā)速度的東西。將不同的功能的代碼放在了不同的文件中去(gpio.c、IIC.c等)進(jìn)行歸類(lèi)。這種方法便于程序的管理維護(hù)和擴(kuò)展其他的功能,現(xiàn)在的單片機(jī)以不再是十幾年前的51匯編時(shí)代,現(xiàn)在動(dòng)輒上M的flash存儲(chǔ)空間,除非一些對(duì)時(shí)序要求特別高,或者是操作系統(tǒng)內(nèi)核調(diào)度中會(huì)用到匯編,基本上單片機(jī)開(kāi)發(fā)使用的是C語(yǔ)言。模塊化、分層的思想對(duì)開(kāi)發(fā)和維護(hù)以及后期的功能擴(kuò)展都是很有幫助。
ASF,Atmel Software Frame 其實(shí)ASF也只是一個(gè)代號(hào)而已,可以理解為他是Atmel 公司開(kāi)發(fā)的兼容Atmel公司單片機(jī)的一個(gè)固件庫(kù)。其中包括了一些驅(qū)動(dòng)、I/O的控制、協(xié)議等一些底層驅(qū)動(dòng),供給用戶(hù)來(lái)調(diào)用加快開(kāi)發(fā)速度。
打開(kāi)的昨天的示例程序,會(huì)看到如圖3-1 所示的文件結(jié)構(gòu)
main.c中主要存放的是示例程序的主程序。ASF的文件夾中主要包括了一系列的板級(jí)支持包,比如I/O口的配置、spi等配置文件還有開(kāi)發(fā)板上的OLED屏幕以及SD卡的驅(qū)動(dòng)函數(shù)。在thirdparty文件夾中有CMSIS和fatfs。
CMSIS(Cortex Microcontroller Software Interface Standard)是ARM Cortex? 微控制器軟件接口標(biāo)準(zhǔn),是 Cortex-M 處理器系列的與供應(yīng)商無(wú)關(guān)的硬件抽象層,是內(nèi)核與外設(shè)、實(shí)時(shí)操作系統(tǒng)和中間設(shè)備之間的通用接口。
FatFs是一個(gè)通用的文件系統(tǒng)模塊,用于在小型嵌入式系統(tǒng)中實(shí)現(xiàn)FAT文件系統(tǒng)。 FatFs 的編寫(xiě)遵循ANSI C,因此不依賴(lài)于硬件平臺(tái)。
詳細(xì)的內(nèi)容大家可以自己去研究一下。
下面就簡(jiǎn)單的分析一下main.c函數(shù)。
static void ProcessButtonEvt(uint8_t uc_button);//按鍵處理函數(shù)
static void Button1_Handler(uint32_t id, uint32_t mask);//按鍵1 按鍵中斷
static void Button2_Handler(uint32_t id, uint32_t mask); //按鍵2按鍵中斷
static void Button3_Handler(uint32_t id, uint32_t mask); //按鍵3按鍵中斷
static void SD_Detect_Handler(uint32_t id, uint32_t mask); //SD中斷
static void configure_buttons(void);//機(jī)械按鍵初始化
static void configure_adc(void);//配置ADC 采集光線傳感器
static void get_num_files_on_sd(void);//得到SD卡根目錄下的文件總數(shù)
static void display_sd_info(void);//在OLED上顯示SD卡的狀態(tài)
static void display_sd_files(void);//顯示SD卡的內(nèi)容到OLED屏幕上
static void ssd1306_draw_graph(uint8_t col, uint8_t page, uint8_t width, uint8_t height, uint8_t *tab);//在OLED屏幕上顯示圖片
static void ssd1306_clear_char(void);//清空OLED屏幕
int main(void)
{
/*主要完成時(shí)鐘、gpio、OLED、SD卡的初始化,和各個(gè)功能*/
}
具體內(nèi)容參看程序,研究一下ASF提供的函數(shù),開(kāi)發(fā)起來(lái)會(huì)增加開(kāi)發(fā)速度。
下面我們就來(lái)開(kāi)發(fā)個(gè)小的實(shí)例,讓OLED液晶屏幕輸出HelloWorld!
首先將main.c函數(shù)的內(nèi)容全部清空,我們一步一步來(lái)建立這個(gè)函數(shù)。
因?yàn)橐贠LED屏上輸出,所以要查看液晶屏的驅(qū)動(dòng)函數(shù)。
詳細(xì)的可以去項(xiàng)目文件中 ASF -》 common -》 components -》 display -》 ssd1306 中查看驅(qū)動(dòng)文件。
#include
#include
intmain(void)
{
sysclk_init();// 初始化時(shí)鐘
board_init();// 初始化GPIO
ssd1306_init();//初始化OLED液晶屏
ssd1306_clear();//清空OLED屏幕
/*顯示helloWorld*/
ssd1306_set_page_address(0);//行
ssd1306_set_column_address(0);//列
ssd1306_write_text(“HelloWorld”);
/*顯示我的論壇ID*/
ssd1306_set_page_address(3);
ssd1306_set_column_address(70);
ssd1306_write_text(“-- liunian__92”);
while(1);
}
上述代碼即可完成輸出HelloWorld。如圖3-2所示
總結(jié)一下atmel Studio開(kāi)發(fā)起來(lái)還是很好用的,外殼也是VS2010的。有些功能還是很方便的,
比如系統(tǒng)中有
ssd1306_set_page_address();
ssd1306_set_column_address();
_write_text“); 這三個(gè)函數(shù),
當(dāng)你只輸入 ssd 的時(shí)候,就會(huì)在下面自動(dòng)出現(xiàn)這個(gè)三個(gè)備選函數(shù)。這個(gè)自動(dòng)補(bǔ)充功能還是蠻實(shí)用的。
atmel Studio 一些調(diào)試功能還是蠻好用的,更重要的是Help 幫助窗口,有對(duì)atmel公司所有芯片和開(kāi)發(fā)板的介紹信息,如果是初次接觸atmel公司芯片的芯片,確實(shí)應(yīng)該好好看看help文檔和他們的示例代碼。但是,可能這個(gè)開(kāi)發(fā)環(huán)境是為了兼容atmel公司所有的產(chǎn)品,所以會(huì)有很多的功能我們用不到,所以感覺(jué)整個(gè)開(kāi)發(fā)環(huán)境就顯得操作緩慢。
-
sam4s
+關(guān)注
關(guān)注
0文章
2瀏覽量
1563
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論