哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)怎樣才能不死機(jī)之串口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 上調(diào)試通過的串口收發(fā)測(cè)試程序,發(fā)送采用延時(shí)循環(huán),接收采用中斷,接收到的數(shù)據(jù)存入緩沖區(qū)。

有很多比較認(rèn)真的實(shí)戰(zhàn)派的同學(xué)估計(jì)會(huì)下載到板子上跑一跑,它確實(shí)能跑通,看起來也沒什么問題。很多教程甚至官方的代碼都是類似的處理方法。

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

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

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

對(duì)串口異常的處理可以參考下面中斷處理函數(shù)代碼。當(dāng)然也可以在主程序中定時(shí)處理,以便在中斷失效的情況下還能恢復(fù)。

// 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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5619

    瀏覽量

    130421
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1627

    瀏覽量

    83348
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67848
  • STM
    STM
    +關(guān)注

    關(guān)注

    1

    文章

    559

    瀏覽量

    44095

原文標(biāo)題:?jiǎn)纹瑱C(jī)(MCU)如何才能不死機(jī)之串口Overrun

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    MCU單片機(jī)外擴(kuò)的國產(chǎn)串口QSPI SRAM

    在嵌入式系統(tǒng)設(shè)計(jì)中,MCU單片機(jī)本身的內(nèi)部RAM往往有限,當(dāng)遇到數(shù)據(jù)采集、音頻處理、圖形顯示或網(wǎng)絡(luò)協(xié)議棧等需要大量臨時(shí)存儲(chǔ)的場(chǎng)景時(shí),外擴(kuò)RAM就成了剛需。傳統(tǒng)的并行SRAM雖然速度快,但占用引腳多
    的頭像 發(fā)表于 04-15 17:29 ?433次閱讀

    Debian 69未檢測(cè)到Intenso NVME,怎樣才能讓它工作?

    嘿。我剛剛設(shè)法更新到 2.5.0 并啟動(dòng)了 Debian 版本 69。 但未檢測(cè)到我的新 NVME SSD它在閃爍,但也許我必須做其他事情然后將其內(nèi)置? 我怎樣才能讓它工作? 謝謝
    發(fā)表于 03-25 06:38

    51單片機(jī)驅(qū)動(dòng)HMI串口屏,串口屏的下載方式

    串口串口屏是一個(gè)集成了單片機(jī)的屏幕模塊,采用的是TTL串口協(xié)議,可以直接通過對(duì)應(yīng)指令控制屏幕, 本文采用的串口屏是T0系列的基本型,目的
    的頭像 發(fā)表于 03-17 11:44 ?315次閱讀
    51<b class='flag-5'>單片機(jī)</b>驅(qū)動(dòng)HMI<b class='flag-5'>串口</b>屏,<b class='flag-5'>串口</b>屏的下載方式

    單片機(jī)低功耗的處理

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

    單片機(jī)程序跑飛死機(jī)的幾種原因分享

    在使用單片機(jī)過程中,經(jīng)常會(huì)出現(xiàn)程序運(yùn)行一段時(shí)間后,不能夠正常相應(yīng)的情況。一般分為軟件原因和硬件原因,其中硬件原因比較容易查,軟件原因就較為復(fù)雜。 軟件導(dǎo)致單片機(jī)死機(jī)的原因 1、指針異常 指針未
    發(fā)表于 01-21 07:34

    MCU單片機(jī)串口數(shù)據(jù)記錄儀方案

    在工業(yè)控制、環(huán)境監(jiān)測(cè)、物流追蹤等眾多領(lǐng)域,如何可靠、便捷地記錄設(shè)備串口數(shù)據(jù)成為不少工程師關(guān)注的焦點(diǎn)?;贛CU單片機(jī)串口數(shù)據(jù)記錄儀方案,正以其高效集成、靈活存儲(chǔ)和簡(jiǎn)便操作的特點(diǎn),成為數(shù)據(jù)采集與記錄場(chǎng)景中的理想選擇。
    的頭像 發(fā)表于 11-27 15:02 ?495次閱讀

    單片機(jī)燒錄原理是怎樣的?輝芒微單片機(jī)燒錄程序詳細(xì)步驟講解

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

    單片機(jī)用什么封裝

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

    怎么測(cè)單片機(jī)系統(tǒng)頻率

    單片機(jī)系統(tǒng)頻率是指單片機(jī)工作時(shí)的時(shí)鐘頻率,它直接影響單片機(jī)的運(yùn)行速度和處理能力,準(zhǔn)確測(cè)量系統(tǒng)頻率對(duì)單片機(jī)應(yīng)用開發(fā)、程序調(diào)試和性能優(yōu)化具有重要意義。測(cè)量
    的頭像 發(fā)表于 07-25 11:39 ?1075次閱讀

    單片機(jī)怎么驅(qū)動(dòng)電機(jī)?

    在各類自動(dòng)化設(shè)備和智能裝置中,電機(jī)是重要的執(zhí)行部件,而單片機(jī)作為控制核心,需要通過特定的方式驅(qū)動(dòng)電機(jī)運(yùn)轉(zhuǎn)。單片機(jī)驅(qū)動(dòng)電機(jī)并非直接連接即可,而是要根據(jù)電機(jī)類型和功率,搭配合適的驅(qū)動(dòng)電路,才能實(shí)現(xiàn)穩(wěn)定
    的頭像 發(fā)表于 07-25 09:31 ?1301次閱讀

    單片機(jī)怎么燒程序

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

    怎樣學(xué)會(huì)單片機(jī)?

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

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

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

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

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

    使用USB轉(zhuǎn)TTL串口板和ST-LINK調(diào)試下載器給STM32單片機(jī)下載程序

    本文詳細(xì)介紹如何使用ST-LINK/V2和USB轉(zhuǎn)TTL串口板為STM32單片機(jī)下載程序,包括STM32啟動(dòng)模式、JTAG與SWD接口對(duì)比、驅(qū)動(dòng)安裝及官方軟件STM32ST-LINKUtility和FlashLoaderDemonstrator的操作流程。
    的頭像 發(fā)表于 06-20 17:26 ?3232次閱讀
    使用USB轉(zhuǎn)TTL<b class='flag-5'>串口</b>板和ST-LINK調(diào)試下載器給STM32<b class='flag-5'>單片機(jī)</b>下載程序
    成武县| 古丈县| 昆明市| 天祝| 微博| 岫岩| 石嘴山市| 尉犁县| 固原市| 六盘水市| 康定县| 武穴市| 新乡市| 拜泉县| 霸州市| 会宁县| 思茅市| 许昌市| 汤原县| 石嘴山市| 通江县| 江西省| 新绛县| 施甸县| 宁津县| 北京市| 广东省| 土默特左旗| 乌审旗| 苍溪县| 右玉县| 万源市| 左权县| 五华县| 历史| 上林县| 壶关县| 祁东县| 峨边| 德化县| 麻栗坡县|