www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 串口:一. USART_ITConfig(USART1, USART_IT_TXE, ENABLE):只要發(fā)送寄存器為空,就會一直有中斷,因此,要是不發(fā)送數(shù)據(jù)時,把發(fā)送中斷關(guān)閉,只在開始發(fā)送時,才打開。二.以下是字符發(fā)送的配置過程,注

串口

一. USART_ITConfig(USART1, USART_IT_TXE, ENABLE):

只要發(fā)送寄存器為空,就會一直有中斷,因此,要是不發(fā)送數(shù)據(jù)時,把發(fā)送中斷關(guān)閉,只在開始發(fā)送時,才打開。

二.

以下是字符發(fā)送的配置過程,注意第6點(diǎn),在設(shè)置USART_CR1中的TE位時,會發(fā)送一個空閑幀作為第一次數(shù)據(jù)發(fā)送,所以即便你執(zhí)行了USART_ClearFlag(USART1, USART_FLAG_TC); (這個函數(shù)肯定在空閑幀數(shù)據(jù)發(fā)送完成前執(zhí)行),所以當(dāng)空閑幀發(fā)送完后,就進(jìn)入發(fā)送完成中斷。

配置步驟:
1.通過在USART_CR1寄存器上置位UE位來激活USART
2.編程USART_CR1的M位來定義字長。
3.在USART_CR2中編程停止位的位數(shù)。
4.如果采用多緩沖器通信,配置USART_CR3中的DMA使能位(DMAT)。按多緩沖器通信中
的描述配置DMA寄存器。
5.利用USART_BRR寄存器選擇要求的波特率。
6.設(shè)置USART_CR1中的TE位,發(fā)送一個空閑幀作為第一次數(shù)據(jù)發(fā)送。
7.把要發(fā)送的數(shù)據(jù)寫進(jìn)USART_DR寄存器(此動作清除TXE位)。在只有一個緩沖器的情況
下,對每個待發(fā)送的數(shù)據(jù)重復(fù)步驟7。
8.在USART_DR寄存器中寫入最后一個數(shù)據(jù)字后,要等待TC=1,它表示最后一個數(shù)據(jù)幀的
傳輸結(jié)束。當(dāng)需要關(guān)閉USART或需要進(jìn)入停機(jī)模式之前,需要確認(rèn)傳輸結(jié)束,避免破壞
最后一次傳輸。

解決的辦法:
方法一
在執(zhí)行USART_ITConfig(USART1,USART_IT_TC, ENABLE); 之前,
先延時一段時間,基本上比一個字符發(fā)送的時間長一點(diǎn)就可以了,然后再執(zhí)行
USART_ClearFlag(USART1, USART_FLAG_TC);

方法二:
在執(zhí)行USART_ITConfig(USART1,USART_IT_TC, ENABLE); 之前,
USART_ClearFlag(USART1, USART_FLAG_TC);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)
{
; //等待空閑幀發(fā)送完成后再清零發(fā)送標(biāo)志
}
USART_ClearFlag(USART1,USART_FLAG_TC);

三.

TXE:發(fā)送緩沖器空閑標(biāo)志

RXNE:接收緩沖區(qū)非空

IAP:

一.

問:

這幾天在折騰STM32的IAP,參考了兩個例程,一個AN2557,然后一個就是標(biāo)準(zhǔn)外設(shè)庫內(nèi)的flash例程

總結(jié)IAP:

1.Flash解鎖FLASH_Unlock();

2.清除Flash所有的未完成的標(biāo)志位FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

3.根據(jù)文件大小擦除Flash
for(EraseCounter=0;(EraseCounter{
FLASHStatus=FLASH_ErasePage(StartAddr+(FLASH_PAGE_SIZE*EraseCounter));
}

4.編程Flash
while((Address{
FLASHStatus=FLASH_ProgramWord(Address,Data);
Address=Address+4;
}

5.檢驗(yàn)編入數(shù)據(jù)的正確性
while((Address{
if((*(__IOuint32_t*)Address)!=Data)
{
MemoryProgramStatus=FAILED;
}
Address+=4;
}

在以上幾步中,如果上面沒有問題的話,提出下面幾個疑問

1.假如我的應(yīng)用程序的地址應(yīng)該從0x8003000開始,那么我把后面的頁全部擦除是否可以?雖然我的程序可能只占到0x8003000-0x8005000那么這之后的頁是否也可以一并擦除?

2.在編程的時候有個很小的問題,因我的數(shù)據(jù)都是以字節(jié)(byte)的形式儲存的,在寫的時候因?yàn)橹荒芤园胱?16位)或一個字(32位)的方式編程,那么如果我的bin
文件的最后一個字節(jié)并不夠兩個字節(jié),怎么辦?舉例:我的bin文件的大小是501個字節(jié)(8位),我的寫入方法是這樣的:
data[501]={X,X,X...}//應(yīng)用程序bin文件內(nèi)容
temp=data[0];
temp=temp<<8;
temp|=data[1];
temp=temp<<8;
temp|=data[2];
teme=temp<<8;
teme|=data[3];//待寫入得數(shù)據(jù)

FLASHStatus=FLASH_ProgramWord(Address,temp);//寫入flash

如果像這樣的話,那么不能被4整除的那一個字節(jié)怎么辦?

3.IAP程序中有一處一直很迷惑,不能理解
/*Testifusercodeisprogrammedstartingfromaddress"ApplicationAddress"*/
if(((*(__IOuint32_t*)ApplicationAddress)&0x2FFE0000)==0x20000000)
{/*Jumptouserapplication*/
JumpAddress=*(__IOuint32_t*)(ApplicationAddress+4);
Jump_To_Application=(pFunction)JumpAddress;
/*Initializeuserapplication'sStackPointer*/
__set_MSP(*(__IOuint32_t*)ApplicationAddress);
Jump_To_Application();
}
程序的整體是要跳出IAP引導(dǎo)區(qū)跳到應(yīng)用程序區(qū).那么這句判斷的依據(jù)是什么?if(((*(__IOuint32_t*)ApplicationAddress)&0x2FFE0000)==0x20000000)
倘若我今天的程序是重0x8003000處開始,那么明天我升級一個程序,他的開始是0x80080000呢?這里需要改嗎?

0x2FFE00000x20000000這兩個數(shù)我在AN2557的例子代碼里反復(fù)尋找,并沒有哪里出現(xiàn),那么又是怎么跟用戶的應(yīng)用程序關(guān)聯(lián)的呢?

還有如果將上面的例子直接這樣更改,是否可以達(dá)到跳轉(zhuǎn)到應(yīng)用程序區(qū)的目的呢?
/*Jumptouserapplication*/
JumpAddress=*(__IOuint32_t*)(ApplicationAddress+4);//這里為何要+4?+了4不就跳過出應(yīng)用程序的入口了嗎?
Jump_To_Application=(pFunction)JumpAddress;
/*Initializeuserapplication'sStackPointer*/
__set_MSP(*(__IOuint32_t*)ApplicationAddress);
Jump_To_Application();

4.關(guān)于Flash的寫保護(hù)問題,在3.0標(biāo)準(zhǔn)外設(shè)庫中Flash還有另外一個例子,就是關(guān)于保護(hù)的
無疑flash的保護(hù)是對程序的一個安全保障,但目前我買的新片子(未進(jìn)行過任何保護(hù)方面的操作)中,是否不需要考慮這些問題,直接擦除,然后編程即可?

5.有什么理由要“今天的程序是重0x8003000處開始,明天又升級一個程序,他的開始是呢”?第1沒有必要,第2是自尋煩惱。開始地址是你自己定的,為什么要自己為難自己?

這個問題怪我沒說清楚,其實(shí)我是想說,我現(xiàn)在的引導(dǎo)區(qū)這樣定義的#ApplicationAddress0x80030000我只能啟動起始地址在0x08003000處的應(yīng)用程序,那么這段代碼是可以成功啟動的(我驗(yàn)證過):
/*Testifusercodeisprogrammedstartingfromaddress"ApplicationAddress"*/
if(((*(__IOuint32_t*)ApplicationAddress)&0x2FFE0000)==0x20000000)
{/*Jumptouserapplication*/
JumpAddress=*(__IOuint32_t*)(ApplicationAddress+4);
Jump_To_Application=(pFunction)JumpAddress;
/*Initializeuserapplication'sStackPointer*/
__set_MSP(*(__IOuint32_t*)ApplicationAddress);
Jump_To_Application();
}

那如果我現(xiàn)在想引導(dǎo)啟動地址在0x80080000的應(yīng)用程序,是否只要更改#ApplicationAddress0x80080000這句就好?上面那串代碼就不需要更改了吧?

我還是想理解了上面的那串代碼到底是為什么?希望香版能仔細(xì)幫我解釋下,(當(dāng)我白癡好了,呵呵)!

答:

1.可以,只要不影響功能就行
2.比較好的解決方法,先讀一頁出來到RAM,擦掉這一頁Flash,在RAM中修改相應(yīng)的Bytes,再將整頁寫回去?!∫话愕慕鉀Q方法,后面不足一個WORD/DWORD的補(bǔ)0xff或0x00,補(bǔ)齊一個WORD或DWORD

3.ApplicationAddress對應(yīng)著你的應(yīng)用程序"stm32f10x_vector.c"這個文件中的__vector_table
*(__IOuint32_t*)ApplicationAddress與__vector_table[0]是一樣的
*(__IOuint32_t*)(ApplicationAddress+4)與__vector_table[1]是一樣的
__vector_table[0]是應(yīng)用程序棧的頂
__vector_table[1]是應(yīng)用程序的啟動地址
這里有討論過
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1600156&bbs_page_no=3&bbs_id=3020

(X&0x2FFE0000)==0x20000000意思是說X是不是在0x20000000與0x2001FFFF之間,即棧頂是不是在以0x20000000開始的128K

的范圍內(nèi),這里便是STM32的RAM區(qū)域,雖然現(xiàn)在最大的只有64k

如果你的bootloader只能啟動0x08003000的應(yīng)用程序,那么你寫一個起始地址在0x08008000的程序他將不能啟動
你要寫一個在0x080003000的啟動程序來啟動0x08008000的應(yīng)用程序,或者把0x08008000前八字節(jié)的內(nèi)容放到0x08003000中

4.是的,買回來的可以直接寫,出廠時芯片的Flash都沒有設(shè)置保護(hù)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉