缺點(diǎn):有些情況下會(huì)導(dǎo)致數(shù)據(jù)丟失(可能返回?cái)?shù)據(jù)中0x0d、0a本身為有效數(shù)據(jù))
適用:約定協(xié)議的數(shù)據(jù)幀(發(fā)送數(shù)據(jù)的設(shè)備必須以相應(yīng)的約定字節(jié)作為一次數(shù)據(jù)結(jié)束)
void USART1_IRQHandler(void) //串口中斷服務(wù)程序(函數(shù))
{
u8 Res; //定義Res,用于Res =USART_ReceiveData(USART1);中存儲(chǔ)串口1發(fā)送的數(shù)據(jù)(這里的數(shù)據(jù)按位發(fā)送)
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結(jié)尾)
{
Res =USART_ReceiveData(USART1); //讀取接收到的數(shù)據(jù)
if((USART_RX_STA&0x8000)==0)//接收未完成 1000 0000 0000 0000
//判斷USART_RX_STA的第一位是否為0,這時(shí)因?yàn)閁SART_RX_STA的初始值為0,所以我們進(jìn)入if(USART_RX_STA&0x4000)。
{
if(USART_RX_STA&0x4000)//接收到了0x0d 0100 0000 0000 0000
//判斷USART_RX_STA的第二位是否為1,所以我們進(jìn)入else //還沒(méi)收到0X0D。
{
if(Res!=0x0a)USART_RX_STA=0;//接收錯(cuò)誤,重新開(kāi)始
else USART_RX_STA|=0x8000; //接收完成了
}
else //還沒(méi)收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;//再次判斷這次接收到的是不是0x0d,判斷了Res是否0x0d, 即Res是否為回車,這里如果串口有輸入數(shù)據(jù)的話明顯可以判斷的,所以我們進(jìn)入下面的else.
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; // 0011 1111 1111 1111
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數(shù)據(jù)錯(cuò)誤,重新開(kāi)始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS
OSIntExit();
#endif
}
OSIntEnter()和OSIntExit()兩者必須成對(duì)出現(xiàn)。
進(jìn)入中斷時(shí)調(diào)用OSIntEnter(),退出中斷時(shí)調(diào)用OSIntExit()。
OSIntEnter 是進(jìn)?中斷服務(wù)函數(shù),?來(lái)記錄中斷嵌套層數(shù)(OSIntNesting增加 1);
OSIntEnter()應(yīng)該在中斷關(guān)閉后調(diào)用,所以函數(shù)里面沒(méi)有使用OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL(),如此在調(diào)用OSIntEnter()前需關(guān)閉中斷。
OSIntExit():所有中斷結(jié)束后進(jìn)行任務(wù)調(diào)度,使系統(tǒng)更加實(shí)時(shí)。
OSIntExit 是退出中斷服務(wù)函數(shù),該函數(shù)可能觸發(fā)?次任務(wù)切換(當(dāng) OSIntNesting==0&&調(diào)度器未上鎖&&就緒表最?優(yōu)先級(jí)任務(wù) != 被中斷的任務(wù)優(yōu)先級(jí)時(shí)),否則繼續(xù)返回原來(lái)的任務(wù)執(zhí)?代碼(如果 OSIntNesting 不為 0,則減 1)。
OS_Sched():uCOS進(jìn)行任務(wù)調(diào)度,不在中斷調(diào)用。
OSIntNesting:統(tǒng)計(jì)中斷嵌套數(shù),最多255。在OSIntExit()和OS_Sched()中都有判別。
OS_ENTER_CRITICAL():保存中斷狀態(tài),關(guān)中斷。uCOS將無(wú)法再執(zhí)行任務(wù)調(diào)度,硬件中斷也被屏蔽。
void OSIntEnter (void)
{
if (OSRunning == OS_TRUE) {
if (OSIntNesting < 255u) {
OSIntNesting++; /* Increment ISR nesting level */
}
}
}
這個(gè)函數(shù)的作用是對(duì)全局變量OSIntNesting增1,OSIntNesting為中斷嵌套深度。
void OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
if (OSRunning == OS_TRUE) {
OS_ENTER_CRITICAL();
if (OSIntNesting > 0u) { /* Prevent OSIntNesting from wrapping */
OSIntNesting--;
}
if (OSIntNesting == 0u) { /* Reschedule only if all ISRs complete ... */
if (OSLockNesting == 0u) { /* ... and not locked. */
OS_SchedNew();
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
#if OS_TASK_PROFILE_EN > 0u
OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
#endif
OSCtxSwCtr++; /* Keep track of the number of ctx switches */
OSIntCtxSw(); /* Perform interrupt level ctx switch */
}
}
}
OS_EXIT_CRITICAL();
}
}
函數(shù)的前面部分對(duì)OSIntNesting減1,剛好與OSIntEnter() 相對(duì)應(yīng);后面部分則進(jìn)行任務(wù)調(diào)度。
總結(jié):任何中斷服務(wù)函數(shù),我們都應(yīng)該加上 OSIntEnter 和 OSIntExit 函數(shù),UCOSII 是?個(gè)可剝奪型的內(nèi)核,中斷服務(wù)?程序運(yùn)?之后,系統(tǒng)會(huì)根據(jù)情況進(jìn)??次任務(wù)調(diào)度去運(yùn)?優(yōu)先級(jí)別最?的就緒任務(wù),?并不?定接著運(yùn)?被中斷的任務(wù)!
#if...#endif是C++中的條件編譯預(yù)處理命令 有兩種格式:
1:#ifdef 標(biāo)示符
程序段1
#else
程序段2
#endif
表示:如果標(biāo)示符已經(jīng)被#define命令定義過(guò),則編譯程序段1,否則編譯程序段2。期中else部分可以沒(méi)有。
2:#if 表達(dá)式
程序段1
#else
程序段2
#endif
表示:如果表達(dá)式為真,則編譯程序段1,否則編譯程序段2.
if((USART_RX_STA&0x8000)==0) //0x8000,即二進(jìn)制1000 0000 0000 0000,與變量USART_RX_STA,按位與(&),并與0比較,作用是判斷USART_RX_STA數(shù)值第16位是否為0。
USART_RX_STA&0x8000有兩種可能:
第一種1××× ×××× ×××× ××××&1000 0000 0000 0000=1000 0000 0000 0000
第二種0××× ×××× ×××× ××××&1000 0000 0000 0000=0000 0000 0000 0000
由此可以判斷USART_RX_STA第16位是否為0
USART_RX_STA的作用,USART_RX_STA一共有16位,前兩位為標(biāo)記位,后14位記錄了串口發(fā)送的數(shù)的位數(shù)。第一位標(biāo)記位標(biāo)記了Res是否為0x0a,第二位標(biāo)記位標(biāo)記了Res是否為0x0d。
知識(shí)點(diǎn):0x0d是回車的ASCLL碼,0x0a是換行的ASCLL碼
USART_RX_BUF這個(gè)是用來(lái)保存接收到的數(shù)據(jù)的可以看到每次結(jié)束判斷會(huì)有
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA=0; //接收狀態(tài)標(biāo)記
USART_RX_STA的作用就是在全部函數(shù)之間實(shí)現(xiàn)一個(gè)消息傳遞,自己設(shè)置,自己管理,自己識(shí)別。
bit15 bit14 bit13~0
接收完成標(biāo)志0x0a 接收到0X0d標(biāo)志 接收到的有效數(shù)據(jù)個(gè)數(shù)
USART_RX_STA|=0x4000;將第二位狀態(tài)標(biāo)志位置為1;在倒數(shù)第1次循環(huán)中使用USART_RX_STA|=0x8000;將第一位狀態(tài)標(biāo)志位也置為1,;而后串口數(shù)據(jù)接收結(jié)束,所有從串口接收的數(shù)據(jù)保存在USART_RX_BUF[ ]數(shù)組中,串口所發(fā)送的數(shù)據(jù)長(zhǎng)度保存在USART_RX_STA的后14位中。
上一篇:STM32CUBEMX(13)--SPI,W25Q128外部Flash移植
下一篇:總結(jié)STM32控制中常見(jiàn)的PID算法 理解萬(wàn)能的PID算法
推薦閱讀最新更新時(shí)間:2025-04-24 08:27




設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 英飛凌微控制器:以全新實(shí)惠套件和強(qiáng)大開(kāi)發(fā)環(huán)境為開(kāi)發(fā)者提供支持
- iTOP-i.MX6開(kāi)發(fā)板設(shè)備數(shù)驅(qū)動(dòng)Menuconfig的用法
- 迅為IMX6ULL開(kāi)發(fā)板Qt for Android搭建開(kāi)發(fā)環(huán)境
- 迅為i.MX8M mini開(kāi)發(fā)板Windots QT系統(tǒng)開(kāi)發(fā)環(huán)境搭建
- 迅為IMX8MM開(kāi)發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開(kāi)發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開(kāi)發(fā)板支持4G以上文件系統(tǒng)擴(kuò)展
- 迅為IMX8MM開(kāi)發(fā)板Yocto系統(tǒng)設(shè)置開(kāi)機(jī)自啟動(dòng)
- 迅為IMX6Q開(kāi)發(fā)板 Buildroot文件系統(tǒng)mqtt測(cè)試
- ADR5043A 3V 輸出精密微功率可編程電流源的典型應(yīng)用
- Hi3861 核心板
- NCP1729 負(fù)輸入電壓分配器的典型應(yīng)用
- AP8803EV1,基于 AP8803 LED 驅(qū)動(dòng)器的評(píng)估板
- dp-edp
- STC8A8K64D4 LCM_DMA開(kāi)發(fā)板
- LT1076,高性能 DC 至 DC 轉(zhuǎn)換器 Vin=8V-40V
- OP184ESZ-REEL輸出過(guò)載恢復(fù)運(yùn)放測(cè)試電路典型應(yīng)用
- 【訓(xùn)練營(yíng)】調(diào)光氛圍晚安燈
- 具有短路保護(hù)功能的 LT3477IFE 5.5V SEPIC 轉(zhuǎn)換器的典型應(yīng)用電路
- 高通攜手中國(guó)“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動(dòng)艙駕創(chuàng)新升級(jí)
- 工業(yè)市場(chǎng)正在快速回暖,德州儀器如何重塑電力電子市場(chǎng)?
- 特斯拉:美國(guó)交付的Model Y/3電池包已實(shí)現(xiàn)100%美國(guó)生產(chǎn)
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產(chǎn)品
- 強(qiáng)化中國(guó)市場(chǎng)戰(zhàn)略布局,德州儀器正靈活應(yīng)對(duì)全球關(guān)稅挑戰(zhàn)
- Molex莫仕通過(guò)本地合作和創(chuàng)新加強(qiáng)支持中國(guó)汽車行業(yè)
- 貿(mào)澤開(kāi)售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數(shù)字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實(shí)現(xiàn)車載充電器小型化!
- 用上車規(guī)級(jí)UFS 4.0,讓出行變得高效且可靠
- 車載測(cè)試技術(shù)解析:聚焦高帶寬、多通道同步采集與協(xié)議分析
- 賽靈思網(wǎng)絡(luò)通信專題有獎(jiǎng)問(wèn)答
- 找小伙伴們一起去闖 STM32 F7英雄聯(lián)盟設(shè)計(jì)大賽
- 勇闖泰克絕密黑科技實(shí)驗(yàn)室!
- 國(guó)產(chǎn)FPGA安路科技研討會(huì)-北京站 火熱報(bào)名中,參會(huì)贏京東卡!
- 開(kāi)學(xué)季!EEworld下載中心 Cortex主題資源上傳
- 艾睿電子線上研討會(huì):英特爾FPGA深度學(xué)習(xí)加速技術(shù) 7月30日上午10:00-11:30 期待您的蒞臨!
- 力源帶你了解安森美半導(dǎo)體開(kāi)發(fā)神器——高度靈活的物聯(lián)網(wǎng)開(kāi)發(fā)套件( IDK )!看視頻輕松答題享好禮!
- 機(jī)器人可以緩解員工不足的現(xiàn)象嗎
- 新型泡沫噴射機(jī)器人可幫助消防員進(jìn)行遠(yuǎn)程救火
- 誠(chéng)邁科技發(fā)布EX5.0,量“聲”打造音視覺(jué)融合交互體驗(yàn)
- 本田推出全新智能充電解決方案 每年可為用戶節(jié)省475英磅
- 研究人員利用高能X射線繪制性能變化圖 以確定鋰金屬電池失效原因
- 騰訊無(wú)人車“登場(chǎng)”,都裝備了哪些傳感器?
- Grab打贏Uber,監(jiān)管機(jī)構(gòu)介入調(diào)查
- 物聯(lián)網(wǎng)前景大好,RISC-V 處理器架構(gòu)要分一杯羹?
- 百度與小康股份簽署戰(zhàn)略合作,自動(dòng)駕駛汽車啥時(shí)能來(lái)
- 抬一手?Waymo:特斯拉致死案沒(méi)有自動(dòng)駕駛的責(zé)任
- protell技術(shù)大全
- 什么叫云臺(tái)?
- 寶寶秀--女電子工程師的寶寶4
- 5G室內(nèi)基站將發(fā)布,有望每家一個(gè)小基站,顛覆現(xiàn)有家庭上網(wǎng)方式
- 高靈敏度金屬探測(cè)器電路
- 請(qǐng)教開(kāi)機(jī)LOGO出現(xiàn)橫條紋的現(xiàn)象
- 襄樊學(xué)院電子設(shè)計(jì)競(jìng)賽預(yù)測(cè)題
- 競(jìng)賽題目是明天早上出嗎???確定一下!!!!
- 來(lái)看一下我畫的DDR2走線有什么問(wèn)題?!求幫助!??
- 如何考慮音頻模擬信號(hào)經(jīng)過(guò)100m的長(zhǎng)線傳輸后的影響?