国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    5608

    瀏覽量

    130002
  • 串口
    +關注

    關注

    15

    文章

    1619

    瀏覽量

    82838
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67523
  • STM
    STM
    +關注

    關注

    1

    文章

    558

    瀏覽量

    44017

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    單片機低功耗的處理

    什么單片機,在程序上和電路上都是要一些處理才能把功耗控制在比較低的范圍。 程序的處理方法主要有以下幾點: 1、單片機進入睡眠狀態。這個是最基本的,只有睡眠的狀態下,功耗才是最低的。但是要注意的是
    發表于 01-21 08:25

    單片機程序跑飛死機的幾種原因分享

    在使用單片機過程中,經常會出現程序運行一段時間后,不能夠正常相應的情況。一般分為軟件原因和硬件原因,其中硬件原因比較容易查,軟件原因就較為復雜。 軟件導致單片機死機的原因 1、指針異常 指針未
    發表于 01-21 07:34

    MCU單片機串口數據記錄儀方案

    在工業控制、環境監測、物流追蹤等眾多領域,如何可靠、便捷地記錄設備串口數據成為不少工程師關注的焦點。基于MCU單片機串口數據記錄儀方案,正以其高效集成、靈活存儲和簡便操作的特點,成為數據采集與記錄場景中的理想選擇。
    的頭像 發表于 11-27 15:02 ?332次閱讀

    工業設備如何在電磁干擾惡劣環境做到“不死機、不重啟、不亂報”?

    在很多工業現場,工程師最怕遇到的,不是設備壞了,而是設備“沒壞但不聽話”: 運行著的工控突然死機,生產線停擺; 系統莫名重啟,數據丟失; 明明傳感器沒動作,設備卻亂報信號,導致閥門、開關誤動作
    的頭像 發表于 09-29 11:45 ?379次閱讀

    單片機燒錄原理是怎樣的?輝芒微單片機燒錄程序詳細步驟講解

    燒錄(Programming)就是把 .hex/.bin 文件里的機器碼搬運進單片機片內 Flash 的過程。輝芒微(FMD)單片機內部有一塊 自舉 BootROM,上電時會先跑這段程序;如果檢測
    的頭像 發表于 09-17 16:14 ?2341次閱讀
    <b class='flag-5'>單片機</b>燒錄原理是<b class='flag-5'>怎樣</b>的?輝芒微<b class='flag-5'>單片機</b>燒錄程序詳細步驟講解

    單片機用什么封裝

    。深圳市安凱星科技有限公司在為拓邦、朗科、安徽龍多等客戶開發方案時,會根據項目場景精準選擇封裝類型,確保性能與實用性平衡。 常見單片機封裝類型及特點 DIP 封裝:直插式的經典選 DIP(雙列直插封裝)是最基礎的單片機封裝
    的頭像 發表于 08-01 13:47 ?1333次閱讀

    怎么測單片機系統頻率

    單片機系統頻率是指單片機工作時的時鐘頻率,它直接影響單片機的運行速度和處理能力,準確測量系統頻率對單片機應用開發、程序調試和性能優化具有重要意義。測量
    的頭像 發表于 07-25 11:39 ?794次閱讀

    單片機怎么驅動電機?

    在各類自動化設備和智能裝置中,電機是重要的執行部件,而單片機作為控制核心,需要通過特定的方式驅動電機運轉。單片機驅動電機并非直接連接即可,而是要根據電機類型和功率,搭配合適的驅動電路,才能實現穩定
    的頭像 發表于 07-25 09:31 ?917次閱讀

    單片機怎么燒程序

    驟,才能單片機發揮作用。 燒程序前的準備工作 單片機燒程序前,需要做好硬件和軟件兩方面的準備。硬件方面,核心設備包括目標單片機、編程器(或下載器)、電腦以及連接導線。編程器是連接電腦
    的頭像 發表于 07-23 11:47 ?1309次閱讀

    怎樣學會單片機

    想學會單片機其實沒那么復雜,先把心態放平穩,別被那些五花八門的名詞嚇住。一開始就得把 C 語言基礎打扎實,位操作、指針、函數這些概念必須吃透,尤其是指針,單片機里操作寄存器、外設經常要用到,搞不懂
    的頭像 發表于 07-23 10:23 ?658次閱讀
    <b class='flag-5'>怎樣</b>學會<b class='flag-5'>單片機</b>?

    CYT2B93CAE怎樣才能接收特定 ID 的中斷?

    你好,我正在使用 CYT2B93CAE 使用設備配置器 5.3,我選擇 RX 緩沖區來接受特定的 ID(例如,0x020)。然而,問題是我在總線上的所有幀上都收到了中斷,而不僅僅是專用 ID。 當其他所有 ID 均未發生中斷時,我怎樣才能接收特定 ID 的中斷?
    發表于 07-15 07:09

    將CYW20706基于硅的藍牙模塊(CYBT-343151-02)連接到定制板上的MCU,怎樣才能將鏈接配置為未確認數據模式?

    我將 CYW20706 基于硅的藍牙模塊(CYBT-343151-02)連接到定制板上的 MCU。 它在確認數據模式下工作,沒有問題 但是我怎樣才能將鏈接配置為未確認數據模式
    發表于 06-27 08:23

    使用USB轉TTL串口板和ST-LINK調試下載器給STM32單片機下載程序

    本文詳細介紹如何使用ST-LINK/V2和USB轉TTL串口板為STM32單片機下載程序,包括STM32啟動模式、JTAG與SWD接口對比、驅動安裝及官方軟件STM32ST-LINKUtility和FlashLoaderDemonstrator的操作流程。
    的頭像 發表于 06-20 17:26 ?2766次閱讀
    使用USB轉TTL<b class='flag-5'>串口</b>板和ST-LINK調試下載器給STM32<b class='flag-5'>單片機</b>下載程序

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

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

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

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