新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32單片機(jī)的學(xué)習(xí)經(jīng)驗(yàn)

STM32單片機(jī)的學(xué)習(xí)經(jīng)驗(yàn)

作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò) 收藏
隨便寫(xiě)寫(xiě),關(guān)于stm32 最近在學(xué)習(xí)stm32,寫(xiě)點(diǎn)東西,雖然簡(jiǎn)單,但都是原創(chuàng)啊

開(kāi)發(fā)板是前輩畫(huà)的,好像是用來(lái)測(cè)試一個(gè)3G功能的,不過(guò)對(duì)于我來(lái)說(shuō)太遠(yuǎn);我要來(lái)了3個(gè),自己焊了一個(gè)最小系統(tǒng),好在公司資源還是不錯(cuò)的,器件芯片有,還可以問(wèn)問(wèn)前輩--對(duì)公司還是比較滿意的,雖然工資少了點(diǎn),但學(xué)東西第一位O(∩_∩)O~。
最開(kāi)始當(dāng)然是建工程了,這個(gè)真不太會(huì),前前后后竟用了一周(時(shí)間真長(zhǎng),別見(jiàn)笑?。暇W(wǎng)查資料, 問(wèn)前輩,自己琢磨。。??偹愀愣?,然后從GPIO開(kāi)始學(xué),開(kāi)始還真沒(méi)什么頭緒(雖然在大學(xué)學(xué)點(diǎn)51,但完全沒(méi)有真正應(yīng)用,頂多是跑馬燈實(shí)驗(yàn)),開(kāi)始糾結(jié)是從寄存器開(kāi)始學(xué)還是從庫(kù)函數(shù)開(kāi)始學(xué),后來(lái)看到一句“用庫(kù)函數(shù)入門,用寄存器提高”于是下定決心用庫(kù),但當(dāng)時(shí)沒(méi)有庫(kù)的概念,結(jié)果走了很多彎路,看了很多不必要的東西,當(dāng)時(shí)竟沒(méi)理解到只是調(diào)用庫(kù)就OK了,別的不用管。最后潛心的在www.51hei.com教程網(wǎng)看完一個(gè)例程后照貓畫(huà)虎寫(xiě)了一個(gè),經(jīng)過(guò)了多次調(diào)試以后,燈終于亮了!那個(gè)興奮啊。再次還要感謝http://www.51hei.com/mcu/1106.html的作者他寫(xiě)的GPIO使用方法讓我少走了很多彎路,接著學(xué)的EXTI,當(dāng)時(shí)對(duì)中斷的理解只是概念上的,也不知道中斷程序要放在中斷函數(shù)里(it.c),總之現(xiàn)在想想當(dāng)時(shí)怎么那么不開(kāi)竅啊。慢慢的中斷也弄出來(lái)了,一會(huì)我會(huì)把程序貼出來(lái),很簡(jiǎn)單的嘿。慢慢的有點(diǎn)感覺(jué)找到門了:先大致看一下要學(xué)習(xí)概要,找個(gè)例程,一個(gè)函數(shù)一個(gè)函數(shù)的看,重點(diǎn)理解配置的什么,參數(shù),然后在頭腦中形成一個(gè)大概的輪廓,雖然有時(shí)候不是特別清晰;接著學(xué)習(xí)TIMER(通用定時(shí)器),只是學(xué)習(xí)了最簡(jiǎn)單的溢出中斷,其他捕獲什么的都還沒(méi)有看呢--想先對(duì)stm有個(gè)總體的學(xué)習(xí),下一步準(zhǔn)備每個(gè)模塊細(xì)細(xì)“研讀”。應(yīng)用定時(shí)器溢出中斷做了個(gè)閃燈小程序;接著順便把學(xué)習(xí)過(guò)的GPIO,EXTI,TIMER混在一起做了一個(gè)優(yōu)先級(jí)(NVIC)的程序,以來(lái)了解下優(yōu)先級(jí),二來(lái)對(duì)前面的學(xué)習(xí)是一個(gè)復(fù)習(xí),雖然很簡(jiǎn)單,但沒(méi)能一下子就調(diào)出來(lái)--其實(shí)每次都會(huì)在細(xì)節(jié)上出不少差錯(cuò):時(shí)鐘忘使能啦,GPIO沒(méi)有配置全啦,名稱寫(xiě)錯(cuò)啦(很低級(jí),但這個(gè)有時(shí)候真的不好找),概念理解不對(duì)啦。。。。。。有時(shí)候憋的真是相當(dāng)難受,但問(wèn)題解決的那一刻真怎是一個(gè)“爽”字了得啊,當(dāng)然前提是自己解決的;接下來(lái)學(xué)USART(串口),原來(lái)我也不知道有串口這么個(gè)東西,但弄單片機(jī)的要是不知道“串口”就好比開(kāi)車的不知道輪胎一樣了,開(kāi)始完全沒(méi)有概念,什么波特率啊,奇偶校驗(yàn)位啊,停止位啊,對(duì)著一堆名詞看著都頭大。慢慢的了解到串口是一種通訊傳輸方式,就和USB一樣,只是串口比USB早出生好多年。這時(shí)候已經(jīng)有點(diǎn)門了,看概念,抄例程,看函數(shù),理解,根據(jù)自己的理解改參數(shù),實(shí)現(xiàn)!學(xué)會(huì)了串口,以后就可以通過(guò)串口來(lái)觀察數(shù)據(jù)了(我的實(shí)驗(yàn)板可是沒(méi)有屏的);下一個(gè)是DMA,DMA可是個(gè)好東西,至于怎么好,百度一下,大家就知道了;下來(lái)ADC(模數(shù)轉(zhuǎn)換),就是把模擬量轉(zhuǎn)化成數(shù)字量,據(jù)說(shuō)stm之所以強(qiáng)大,ADC算一個(gè)重要條件,我只是簡(jiǎn)單了應(yīng)用了一個(gè)測(cè)電壓的功能(可以說(shuō)是ADC的最簡(jiǎn)單功能了),用串口顯示探針(自己焊上去的)所測(cè)到的電壓值,主要卡在了兩個(gè)地方:1忘記配置串口的GPIO(所以一定要注意細(xì)節(jié),一個(gè)細(xì)節(jié)能憋我1天) 2對(duì)通道的理解不夠,原以為通道自己找串口(現(xiàn)在發(fā)現(xiàn)自己挺天真的),實(shí)際是每個(gè)通道對(duì)應(yīng)自己的GPIO口,或模塊(如溫度傳感器),“一知半解”又讓我卡了1天。解決這兩個(gè)問(wèn)題后,串口赫然出現(xiàn)數(shù)字啦,而且是探地是0,探電源是33xx(3.3V的),還真準(zhǔn)呢??;現(xiàn)在在學(xué)習(xí)I2C(剛剛開(kāi)始看),還在看概念。。。
希望自己堅(jiān)持下去,早日能寫(xiě)出一個(gè)屬于自己的程序,完成一個(gè)說(shuō)的過(guò)去的功能,下面把我的程序粘出來(lái),和大家分享下,大蝦看到了別見(jiàn)笑啊

本文引用地址:http://butianyuan.cn/article/201611/323419.htm

注:1.有兩個(gè)燈,PA4 B12,都是低電平點(diǎn)亮
2.有兩個(gè)按鍵,PB8 和 PB9,按下是低電平
3.程序開(kāi)始后兩個(gè)燈常亮,按下按鍵后熄滅,抬起后繼續(xù)亮


main.c中

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"

void RCC_Configuration(void) //時(shí)鐘配置函數(shù)
{
ErrorStatus HSEStartUpStatus;
//使能外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部晶振穩(wěn)定
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//如果外部晶振啟動(dòng)成功,則進(jìn)行下一步操作
if(HSEStartUpStatus==SUCCESS)
{
//設(shè)置HCLK(AHB時(shí)鐘)=SYSCLK 將系統(tǒng)時(shí)鐘進(jìn)行分頻后,作為AHB總線時(shí)鐘
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//PCLK1(APB1) = HCLK/2 將HCLK時(shí)鐘2分頻后給低速外部總線
RCC_PCLK1Config(RCC_HCLK_Div2);
//PCLK2(APB2) = HCLK HCLK時(shí)鐘配置給高速外部總線
RCC_PCLK2Config(RCC_HCLK_Div1);
//外部高速時(shí)鐘HSE 4倍頻
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
//啟動(dòng)PLL
RCC_PLLCmd(ENABLE);
//等待PLL穩(wěn)定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//系統(tǒng)時(shí)鐘SYSCLK來(lái)自PLL輸出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//切換時(shí)鐘后等待系統(tǒng)時(shí)鐘穩(wěn)定
while(RCC_GetSYSCLKSource()!=0x08);
}
// 下面這些都是外設(shè)總線上所掛的外部設(shè)備時(shí)鐘的配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
}


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專區(qū)

關(guān)閉