女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單片機怎樣才能不死機之串口Overrun

FPGA之家 ? 來源:開源博客 ? 作者: TopSemic ? 2021-05-07 17:35 ? 次閱讀

閑言少敘,先上Code,大家看一下下面這段代碼有沒有問題?

// Note: USART demo code runs on STM32F030#include “main.h”

static __IO uint32_t TimingDelay;

RCC_ClocksTypeDef RCC_Clocks;

uint8_t uart_buffer[100];

// GPIO Configurationvoid GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1); // Tx PA9 GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1); // Rx PA10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // USART1_TX | USART1_RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1; GPIO_Init(GPIOA, &GPIO_InitStructure); }

// USART Configurationvoid USART_Configuration(void){ USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; //USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1,&USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1,ENABLE); }

// Interrupt Configurationvoid NVIC_Configuration(void){ NVIC_InitTypeDef NVIC_InitStructure; // USART1 interrupt Config NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);}

// USART1 Interrupt Handlervoid USART1_IRQHandler (void){ static uint8_t i = 0;

if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET) {// Clear Receive Data Register Not Empty Flag USART_ClearITPendingBit(USART1,USART_IT_RXNE); uart_buffer[i++] = USART_ReceiveData(USART1); if(i == 100) i = 0; }}

int main(void){ static uint8_t ch;

// Init a 1ms timer interrupt, for Delay function implementation. RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); // Enable USART1 and GPIOA clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); GPIO_Configuration(); USART_Configuration(); NVIC_Configuration(); ch = ‘A’; while(1) { Delay(50); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, ch); ch++; }

}

/*** @brief Inserts a delay time.* @param nTime: specifies the delay time length, in 1 ms.* @retval None*/void Delay(__IO uint32_t nTime){ TimingDelay = nTime; while(TimingDelay != 0);}

/*** @brief Decrements the TimingDelay variable.* @param None* @retval None*/void TimingDelay_Decrement(void){ if(TimingDelay != 0x00) { TimingDelay--; }}

它是可以在 STM32F030 上調試通過的串口收發測試程序,發送采用延時循環,接收采用中斷,接收到的數據存入緩沖區。

有很多比較認真的實戰派的同學估計會下載到板子上跑一跑,它確實能跑通,看起來也沒什么問題。很多教程甚至官方的代碼都是類似的處理方法。

但這確實有點兒像陷馬坑,看似一馬平川,跑著跑著突然連馬帶人 kucha 一聲掉坑里了。這還真不是開玩笑,某知名樓宇自控公司的產品就在安裝到客戶現場后,經常莫名奇妙的死機。查來查去,查去查來,才發現問題。可是解決起來不容易啊,一個一個的去拆開,更新代碼,想想都。。。

所以同學們不要輕視任何一段代碼啊!

這段代碼的問題是,如果接收數據之間間隔時間較長,可以正常收數據。但是如果對方發送數據非常快,或者偶爾在自己還沒從串口接收寄存器取走數據的時候突然又來了數據,會導致 Overrun 標志位的置位。這個標志位一置,串口基本上就罷工了。所以,在程序中一定要有對異常情況的處理。甚至覺得不會發生的異常也不要置之不理。(想一想為什么要填充Flash的空白區域?在正常情況下代碼永遠不會跑到空白區域是吧。)

對串口異常的處理可以參考下面中斷處理函數代碼。當然也可以在主程序中定時處理,以便在中斷失效的情況下還能恢復。

// USART1 Interrupt Handlervoid USART1_IRQHandler (void){ static uint8_t i = 0;

if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) {// Clear Overrun Error Flag USART_ClearFlag(USART1, USART_FLAG_ORE); } else if(USART_GetFlagStatus(USART1, USART_FLAG_NE) != RESET) {// Clear Noise Error Flag USART_ClearFlag(USART1, USART_FLAG_NE); } else if(USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET) {// Clear Framing Error Flag USART_ClearFlag(USART1, USART_FLAG_FE); } else if(USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET) {// Clear Parity Error Flag USART_ClearFlag(USART1, USART_FLAG_PE); } else if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET) {// Clear Receive Data Register Not Empty Flag USART_ClearITPendingBit(USART1,USART_IT_RXNE); uart_buffer[i++] = USART_ReceiveData(USART1); if(i == 100) i = 0; }}

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5422

    瀏覽量

    123403
  • 串口
    +關注

    關注

    14

    文章

    1586

    瀏覽量

    78689
  • 函數
    +關注

    關注

    3

    文章

    4371

    瀏覽量

    64223
  • STM
    STM
    +關注

    關注

    1

    文章

    557

    瀏覽量

    43013

原文標題:單片機(MCU)如何才能不死機之串口Overrun

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    瑞薩Cortext-M85內核RA8系列單片機串口輸出實現方法

    串口是最常見的通信方式之一,也是單片機調試最常見的通信接口,也是現在的單片機必備的通信接口,目前(2024-05)最新、最強的Cortext-M85內核的RA8系列單片機也不例外。
    的頭像 發表于 03-21 09:58 ?903次閱讀
    瑞薩Cortext-M85內核RA8系列<b class='flag-5'>單片機</b>的<b class='flag-5'>串口</b>輸出實現方法

    晶振受到電磁干擾對單片機的影響

    單片機可以正常運行的一個因素就是晶振的穩定性。在工作過程中,晶振可能會受到電磁干擾的影響,導致單片機發生故障,甚至出現死機的情況。
    的頭像 發表于 03-20 18:01 ?539次閱讀

    怎樣才能通過matlab實現DLP4500的連接與控制?

    做結構光的,希望通過一個界面完成相機與投影儀的同步投影與拍攝模式,相機部分連接控制模塊做的差不多了,想問一下怎樣才能通過matlab實現DLP4500的連接與控制?
    發表于 03-03 06:52

    怎樣才能更好享受到8K視頻帶來的優勢

    觀看4K現在已經非常普遍了,隨著對音視頻要求的不斷提高,各大設備也在著力發展8K視頻。本期我們將從觀看8K的工具入手,來聊聊怎樣才能更好享受到8K視頻帶來的優勢。
    的頭像 發表于 02-21 09:30 ?605次閱讀

    用TLV2541進行AD采樣,怎么樣才能使采樣為準確的1K?

    我現在想用TLV2541進行AD采樣,我們要求采樣頻率為1K,我現在不知道怎么樣才能使采樣為準確的1K。用單片機的SPI接口怎樣才能實現?謝謝
    發表于 02-10 07:58

    請問怎樣才能讀到ADS127L11芯片所宣稱的800KSPS的速度?

    技術參數里面提到這個adc的速度可以達到800K甚至1MSPS,我們用stm32H743單片機讀取,單片機主頻能達到400兆,SPI接口能到100兆, 但還是只能達到400ksps的傳輸速度
    發表于 11-22 07:52

    在應TPA3110D2時,上電有POP聲怎樣才能消除?

    在應TPA3110D2時,上電有POP聲.怎樣才能消除?
    發表于 11-01 07:50

    通過簡單的電阻電容組合怎樣才能把25K方波變成正弦?

    通過簡單的電阻電容組合怎樣才能把25K方波變成正弦呢。加了濾波電路后方波的上升沿變緩了,可是下降沿基本沒有變化。怎樣才能把下降沿也變緩呢
    發表于 10-22 06:02

    什么原因會導致單片機系統死機

    ______________________________________ 什么原因會導致單片機系統死機
    發表于 10-16 22:32

    TPA3118D2怎樣才能不使用靜音功能,通電就能輸出音頻?

    如圖,12腳MUTE接一個100K電阻到地,不使用靜音功能,這樣使用是否正確。焊接好后通電沒聲音輸出,但手碰一下MUTE腳就有輸出了,再碰一下又沒聲音了,就像是按了MUTE按鈕。手觸摸一次就等于加了一次高電平。不知是什么問題,怎樣才能不使用靜音功能,通電就能輸出音頻。
    發表于 09-29 08:38

    單片機WiFi模塊怎樣連接手機APP

    連接 :將WiFi模塊與單片機物理連接。 編程單片機 :編寫代碼使單片機能通過WiFi模塊與互聯網通信。 創建服務器 :在單片機上創建一個小型服務器,以便手機APP可以與
    的頭像 發表于 09-10 15:31 ?3282次閱讀

    怎樣才能避免LM3886損壞?

    損壞。 A、過流損壞:雖有電流監測,可能是響應不夠快; B、過壓損壞:負載上殘留的工頻電壓過高損壞。請問怎樣才能避免LM3886損壞,新的D類放大器是否更能勝任些功能需求,可推薦一下方案。謝謝
    發表于 09-06 06:31

    單片機燒錄程序的串口線怎么連接

    單片機開發過程中,燒錄程序是一項重要的工作。而燒錄程序通常需要使用串口線來實現。本文將介紹單片機燒錄程序的串口線連接方法,包括串口線的類型
    的頭像 發表于 09-02 09:50 ?3675次閱讀

    怎樣才能在調用deep_sleep_set_option(4)后手動打開RF?

    請教下,怎樣才能在調用deep_sleep_set_option(4)后 手動打開RF,而不是要通過其他deep_sleep_set_option()來打開RF,我想在自己想要發射廣播包的時候打開RF,主要其他模式太耗電
    發表于 07-22 07:26

    請問ESP8266 IR紅外例程怎樣才能不發載波?

    有款產品需要沒有載波的信號,請教例程怎樣修改才能不用載波,謝謝!
    發表于 07-10 07:54