<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32學(xué)習心得(3)

STM32學(xué)習心得(3)

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò ) 收藏
i)簡(jiǎn)單應用:

//改變占空比
TIM_SetCompare4(TIM3,變量);
j)注意事項:
管腳的IO輸出模式是根據應用來(lái)定,比如如果用PWM輸出驅動(dòng)LED則應該將相應管腳設為AF_PP,否則單片機沒(méi)有輸出。
STM32資料一(轉載)
注:下面是一些常用的代碼,網(wǎng)上很多但是大多注釋不全。高手看沒(méi)問(wèn)題,對于我們這些新手就費勁了……所以我把這些代碼集中,進(jìn)行了逐句注釋?zhuān)M麑π率謧冇袃r(jià)值。
flash:芯片內部存儲器flash操作函數
我的理解——對芯片內部flash進(jìn)行操作的函數,包括讀取,狀態(tài),擦除,寫(xiě)入等等,可以允許程序去操作flash上的數據。
基礎應用1,FLASH時(shí)序延遲幾個(gè)周期,等待總線(xiàn)同步操作。推薦按照單片機系統運行頻率,0—24MHz時(shí),取Latency=0;24—48MHz時(shí),取Latency=1;48~72MHz時(shí),取Latency=2。所有程序中必須的
用法:FLASH_SetLatency(FLASH_Latency_2);
位置:RCC初始化子函數里面,時(shí)鐘起振之后。
基礎應用2,開(kāi)啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的
用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
位置:RCC初始化子函數里面,時(shí)鐘起振之后。
3、lib:調試所有外設初始化的函數。
我的理解——不理解,也不需要理解。只要知道所有外設在調試的時(shí)候,EWRAM需要從這個(gè)函數里面獲得調試所需信息的地址或者指針之類(lèi)的信息。
基礎應用1,只有一個(gè)函數debug。所有程序中必須的。
用法:#ifdefDEBUG
debug();
#endif
位置:main函數開(kāi)頭,聲明變量之后。
4、nvic:系統中斷管理。
我的理解——管理系統內部的中斷,負責打開(kāi)和關(guān)閉中斷。
基礎應用1,中斷的初始化函數,包括設置中斷向量表位置,和開(kāi)啟所需的中斷兩部分。所有程序中必須的。
用法:voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;//中斷管理恢復默認參數
#ifdefVECT_TAB_RAM//如果C/C++CompilerPreprocessorDefinedsymbols中的定義了VECT_TAB_RAM(見(jiàn)程序庫更改內容的表格)
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);//則在RAM調試
#else//如果沒(méi)有定義VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//則在Flash里調試
#endif//結束判斷語(yǔ)句
//以下為中斷的開(kāi)啟過(guò)程,不是所有程序必須的。
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//設置NVIC優(yōu)先級分組,方式。
//注:一共16個(gè)優(yōu)先級,分為搶占式和響應式。兩種優(yōu)先級所占的數量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4,分別代表?yè)屨純?yōu)先級有1、2、4、8、16個(gè)和響應優(yōu)先級有16、8、4、2、1個(gè)。規定兩種優(yōu)先級的數量后,所有的中斷級別必須在其中選擇,搶占級別高的會(huì )打斷其他中斷優(yōu)先執行,而響應級別高的會(huì )在其他中斷執行完優(yōu)先執行。
//NVIC_InitStructure.NVIC_IRQChannel=中斷通道名;//開(kāi)中斷,中斷名稱(chēng)見(jiàn)函數庫
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//搶占優(yōu)先級
//NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//響應優(yōu)先級
//NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//啟動(dòng)此通道的中斷
//NVIC_Init(&NVIC_InitStructure);//中斷初始化
}
5、rcc:?jiǎn)纹瑱C時(shí)鐘管理。
我的理解——管理外部、內部和外設的時(shí)鐘,設置、打開(kāi)和關(guān)閉這些時(shí)鐘。
基礎應用1:時(shí)鐘的初始化函數過(guò)程——
用法:voidRCC_Configuration(void)//時(shí)鐘初始化函數
{
ErrorStatusHSEStartUpStatus;//等待時(shí)鐘的穩定
RCC_DeInit();//時(shí)鐘管理重置
RCC_HSEConfig(RCC_HSE_ON);//打開(kāi)外部晶振
HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部晶振就緒
if(HSEStartUpStatus==SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//flash讀取緩沖,加速
FLASH_SetLatency(FLASH_Latency_2);//flash操作的延時(shí)
RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB使用系統時(shí)鐘
RCC_PCLK2Config(RCC_HCLK_Div2);//APB2(高速)為HCLK的一半
RCC_PCLK1Config(RCC_HCLK_Div2);//APB1(低速)為HCLK的一半
//注:AHB主要負責外部存儲器時(shí)鐘。PB2負責AD,I/O,高級TIM,串口1。APB1負責DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//PLLCLK=8MHz*9=72MH
RCC_PLLCmd(ENABLE);//啟動(dòng)PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}//等待PLL啟動(dòng)
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//將PLL設置為系統時(shí)鐘源
while(RCC_GetSYSCLKSource()!=0x08){}//等待系統時(shí)鐘源的啟動(dòng)
}
//RCC_AHBPeriphClockCmd(ABP2設備1|ABP2設備2|,ENABLE);//啟動(dòng)AHP設備
//RCC_APB2PeriphClockCmd(ABP2設備1|ABP2設備2|,ENABLE);//啟動(dòng)ABP2設備
//RCC_APB1PeriphClockCmd(ABP2設備1|ABP2設備2|,ENABLE);//啟動(dòng)ABP1設備
}
6、exti:外部設備中斷函數
我的理解——外部設備通過(guò)引腳給出的硬件中斷,也可以產(chǎn)生軟件中斷,19個(gè)上升、下降或都觸發(fā)。EXTI0~EXTI15連接到管腳,EXTI線(xiàn)16連接到PVD(VDD監視),EXTI線(xiàn)17連接到RTC(鬧鐘),EXTI線(xiàn)18連接到USB(喚醒)。
基礎應用1,設定外部中斷初始化函數。按需求,不是必須代碼。
用法:voidEXTI_Configuration(void)
{
EXTI_InitTypeDefEXTI_InitStructure;//外部設備中斷恢復默認參數
EXTI_InitStructure.EXTI_Line=通道1|通道2;//設定所需產(chǎn)生外部中斷的通道,一共19個(gè)。
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//產(chǎn)生中斷
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//上升下降沿都觸發(fā)
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//啟動(dòng)中斷的接收
EXTI_Init(&EXTI_InitStructure);//外部設備中斷啟動(dòng)
}
7、dma:通過(guò)總線(xiàn)而越過(guò)CPU讀取外設數據
我的理解——通過(guò)DMA應用可以加速單片機外設、存儲器之間的數據傳輸,并在傳輸期間不影響CPU進(jìn)行其他事情。這對于入門(mén)開(kāi)發(fā)基本功能來(lái)說(shuō)沒(méi)有太大必要,這個(gè)內容先行跳過(guò)。
8、systic:系統定時(shí)器
我的理解——可以輸出和利用系統時(shí)鐘的計數、狀態(tài)。
基礎應用1,精確計時(shí)的延時(shí)子函數。推薦使用的代碼。
用法:
staticvu32TimingDelay;//全局變量聲明
voidSysTick_Config(void)//systick初始化函數
{
SysTick_CounterCmd(SysTick_Counter_Disable);//停止系統定時(shí)器
SysTick_ITConfig(DISABLE);//停止systick中斷
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//systick使用HCLK作為時(shí)鐘源,頻率值除以8。
SysTick_SetReload(9000);//重置時(shí)間1毫秒(以72MHz為基礎計算)
SysTick_ITConfig(ENABLE);//開(kāi)啟systic中斷
}
voidDelay(u32nTime)//延遲一毫秒的函數
{
SysTick_CounterCmd(SysTick_Counter_Enable);//systic開(kāi)始計時(shí)
TimingDelay=nTime;//計時(shí)長(cháng)度賦值給遞減變量
while(TimingDelay!=0);//檢測是否計時(shí)完成
SysTick_CounterCmd(SysTick_Counter_Disable);//關(guān)閉計數器
SysTick_CounterCmd(SysTick_Counter_Clear);//清除計數值
}
voidTimingDelay_Decrement(void)//遞減變量函數,函數名由“stm32f10x_it.c”中的中斷響應函數定義好了。
{
if(TimingDelay!=0x00)//檢測計數變量是否達到0
{TimingDelay--;//計數變量遞減
}
}
注:建議熟練后使用,所涉及知識和設備太多,新手出錯的可能性比較大。新手可用簡(jiǎn)化的延時(shí)函數代替:
voidDelay(vu32nCount)//簡(jiǎn)單延時(shí)函數
{
for(;nCount!=0;nCount--);//循環(huán)變量遞減計數
}
當延時(shí)較長(cháng),又不需要精確計時(shí)的時(shí)候可以使用嵌套循環(huán):
voidDelay(vu32nCount)//簡(jiǎn)單的長(cháng)時(shí)間延時(shí)函數
{inti;//聲明內部遞減變量
for(;nCount!=0;nCount--)//遞減變量計數
{for(i=0;i<0xffff;i++)}//內部循環(huán)遞減變量計數
}
9、gpio:I/O設置函數
我的理解——所有輸入輸出管腳模式設置,可以是上下拉、浮空、開(kāi)漏、模擬、推挽模式,頻率特性為2M,10M,50M。也可以向該管腳直接寫(xiě)入數據和讀取數據。
基礎應用1,gpio初始化函數。所有程序必須。
用法:voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;//GPIO狀態(tài)恢復默認參數
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_標號|GPIO_Pin_標號;//管腳位置定義,標號可以是NONE、ALL、0至15。
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;//輸出速度2MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入模式
GPIO_Init(GPIOC,&GPIO_InitStructure);//C組GPIO初始化
//注:以上四行代碼為一組,每組GPIO屬性必須相同,默認的GPIO參數為:ALL,2MHz,FLATING。如果其中任意一行與前一組相應設置相同,那么那一行可以省略,由此推論如果前面已經(jīng)將此行參數設定為默認參數(包括使用GPIO_InitTypeDefGPIO_InitStructure代碼),本組應用也是默認參數的話(huà),那么也可以省略。以下重復這個(gè)過(guò)程直到所有應用的管腳全部被定義完畢。
……
}
基礎應用2,向管腳寫(xiě)入0或1
用法:GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x01);//寫(xiě)入1
基礎應用3,從管腳讀入0或1
用法:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)

本文來(lái)自CSDN博客,轉載請標明出處:http://blog.csdn.net/feiniao_lql/archive/2010/06/13/5668585.aspx

本文引用地址:http://dyxdggzs.com/article/201611/321206.htm

0、實(shí)驗之前的準備

a)接通串口轉接器

b)下載IO與串口的原廠(chǎng)程序,編譯通過(guò)保證調試所需硬件正常。

1、flash,lib,nvic,rcc和GPIO,基礎程序庫編寫(xiě)

a)這幾個(gè)庫函數中有一些函數是關(guān)于芯片的初始化的,每個(gè)程序中必用。為保障程序品質(zhì),初學(xué)階段要求嚴格遵守官方習慣。注意,官方程序庫例程中有個(gè)platform_config.h文件,是專(zhuān)門(mén)用來(lái)指定同類(lèi)外設中第幾號外設被使用,就是說(shuō)在main.c里面所有外設序號用x代替,比如USARTx,程序會(huì )到這個(gè)頭文件中去查找到底是用那些外設,初學(xué)的時(shí)候參考例程別被這個(gè)所迷惑住。

b)全部必用代碼取自庫函數所帶例程,并增加逐句注釋。

c)習慣順序——Lib(debug),RCC(包括Flash優(yōu)化),NVIC,GPIO

d)必用模塊初始化函數的定義:

voidRCC_Configuration(void);//定義時(shí)鐘初始化函數

voidGPIO_Configuration(void);//定義管腳初始化函數

voidNVIC_Configuration(void);//定義中斷管理初始化函數

voidDelay(vu32nCount);//定義延遲函數

e)Main中的初始化函數調用:

RCC_Configuration();//時(shí)鐘初始化函數調用

NVIC_Configuration();//中斷初始化函數調用

GPIO_Configuration();//管腳初始化函數調用

f)Lib注意事項:

屬于Lib的Debug函數的調用,應該放在main函數最開(kāi)始,不要改變其位置。

g)RCC注意事項:

Flash優(yōu)化處理可以不做,但是兩句也不難也不用改參數……

根據需要開(kāi)啟設備時(shí)鐘可以節省電能

時(shí)鐘頻率需要根據實(shí)際情況設置參數

h)NVIC注意事項

注意理解占先優(yōu)先級和響應優(yōu)先級的分組的概念

i)GPIO注意事項

注意以后的過(guò)程中收集不同管腳應用對應的頻率和模式的設置。

作為高低電平的I/O,所需設置:RCC初始化里面打開(kāi)RCC_APB2

PeriphClockCmd(RCC_APB2Periph_GPIOA);GPIO里面管腳設定:IO輸出(50MHz,Out_PP);IO輸入(50MHz,IPU);

j)GPIO應用

GPIO_WriteBit(GPIOB,GPIO_Pin_2,Bit_RESET);//重置

GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x01);//寫(xiě)入1

GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x00);//寫(xiě)入0

GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);//讀入IO

k)簡(jiǎn)單Delay函數

voidDelay(vu32nCount)//簡(jiǎn)單延時(shí)函數

{for(;nCount!=0;nCount--);}

實(shí)驗步驟:

RCC初始化函數里添加:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

不用其他中斷,NVIC初始化函數不用改

GPIO初始化代碼:

//IO輸入,GPIOB的2、10、11腳輸出

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//管腳號

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//輸出速度

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//輸入輸出模式

GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化

簡(jiǎn)單的延遲函數:

voidDelay(vu32nCount)//簡(jiǎn)單延時(shí)函數

{for(;nCount!=0;nCount--);}//循環(huán)計數延時(shí)

完成之后再在main.c的while里面寫(xiě)一段:

GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x01);//寫(xiě)入1

Delay(0xffff);

GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x00);//寫(xiě)入0

Delay(0xffff);

就可以看到連接在PB2腳上的LED閃爍了,單片機就跑起來(lái)了。

STM32筆記之八:來(lái)跟PC打個(gè)招呼,基本串口通訊

a)目的:在基礎實(shí)驗成功的基礎上,對串口的調試方法進(jìn)行實(shí)踐。硬件代碼順利完成之后,對日后調試需要用到的printf重定義進(jìn)行調試,固定在自己的庫函數中。

b)初始化函數定義:

voidUSART_Configuration(void);//定義串口初始化函數

c)初始化函數調用:

voidUART_Configuration(void);//串口初始化函數調用

初始化代碼:

voidUSART_Configuration(void)//串口初始化函數

{

//串口參數初始化

USART_InitTypeDefUSART_InitStructure;//串口設置恢復默認參數

//初始化參數設置

USART_InitStructure.USART_BaudRate=9600;//波特率9600

USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字長(cháng)8位

USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位停止字節

USART_InitStructure.USART_Parity=USART_Parity_No;//無(wú)奇偶校驗

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無(wú)流控制

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//打開(kāi)Rx接收和Tx發(fā)送功能

USART_Init(USART1,&USART_InitStructure);//初始化

USART_Cmd(USART1,ENABLE);//啟動(dòng)串口

}

RCC中打開(kāi)相應串口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

GPIO里面設定相應串口管腳模式

//串口1的管腳初始化

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//管腳9

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出

GPIO_Init(GPIOA,&GPIO_InitStructure);//TX初始化

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//管腳10

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入

GPIO_Init(GPIOA,&GPIO_InitStructure);//RX初始化


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

關(guān)鍵詞: STM32學(xué)習心

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>