stm32代碼公共模板神舟王103zet開發(fā)板_第1頁
stm32代碼公共模板神舟王103zet開發(fā)板_第2頁
stm32代碼公共模板神舟王103zet開發(fā)板_第3頁
stm32代碼公共模板神舟王103zet開發(fā)板_第4頁
stm32代碼公共模板神舟王103zet開發(fā)板_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第七章STM32代碼公共模 啟動(dòng)文件如何選擇說 如何從零開始新建STM32工程模 如何去官 的STM32資料的方 獲取ST庫源 開始新建工 使用JLINK仿真器硬件調(diào)試配 本節(jié)參考例 COMMON文件夾介 用什么方式實(shí)現(xiàn)精準(zhǔn)延 關(guān)于Systick定時(shí)器的特 Systick定時(shí)器如何設(shè)計(jì)精準(zhǔn)的延 Delay_Init()函數(shù)(延時(shí)初始化函數(shù) Delay_us()函數(shù)(延時(shí)多少微秒 Delay_ms()函數(shù)(延時(shí)多少毫秒 GPIO口的定義(自己設(shè)計(jì)操作某個(gè)GPIO管腳 NVIC_Configuration函 本節(jié)參考例 Hard_Driver文件夾介 第七章STM32代碼公共模啟動(dòng)文件如何選擇說明ST給我們提供了3個(gè)啟動(dòng)文件,分別適用于不同容量的STM32。他們是文件名適合容備小容量中容量md.s適用于中等容量產(chǎn)大容量hd適用于大容量產(chǎn)擇startup_stm32f10x_hd.s即可。如何從零開始新建STM32工程模板如何去官 的STM32資料的方法1 打開網(wǎng)頁,在搜索網(wǎng)頁欄中搜索“ST”,如下2、點(diǎn)擊st意法半導(dǎo)體進(jìn)入ST官3、點(diǎn)擊微控制器和4、點(diǎn)擊微控制5、選擇STM32-32位的微控制器中的F1系 STM32F103ZET6、STM32F107VCT6,STM32F207ZGT、等,這里我們用STM32F103RBT6做示范,如下圖家看下圖,這個(gè)庫文件我找到了,提示說是3.5.0版本的庫文件:獲取ST庫源碼可以看到該庫的版本為3.5.0版本,解壓縮之后,真正的標(biāo)準(zhǔn)庫函數(shù)就在Libraries文件夾開始新建工程①點(diǎn)擊桌面文件,我們通過Project->CloseProject選項(xiàng)把它關(guān)掉。、mon、OBJ、User四個(gè)文件夾以及“刪除MDK產(chǎn)生的過程文件.bat”文件、其中,“readme.txt”文件是關(guān)于本工程的一些說明,可以不添加?!皠h除MDK產(chǎn)生的過程文件.bat”文件,顧名思義作用是刪除MDK產(chǎn)生的過程文件。這個(gè)文件也可以不添加,添加的話,在我們提供的光盤資料的源碼工程下可以找到。③在MDK軟件Project->NewuVision4Project…新建我們的工程文件,新建的工程文件保存在桌面的\STM32神舟開發(fā)板工程模板\UserProject,名字可以隨便取,點(diǎn)擊保存。④下面我們接下來的窗口是讓我們選擇公司跟的型號(hào),我們STM32神舟王的板子用的是ST公司的STM32F103ZET6,有64KBSRAM,512KBFlash,屬于高集成度⑤接下來的窗口問我們是否需要拷貝STM32的啟動(dòng)代碼到工程文件中,這份啟動(dòng)代碼在M3系列中都是適用的,一般情況下我們都點(diǎn)擊是,但我們這里用的是ST的庫,庫文件里面也自帶了這一份啟動(dòng)代碼,所以為了保持庫的完整性,我們就不需要開發(fā)環(huán)境為我們自帶的啟動(dòng)代碼了,稍后我們自己手動(dòng)添加,這里我們點(diǎn)擊否。⑦往模板里添加庫文件。我們從ST官網(wǎng)獲取ST的庫后,解壓縮后 \STM32F10x_StdPeriph_Lib_V3.5.0\Libraries下的CMSIS跟這兩個(gè)文件夾拷貝到“Template工程模板\Libraries”文件夾中把標(biāo)準(zhǔn) 下的\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template文件夾下的main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h拷貝到“Template工程模板\Project”下。注:stm32f10x_it.h、和stm32f10x_it.c這兩個(gè)文件里面是中斷函數(shù),里面為空,并沒有寫任何的中斷服務(wù)程序stm32f10x_conf.h是用戶需要配置的頭文件,當(dāng)我們需要用到將1下的子文件SourceGroup1刪除。將1的名稱,雙擊改為“Template”。往工程里添加4個(gè)組,分別命名為USER、CMSIS、S User用來存放用戶自定義的應(yīng)用程序,StdPeriph_Driver用來存放庫文件,CMSIS用來存放M3系列內(nèi)核文件和啟動(dòng)文件,COMMON存放公共文件。Usermain.cstm32f10x_it.c2在StdPeriph_Driver組里面添 “\STM32神舟開發(fā)板工程模\Libraries\STM32F10x_StdPeriph_Driver\src”里面的全部驅(qū)動(dòng)文件當(dāng)然,src里面的驅(qū)動(dòng)文件也可以需要哪個(gè)就添加哪個(gè),這里將它們?nèi)刻砑舆M(jìn)去是為了后續(xù)開發(fā)的方便,況且我們可以通過配置stm32f10x_conf.h這個(gè)頭文件來選擇性添加,只stm32f10x_conf.h文件中配置的文件才會(huì)被編譯。在組CMSIS中添 “\STM32神舟開發(fā)板工程模\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”路徑下添加再添加路徑“\STM32神舟開發(fā)板工程模板\Libraries\CMSIS\CM3\CoreSupport”下system_stm32f10x.c是ARM公司提供的符合CMSIS標(biāo)準(zhǔn)的庫文件);注意,這些組里面添加的都是匯編文件跟C文件,頭文件是不需要添加的。在組MDK_start_code中添 “\STM32神舟開發(fā)板工程模文件名適合容備小容量中容量md.s適用于中等容量產(chǎn)大容量hd適用于大容量產(chǎn)⑨最后一步,配置MDK的配置選項(xiàng)。點(diǎn)擊中的魔術(shù)棒按鈕,即Option…選項(xiàng)。在彈出的框的選項(xiàng)卡中,把UseMicroLIB勾上。這是為后面串口可以使用Printf函數(shù)打印數(shù)據(jù)。配置Output選項(xiàng)卡步驟1:點(diǎn)擊SelectFolderforObjects... 步驟2:把編譯好的輸出文件名定為”步驟3:CreateHEXFile這個(gè)選項(xiàng)框也選上,表示編譯輸出HEX2OneELFSectionperFunction選項(xiàng)勾上。步驟3:在IncludePaths欄中,添加庫文件的搜索路徑步驟1中,添加USE_STDPERIVPH_DRIVER是為了編譯器的默認(rèn)搜索路徑,轉(zhuǎn)而使用我們添加到工程中的ST加STM32F10X_CL是因?yàn)槲覀冇玫氖侵腥萘康?,添加了STM32F10X_CL這個(gè)宏之后,庫文件里面為互聯(lián)型定義的寄存器我們就可以用了。非互聯(lián)型的,是小或大容量的時(shí)候宏可以換成STM32F10X_LD或者STM32F10X_HD。2中OneELFSectionperFunction選項(xiàng)勾上的目的是,使用軟件編譯代碼時(shí),步驟3中,指定庫文件的搜索路徑,添加方式如下圖:添加的內(nèi)容如 ANSICC的庫文件,如stdin.h、stdio.h將原來的 n.c函數(shù)中的代碼刪除,輸入如下代碼,并保存,然后編譯代內(nèi)容:STM32作者版本日期intmain(void){}編譯結(jié)果如下圖stm32的第一步。當(dāng)然有一些工程,它包含的文件,搜索庫的路徑也會(huì)。大家對(duì)新建工程了解到一定程度之后,也就了解怎么新建更加復(fù)雜點(diǎn)的工程。使用JLINK仿真器硬件調(diào)試配置環(huán)境中做如下修改。實(shí)際上,我們開發(fā)程序的時(shí)候80%都是在硬件上調(diào)試的。具體配置如下圖所示:點(diǎn)擊,在Debug選項(xiàng)里板應(yīng)該上電,并將JLINKV8與模板連接好,JLINKV8也需要上電)設(shè)置完點(diǎn)確編譯全部代碼,然后點(diǎn)LOAD程序到目標(biāo)板到了這里就算是大功告成了。如果在新建工程中遇到什么問題,先不要急,可先參本節(jié)參考例程請(qǐng)參考源代碼-----“第7章.實(shí)戰(zhàn)篇\0.工程模板\1.Template空工程模COMMON文件夾介紹COMMON文件夾包含了common.c和common.h兩個(gè)文件,這兩個(gè)文件里面定義了一行介紹。用什么方式實(shí)現(xiàn)精準(zhǔn)延時(shí)我們在這里是使用Systick定時(shí)器。要延時(shí)就必須有個(gè)類似手表或者時(shí)鐘的東西來進(jìn)行計(jì)時(shí)工作,CM3內(nèi)核包含了一個(gè)Systick定時(shí)器,它是一個(gè)24位的倒計(jì)數(shù)定時(shí)器,當(dāng)計(jì)到0時(shí),將從RELOAD寄存器中自動(dòng)重裝載定時(shí)初值。只要不把它在SysTick控制及狀態(tài)寄存器中使能位清除,就永不停息的自動(dòng)裝載自動(dòng)計(jì)數(shù)下去。利用STM32的來實(shí)現(xiàn)延時(shí)最大的好處是它既不占用中斷,也不占用系統(tǒng)定時(shí)器。所以我們就使用Systck定時(shí)器來實(shí)現(xiàn)精準(zhǔn)的延時(shí)。關(guān)于Systick定時(shí)器的特點(diǎn)特點(diǎn)1:可以為操作系統(tǒng)提供心臟的跳動(dòng)。SysTick定時(shí)器被在NVIC中,用于產(chǎn)生SYSTICK異常(異常號(hào):15;在以前,大多操作系統(tǒng)需要一個(gè)硬件定時(shí)器來產(chǎn)生操作系統(tǒng)需要的滴答中斷,作為整個(gè)系統(tǒng)的時(shí)的時(shí)鐘:ucos運(yùn)行需要一個(gè)系統(tǒng)時(shí)鐘節(jié)拍,每次節(jié)拍相當(dāng)于操作系統(tǒng)一次心跳,而這個(gè)節(jié)拍是固定的(在ucos中由OS_TICKS_PER_SEC設(shè)置1ms(設(shè)置:特點(diǎn)2:便于不同處理器(同為CM3內(nèi)核)之間的程序移植Cortex-M3處理器包含的定時(shí)器,那么所有的CM3都帶有這個(gè)定時(shí)器,軟件在不CM3器件間的移植工作就可以得以化簡。不過,該定制器的具體時(shí)鐘源來源則由設(shè)計(jì)者決定,因此不同產(chǎn)品之間的時(shí)鐘頻率可能大不相同,所以需要查看器件手冊來選擇什么作為時(shí)鐘源。例如,在某中,該定時(shí)器的時(shí)鐘源可以是時(shí)鐘(FCLK,CM3上的自由運(yùn)行時(shí)鐘,或者是外部時(shí)鐘(CM3處理器STCLK信號(hào)。一席之地。它使操作系統(tǒng)和其他系統(tǒng)軟件在CM3器件間的移植變得簡單多了因?yàn)樵谒蠧M3中處理都相同。Systick定時(shí)器如何設(shè)計(jì)精準(zhǔn)的延時(shí)systick72MHZ1秒鐘CPU72000000systck720000007200000態(tài)寄存器的HCLK時(shí)鐘(72M)HCLK8分頻9M,缺省是這個(gè))SysTick的時(shí)鐘源。SysTick的重裝寄存器決定了定時(shí)器頻率。若systick的時(shí)鐘源是72M,查找應(yīng)用手冊可以知道這是把Systick的計(jì)時(shí)頻率設(shè)定為CPU主頻(SYSCLK)的1/8。假定我們板子默認(rèn)的晶振頻率是8Mhz,默認(rèn)CPU工作頻率(SYSCLK)9倍頻,即72M,那Systick的頻率72/8=9Mhz,9Mhz意味著systick計(jì)數(shù)器自減900萬次1秒鐘;那么就是systick每減1次,就等于是1/9us。那么要計(jì)時(shí)30us30*9systick自減,因?yàn)椋?0*9次*1/9us30us。Delay_Init()函數(shù)(延時(shí)初始化函數(shù)延時(shí)初始化函數(shù),這個(gè)函數(shù)總共做了如下幾步第一步:這里用到了條件編譯#ifdefOS_CRITICAL_UCOS這個(gè)宏,如果使用等操作系統(tǒng),就一定會(huì)定義這個(gè) 這個(gè)宏,如果沒有就可以不管:SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8)SysTick的時(shí)鐘源自HCLK8分頻,至于HCLK是多少,后面再講。:第三步:SystemCoreClockSysTick8分頻,所以1秒鐘運(yùn)行多少SysTick呢?可以計(jì)算一下次SystemCoreClock/81毫秒種運(yùn)行多少次SysTick呢?SystemCoreClock/8000000。=根據(jù)以上4條原理分析,得出下面初始化函數(shù)定義void {#ifdef //OS_CRITICAL_UCOS定義了,說明ucosII了 u32 此處為選擇外部時(shí)鐘HCLK/8 fac_us=SystemCoreClock/8000000; //SystemCoreClockfac_us1/8左右,因?yàn)閟ystick是72M的8分之一即9M 那么16777216/9M=1.864s*/ #ifdef //OS_CRITICAL_UCOS定義了,說明ucosII了 reload= reload* //OS_TICKS_PER_SEC設(shè)定溢出時(shí) fac_ms= //代表ucos可以延時(shí)的最少單 SysTick-SysTick- //1/OS_TICKS_PER_SECSysTick-SysTick- // }SysTcik是MDK定義的一個(gè)結(jié)構(gòu)體(在stm32f10x_map.h里面里面包含CTRLLOAD、SysTick一個(gè)遞減的計(jì)數(shù)器,當(dāng)計(jì)數(shù)器遞減到“0”時(shí),重裝寄存器中的值就會(huì)被重裝。SysTick_LOAD重裝值寄存器是一個(gè)24位寬的寄存器。選擇外部時(shí)鐘,這個(gè)函數(shù)是misc.c中來的,這里需要注意的是:SysTickHCLK89M72M,那時(shí)鐘頻率下延時(shí)1us需要多少個(gè)SysTick時(shí)鐘周期。同理:us延時(shí)的基數(shù),也就是延時(shí)1us,SysTick->LOAD所應(yīng)設(shè)置的值。如果使得fac_ms為ms延時(shí)的基數(shù),也就是延時(shí)1ms,那么SysTick->LOAD就要設(shè)置相應(yīng)的值。值得注意的fac_us9位整形數(shù)據(jù),fac_ms16位整形數(shù)據(jù)。正因?yàn)槿绱耍到y(tǒng)時(shí)鐘如果不是8的倍數(shù),則會(huì)導(dǎo)致延時(shí)函數(shù)確,這也是外部時(shí)鐘選擇8M的原因。這一點(diǎn)關(guān)于ucos的時(shí)鐘部分,我們后續(xù)再作詳細(xì)的介紹,這里為了使得知識(shí)結(jié)構(gòu)更加清晰,Delay_us()函數(shù)(延時(shí)多少微秒該函數(shù)用來延時(shí)指定的微秒,其參數(shù)xus為要延時(shí)的微秒數(shù),函數(shù)實(shí)現(xiàn)如voiddelay_us(u32xusxus u32 SysTick-SysTick- SysTick-SysTick- //設(shè)置開始倒數(shù)計(jì)時(shí)的 temp=SysTick- //等待時(shí)間到 SysTick- //關(guān)閉計(jì)數(shù)SysTick->VALSysTick->VAL //清空計(jì)數(shù)}其實(shí)這個(gè)函數(shù)主要是實(shí)現(xiàn)1個(gè)微秒里有多少個(gè)SysTick的時(shí)鐘數(shù),然后寫xusSysTickVALxus要次數(shù),也就是說,xus這個(gè)值就是systick定時(shí)器所能計(jì)時(shí)的最大值范圍。處于開啟狀態(tài),可以防止systick被意外關(guān)閉導(dǎo)致的死循環(huán)。這里SysTick->CTRL|=SysTick_CTRL_ENABLE_MskSysTick->CTRL寄存器進(jìn)行一次異或,這是操作寄存器的一種最常用的賦值語句。SysTick_CTRL_ENABLE_Msk是程序中的一個(gè)宏定義,在程序中,它的值就是0x01,這行代碼的意思就是設(shè)置SysTick->CTRL的第一位為下面這個(gè)函數(shù)為ucos來設(shè)計(jì)的voiddelay_us(u32 // u32 u32reload=SysTick- //需要的節(jié)拍 T_old=SysTick- //剛進(jìn)入時(shí)的計(jì)數(shù)器 T_now=SysTick- t+=T_old-T_now;//SYSTICK是一個(gè)遞減的計(jì)數(shù)器 t+=reload- break;//時(shí)間超過/等于要延遲的時(shí)間,則退出 }A點(diǎn)開始計(jì)時(shí),到BB-A得到這個(gè)中間的差額時(shí)間;那么此時(shí)已經(jīng)B時(shí)間,當(dāng)?shù)紺的時(shí)候,用C-B得到這個(gè)中間的差額時(shí)間。這2個(gè)差額時(shí)間相加就等于是從A點(diǎn)開始計(jì)時(shí),到C點(diǎn)的時(shí)間。 t是經(jīng)歷的總時(shí)間。通過這樣的差額法,可以靈活計(jì)算時(shí)間。在時(shí)間來進(jìn)行累加,從而達(dá)到不修改SysTick實(shí)現(xiàn)xus的延時(shí)。當(dāng)然如果是在操作系統(tǒng)中,還要加入上鎖和這2個(gè)操作,防止中斷的打擾影響我Delay_ms()函數(shù)(延時(shí)多少毫秒延時(shí)毫秒,之前在Delay_Init()函數(shù)中就已經(jīng)定義了兩個(gè)變量,一個(gè)是fac_us,一個(gè)是fac_ms變量fac_ms=(u16)fac_us*1000;//xmsxms的范圍SysTick->LOAD24位寄存器,所以,最大延時(shí) 對(duì)72M條件下voiddelay_ms(u16 u32 SysTick->LOAD=(u32)xms*fac_ms;//時(shí)間加載(SysTick->LOAD為 SysTick->VAL //清空計(jì)數(shù) SysTick- // temp=SysTick- while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到 SysTick- //關(guān)閉計(jì)數(shù) SysTick->VAL //清空計(jì)數(shù) }這個(gè)代碼與上面的delay_us非ucos版本大致是一樣的,但要注SysTick會(huì)被舍去,導(dǎo)致延時(shí)。最大的ms數(shù)還是可以通過如下進(jìn)行計(jì)算:SysTick->LOAD24位寄存器,最大值:2241024*1024*16=16777216,因?yàn)閟ystick72M89M16777216/9M=1.864s=1864ms。下面談一下ucos中延時(shí)函數(shù)的實(shí)現(xiàn),函數(shù)實(shí)現(xiàn)如下voiddelay_ms(u16 // if(xms>=fac_ms)//延時(shí)的時(shí)間大于ucos的最少時(shí)間周 OSTimeDly(xms/fac_ms);//ucos延 //普通方式延時(shí),此時(shí)ucos無法啟動(dòng)調(diào)度}Ucos運(yùn)行的時(shí)候,1ucos1fac_ms,如果我們需要延時(shí)的時(shí)間大不足1ucos時(shí)鐘節(jié)拍的時(shí)候,可以直接調(diào)用delay_us函數(shù)進(jìn)行補(bǔ)充解決。深入的內(nèi)容會(huì)在對(duì)應(yīng)的ucos章節(jié)進(jìn)行介紹。GPIO口的定義(自己設(shè)計(jì)操作某個(gè)GPIO管腳STM32IO口的具體的某個(gè)管腳的操作,也叫位操作,趣的朋友可以自己去比較一下這種設(shè)計(jì)與原廠ST軟件庫的設(shè)計(jì)理念有何不同之處。 #defineGPIOA_ODR_Addr #define (GPIOB_BASE+12)#defineGPIOC_ODR_Addr #defineGPIOD_ODR_Addr (

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論