DMA
1、DMA普通模式和循環(huán)模式的區(qū)別
循環(huán)模式:用于處理一個(gè)環(huán)形的緩沖區(qū),每輪傳輸結(jié)束時(shí)數(shù)據(jù)傳輸 的配置會(huì)自動(dòng)地更新為初始狀態(tài),DMA傳輸會(huì)連續(xù)不斷地進(jìn)行。
普通模式:在DMA傳輸結(jié)束時(shí),DMA通道被自動(dòng)關(guān)閉,進(jìn)一步的 DMA請(qǐng)求將不被滿足。
2、DMA傳輸需要指定的條件:
傳輸源:DMA控制器從傳輸源讀出數(shù)據(jù);
傳輸目標(biāo):DMA控制器將數(shù)據(jù)傳輸?shù)哪繕?biāo);
觸發(fā)信號(hào):用于觸發(fā)一次數(shù)據(jù)傳輸?shù)膭?dòng)作,執(zhí)行一個(gè)單位的傳輸源至傳輸目標(biāo)的數(shù)據(jù)傳輸??梢杂脕砜刂苽鬏?shù)膯?dòng)條件。
ADC
1、STM32的內(nèi)部溫度傳感器
STM32內(nèi)部溫度傳感器與ADC的通道16相連,與ADC配 合使用實(shí)現(xiàn)溫度測(cè)量。測(cè)量范圍–40~125℃,精度 ± 1.5℃
操作流程:
1)、設(shè)置ADC相關(guān)參數(shù)
// ADC1 configuration -----------------------------
ADC_InitStructure.ADC_Mode ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel 1;
ADC_Init(ADC1, &ADC_InitStructure);
2)、選中ADC1的通道16作為輸入,設(shè)置采樣時(shí)間17.1us ( Ncycle × tADC 17.1靤 )。
// ADC1 regular channel16 Temp Sensor configuration
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5);
3)、設(shè)置寄存器ADC_CR2中的TSVREFE位激活溫度傳感器
// Enable the temperature sensor and vref internal channel
ADC_TempSensorVrefintCmd(ENABLE);
4)、轉(zhuǎn)換采樣值為溫度
ADC轉(zhuǎn)換結(jié)束以后,讀取ADC_DR寄存器中的結(jié)果,轉(zhuǎn)換溫度值計(jì)算公式如下:
V25 - VSENSE
T(℃) ------------ + 25
Avg_Slope
V25: 溫度傳感器在25℃時(shí) 的輸出電壓,典型值1.43 V。
VSENSE:溫度傳感器的當(dāng)前輸出電壓,與ADC_DR 寄存器中的結(jié)果ADC_ConvertedValue之間的轉(zhuǎn)換關(guān)系為:
ADC_ConvertedValue * Vdd
VSENSE --------------------------
Vdd_convert_value(0xFFF)
Avg_Slope:溫度傳感器輸出電壓和溫度的關(guān)聯(lián)參數(shù),典型值4.3 mV/℃。
//Converted Temperature
Vtemp_sensor ADC_ConvertedValue * Vdd / Vdd_convert_value;
Current_Temp (V25 - Vtemp_sensor)/Avg_Slope + 25;
2、VDDA的電壓范圍
STM32的數(shù)據(jù)手冊(cè)規(guī)定,VDD與VDDA之間的壓差不能大于300mV。ADC的工作電壓范圍在2.4V~3.6V,供電電壓VDD范圍在2.0V~3.6V.
1、STM32的USB中斷說明
STM32的USB模塊可產(chǎn)生三種中斷:USB喚醒中斷、USB高優(yōu)先級(jí)中斷和USB低優(yōu)先級(jí)中斷,這三種中斷對(duì)應(yīng)事件如下:
1)、USB喚醒中斷 - 在中斷向量表中的位置是42
這個(gè)中斷在USB設(shè)備從暫停模式喚醒時(shí)產(chǎn)生,喚醒事件由USB_ISTR寄存器的WKUP位標(biāo)識(shí)。
2)、USB高優(yōu)先級(jí)中斷 - 在中斷向量表中的位置是19
這個(gè)中斷僅由USB同步(Isochronous)模式傳輸或雙緩沖塊(Bulk)傳輸模式下的正確傳輸事件產(chǎn)生,正確傳輸事件由USB_ISTR寄存器的CTR位標(biāo)識(shí)。
3)、USB低優(yōu)先級(jí)中斷 - 在中斷向量表中的位置是20
這個(gè)中斷由所有其它的USB事件產(chǎn)生,例如正確傳輸(不包括同步模式和雙緩沖塊模式)、USB復(fù)位等,事件標(biāo)志位在USB_ISTR寄存器中。
在STM提供的STM32 USB 開發(fā)包中的例程包含了上述三種中斷的處理方法。例如在USB Speaker例程中,CTR_HP函數(shù)處理USB高優(yōu)先級(jí)中斷;在所有例子中都有USB_Istr()函數(shù)處理USB低優(yōu)先級(jí)中斷。
bxCAN
1、CAN波特率的設(shè)定計(jì)數(shù)
Etherne
SPI
1、SPI外設(shè)的NSS引腳設(shè)置為通用IO口
由于SPI外設(shè)的SPI_CR1寄存器中SSM置1時(shí),NSS引腳可被被釋放用于GPIO使用,因此無論是在SPI的主模式或是從模式下均可以將NSS引腳釋放,由軟件或硬件進(jìn)行NSS管理;
操作流程:
1)、初始化SPI外設(shè),設(shè)置NSS由軟件管理:
SPI_InitStructure.SPI_NSS SPI_NSS_Soft;
2)、如果NSS引腳用于其他外設(shè)時(shí),需要使能NSS輸出:
SPI_SSOutputCmd(SPIx, ENABLE);
2、SPI 單線傳輸
此模式下限制:只能用作輸入或者輸出,或者工作在半雙工模式下。
I2C
USART
Device Signature
1、 STM32F10xxx系列MCU內(nèi)部含有一個(gè)出廠被固化的96bit唯一識(shí)別ID,該ID可以用于芯片加密、設(shè)備識(shí)別等一類特殊應(yīng)用。
讀取該ID的方法:
u32 DevID[3];
DevID[0] *(vu32*)(0x1ffff7e8);
DevID[1] *(vu32*)(0x1ffff7ec);
DevID[2] *(vu32*)(0x1ffff7f0);
數(shù)組DevID[3]中即保存了MCU的ID。
注:256K Flash或以上容量的STM32,僅“Z”版本才有,之前的“A”版本沒有。
1、STM32對(duì)內(nèi)部Flash的保護(hù)措施
所有STM32的芯片都提供對(duì)Flash的保護(hù),防止對(duì)Flash的非法訪問 - 寫保護(hù)和讀保護(hù)。
1)、讀保護(hù)即大家通常說的“加密”,是作用于整個(gè)Flash存儲(chǔ)區(qū)域。一旦設(shè)置了Flash的讀保護(hù),內(nèi)置的Flash存儲(chǔ)區(qū)只能通過程序的正常執(zhí)行才能讀出,而不能通過下述任何一種方式讀出:
通過調(diào)試器(JTAG或SWD);
從RAM中啟動(dòng)并執(zhí)行的程序;
2)、寫保護(hù)是以四頁(1KB/頁) Flash存儲(chǔ)區(qū)為單位提供寫保護(hù),對(duì)被保護(hù)的頁實(shí)施編程或擦除操作將不被執(zhí)行,同時(shí)產(chǎn)生操作錯(cuò)誤標(biāo)志。
讀與寫設(shè)置的效果見下表:
讀保護(hù) 寫保護(hù) 對(duì)Flash的操作功能
有效 有效 CPU只能讀,禁止調(diào)試和非法訪問。
有效 無效 CPU可以讀寫,禁止調(diào)試和非法訪問,頁0~3為寫保護(hù)。
無效 有效 CPU可讀,允許調(diào)試和非法訪問。
無效 無效 CPU可以讀寫,允許調(diào)試和非法訪問。
2、當(dāng)Flash讀保護(hù)生效時(shí),CPU執(zhí)行程序可以讀受保護(hù)的Flash區(qū),但存在兩個(gè)例外情況:
1)、調(diào)試執(zhí)行程序時(shí);
2)、從RAM啟動(dòng)并執(zhí)行程序時(shí)
STM32還提供了一個(gè)特別的保護(hù),即對(duì)Flash存儲(chǔ)區(qū)施加讀保護(hù)后,即使沒有啟用寫保護(hù),F(xiàn)lash的第 0 ~ 3 頁也將處于寫保護(hù)狀態(tài),這是為了防止修改復(fù)位或中斷向量而跳轉(zhuǎn)到RAM區(qū)執(zhí)行非法程序代碼。
3、Flash保護(hù)相關(guān)函數(shù)
FLASH_Unlock(); //Flash解鎖
FLASH_ReadOutProtection(DISABLE); //Flash讀保護(hù)禁止
FLASH_ReadOutProtection(ENABLE); //Flash讀保護(hù)允許
CRC
1、CRC計(jì)算公式
所有的STM32芯片都內(nèi)置了一個(gè)硬件的CRC計(jì)算模塊,可應(yīng)用到通信程序中,這個(gè)CRC計(jì)算模塊使用常見的、在以太網(wǎng)中使用的計(jì)算多項(xiàng)式:
X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2 + X + 1
寫成16進(jìn)制就是:0x04C11DB7
2、使用這個(gè)內(nèi)置CRC模塊操作步驟:
復(fù)位CRC模塊(設(shè)置CRC_CR0x01),這個(gè)操作把CRC計(jì)算的余數(shù)初始化為0xFFFFFFFF
把要計(jì)算的數(shù)據(jù)按每32位分割為一組數(shù)據(jù)字,并逐個(gè)地把這組數(shù)據(jù)字寫入CRC_DR寄存器(既下圖中的綠色框)
寫完所有的數(shù)據(jù)字后,就可以從CRC_DR寄存器(既下圖中的蘭色框)讀出計(jì)算的結(jié)果。
注意:雖然讀寫操作都是針對(duì)CRC_DR寄存器,但實(shí)際上是訪問的不同物理寄存器。
評(píng)論
查看更多