娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年03月04日(星期二)

正在發(fā)生

2020年03月04日 | STM8開發(fā)記錄二:UART RX空閑中斷和DMA操作

發(fā)布者:chunli 來源: eefocus關(guān)鍵字:STM8  UART  空閑中斷  DMA操作 手機看文章 掃描二維碼
隨時隨地手機看文章

一、用STM8L的時候,沒能在同時讀取Rx中斷和IDLE中斷標志,最后用DMA取數(shù)據(jù),見 (三、DMA實現(xiàn)數(shù)據(jù)拷貝):


1.1 uart配置


void UsartConfig(void)

{

// USART_DeInit(USART1);

 

/* Enable USART clock */  

CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);

 

/* USART pin remap */

SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA, ENABLE);

 

/* Configure USART Tx as alternate function push-pull  (software pull up)*/

GPIO_ExternalPullUpConfig(USART1_Tx_PORT, USART1_Tx_Pin, ENABLE);

 

/* Configure USART Rx as alternate function push-pull  (software pull up)*/

GPIO_ExternalPullUpConfig(USART1_Rx_PORT, USART1_Rx_Pin, ENABLE);

 

/* USART configuration */

USART_Init(USART1, BAUDRATE, USART_WordLength_8b, USART_StopBits_1,

        USART_Parity_No, USART_Mode_Rx_and_TX);

 

 

/* Enable the USART Receive interrupt: this interrupt is generated when the USART*/

USART_ITConfig(USART1 , USART_IT_RXNE, ENABLE);

USART_ITConfig(USART1 , USART_IT_IDLE , ENABLE); //空閑中斷

 

 

//配置ITC 中斷管理

ITC_SetSoftwarePriority(USART1_RX_IRQn, ITC_PriorityLevel_3);

 

//start UART

USART_Cmd(USART1 , ENABLE); //打開串口

 

//解決第一個數(shù)據(jù)發(fā)送失敗的問題

USART_ClearFlag(USART3 , USART_FLAG_TC);

//    USART_ClearFlag(USART3 , USART_FLAG_IDLE);

}


1.2 中斷處理, 不能判斷IDLE中斷:如發(fā)送 AA01數(shù)據(jù)后,不能進入IDLE中斷。但是只開IDLE中斷,發(fā)送完畢會進入IDLE中斷。


/* Enable the USART Receive interrupt: this interrupt is generated when the USART*/

//USART_ITConfig(USART1 , USART_IT_RXNE, ENABLE);        

USART_ITConfig(USART1 , USART_IT_IDLE , ENABLE);        //空閑中斷


INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler, 28)

{

/* In order to detect unexpected events during development,

it is recommended to set a breakpoint on the following instruction.

*/

static U8 BytesPos = 0;

static U8 MessagePos = 0;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //RX interrupt

{

UartApiVar.RXBuffer[MessagePos][BytesPos] = USART_ReceiveData8(USART1);  

printflog("MessagePos = %d, BytesPos = %dnr", MessagePos, BytesPos);

printflog("data_0 = %dnr", UartApiVar.RXBuffer[MessagePos][BytesPos]);

BytesPos++;

}

else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) //IDLE interrupt

{

USART1->SR;//先讀SR

USART1->DR;//再讀DR

printflog("MessagePos = %d, BytesPos = %dnr", MessagePos, BytesPos);

printflog("data_1 = %dnr", UartApiVar.RXBuffer[MessagePos][0]);

if((BytesPos < COMM_IF_UART_RX_BUFFER_LENGTH) && 

(UartApiVar.RXBuffer[MessagePos][0] == 0xAA))

{

if(MessagePos < COMM_IF_UART_RX_MSG_NUM)

{

MessagePos++;

}

else

{

MessagePos = 0;

}

}

BytesPos = 0;

}

}


二、用STM32的時候,可以同時判斷Rx中斷和IDLE中斷:

2.1 uart配置:


void USART3Conf(u32 baudRate, u32 nvicPre, u32 nvicSub)

{

USART_InitTypeDef USART_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能USART1

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //GPIOA時鐘

//USART3_TX   GPIOB.10

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出

GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10

 

//USART3_RX   GPIOB.11初始化

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入

GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10 

 

//  //Usart3 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=nvicPre ;//搶占優(yōu)先級3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = nvicSub; //子優(yōu)先級2

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器

 

//USART3 Configure

USART_InitStructure.USART_BaudRate = baudRate;

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_Rx | USART_Mode_Tx;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART3 , &USART_InitStructure);

//USART3_INT Configure

USART_ITConfig(USART3 , USART_IT_RXNE, ENABLE);

  USART_ITConfig(USART3 , USART_IT_IDLE , ENABLE); //空閑中斷

USART_Cmd(USART3 , ENABLE);//打開串口

USART_ClearFlag(USART3 , USART_FLAG_TC);//解決第一個數(shù)據(jù)發(fā)送失敗的問題

}


2.2中斷處理:

void USART3_IRQHandler(void)

{

static u8 i = 0;

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)

{

UsartBuf[i] = (u8)USART_ReceiveData(USART3);

i++;

/* deliver rx byte */

}

else if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)

{

USART3->SR;//先讀SR

USART3->DR;//再讀DR

 

if(UsartBuf[i -1] == 0x0A)

{

UsartBuf[UART_DATA_LEN -2] = i;

UsartBuf[UART_DATA_LEN -1] = UART_DATA_END_CODE;

}

i = 0;

}

 

if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)

{   

}

}


三、鑒于STM8L沒有能讓RX和IDLE中斷標志同時置位,故采用DMA實現(xiàn)數(shù)據(jù)拷貝。

3.1DMA配置:

/**********************************************************************/

//Description: DmaConfig()   

//Parameters:    //0x5231, 為UART數(shù)據(jù)寄存器地址:USART1_BASE = 0x5230                    

//Return:      

//Date:            quanwu.xu  

/**********************************************************************/

void DmaConfig(void)

{

CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);//打開時鐘,很重要

/* Deinitialize DMA channels */

DMA_GlobalDeInit(); 

DMA_DeInit(DMA1_Channel1);

DMA_DeInit(DMA1_Channel2);

/* DMA channel Rx of USART Configuration */    //該函數(shù)主要要配置好接受的數(shù)組,以及USART的數(shù)據(jù)寄存器地址,數(shù)組大小,以及DMA模式

DMA_Init(DMA1_Channel2, (uint16_t)UartApiVar.RxBuffer, UART_DR_ADDRESS,  

COMM_IF_UART_RX_BUFFER_LENGTH,  DMA_DIR_PeripheralToMemory, DMA_Mode_Normal, 

DMA_MemoryIncMode_Inc, DMA_Priority_High, DMA_MemoryDataSize_Byte); 

 

/* DMA channel Tx of USART Configuration */    //該函數(shù)主要配置發(fā)送數(shù)組,以及USART的數(shù)據(jù)寄存器地址,數(shù)組大小,以及DMA模式

DMA_Init(DMA1_Channel1, (uint16_t)UartApiVar.TxBuffer, UART_DR_ADDRESS, 

COMM_IF_UART_TX_BUFFER_LENGTH,  DMA_DIR_MemoryToPeripheral, DMA_Mode_Normal, 

DMA_MemoryIncMode_Inc, DMA_Priority_Low, DMA_MemoryDataSize_Byte);

 

/* Enable the USART Tx/Rx DMA requests */

USART_DMACmd(USART1, USART_DMAReq_TX, ENABLE);

USART_DMACmd(USART1, USART_DMAReq_RX, ENABLE); 

 

/* Global DMA Enable */

DMA_GlobalCmd(ENABLE); 

 

/* Enable the USART Tx DMA channel */

DMA_Cmd(DMA1_Channel1, ENABLE);

 

/* Enable the USART Rx DMA channel */

DMA_Cmd(DMA1_Channel2, ENABLE); 

}


3.2UART配置,只使能IDLE中斷

/**********************************************************************/

//Description: UsartConfig()   

//Parameters:        

//Return:      

//Date:            quanwu.xu  

/**********************************************************************/

void UsartConfig(void)

{

USART_DeInit(USART1);

 

/* Enable USART clock */  

CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);

 

/* USART pin remap */

SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA, ENABLE);

 

/* Configure USART Tx as alternate function push-pull  (software pull up)*/

GPIO_ExternalPullUpConfig(USART1_Tx_PORT, USART1_Tx_Pin, ENABLE);

 

/* Configure USART Rx as alternate function push-pull  (software pull up)*/

GPIO_ExternalPullUpConfig(USART1_Rx_PORT, USART1_Rx_Pin, ENABLE);

 

/* USART configuration */

USART_Init(USART1, BAUDRATE, USART_WordLength_8b, USART_StopBits_1,

        USART_Parity_No, USART_Mode_Rx_and_TX);

 

/* Enable the USART Receive interrupt: this interrupt is generated when the USART*/

//USART_ITConfig(USART1 , USART_IT_RXNE, ENABLE);

USART_ITConfig(USART1 , USART_IT_IDLE , ENABLE); //空閑中斷

 

 

//配置ITC 中斷管理

ITC_SetSoftwarePriority(USART1_RX_IRQn, ITC_PriorityLevel_3);

 

//start UART

USART_Cmd(USART1 , ENABLE); //打開串口

 

//解決第一個數(shù)據(jù)發(fā)送失敗的問題

USART_ClearFlag(USART3 , USART_FLAG_TC);

}


3.3 UART IDLE中斷處理函數(shù)

 extern void* Memcpy(void* pDest, void* pSrc, U8 Len); 

INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler, 28)

{

/* In order to detect unexpected events during development,

it is recommended to set a breakpoint on the following instruction.

*/

static U8 MessagePos = 0;

U8 DataLen = 0;

 

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //RX interrupt

{

}

       else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) //IDLE interrupt

{

USART1->SR;//先讀SR

USART1->DR;//再讀DR

DataLen = COMM_IF_UART_RX_BUFFER_LENGTH - 

DMA_GetCurrDataCounter(DMA1_Channel2);

 

if(DataLen < COMM_IF_UART_RX_BUFFER_LENGTH)

{

printflog("RxBuffer[0]=%xnr", UartApiVar.RxBuffer[0]);

Memcpy((void*)&UartApiVar.RxMessage[MessagePos], 

(void*)&UartApiVar.RxBuffer, DataLen);

if(++MessagePos == COMM_IF_UART_RX_MSG_NUM)

{

MessagePos = 0;

}

SystemApiVar.UartWakeupFlag = 1;

}

DMA_Cmd(DMA1_Channel2, DISABLE);

DMA_SetCurrDataCounter(DMA1_Channel2, COMM_IF_UART_RX_BUFFER_LENGTH);

DMA_Cmd(DMA1_Channel2, ENABLE);

}  

}


3.4 其他相關(guān)定義和函數(shù)

/*****************************************************************************/

//uart.h

#define UART_DR_ADDRESS        ((uint16_t)0x5231) //UART寄存器地址

 

/*! UART RX Buffer size */

#ifndef COMM_IF_UART_RX_BUFFER

#define COMM_IF_UART_RX_MSG_NUM     4

#define COMM_IF_UART_RX_BUFFER_LENGTH 16u

#endif

 

/*! UART TX Buffer size */

#ifndef COMM_IF_UART_TX_BUFFER

#define COMM_IF_UART_TX_MSG_NUM    4

#define COMM_IF_UART_TX_BUFFER_LENGTH 16u

#endif

 

typedef struct _UartApi

[1] [2]
關(guān)鍵字:STM8  UART  空閑中斷  DMA操作 引用地址:STM8開發(fā)記錄二:UART RX空閑中斷和DMA操作

上一篇:STM32F0兩路AD配置參考
下一篇:STM8L驅(qū)動I2C類型的12864

推薦閱讀

Dediu 還給出了另一張圖,展示了設備在特定季度的退役情況。有趣的是,自 2012 年以來,每隔幾個季度,其平均壽命就有所增長,并在 2017 年初達到了四年整(未來或許更持久)。在深入挖掘蘋果四季度投資者電話會議的數(shù)據(jù)之后,Asymco 分析師 Horace Dediu 發(fā)現(xiàn),一款蘋果設備的平均壽命為 4 年多一點。 這意味著,盡管消費者的典型升級周期為“...
三星、華為、OPPO等眾手機廠商扎堆發(fā)布自家的折疊屏手機計劃。一時間,“折疊屏”這個詞在科技圈火爆起來。然而是否還有人記得,早在幾年前,就有家電廠商發(fā)布了折疊屏的升級版——“可卷曲”電視。  除了手機之外,柔性技術(shù)也在大尺寸屏幕上快速滲透。業(yè)內(nèi)普遍認為,折疊屏手機加可卷曲電視迎來風口,2019年將是柔性顯示爆發(fā)元年。智能手機與智能電視都...
意法半導體新推出的STM32CubeMonitor軟件工具能夠?qū)崟r顯示STM32應用程序運行時的變量,同時讓開發(fā)人員能夠在所選的操作系統(tǒng)環(huán)境(Windows?、Linux或MacOS?)中自定義圖形可視化設置。 STM32CubeMonitor擁有豐富而強大的測試診斷功能,方便開發(fā)者獲取有價值的診斷方案。在軟件的圖形流編輯器中,用戶只要用鼠標拖放項目和功能,即可創(chuàng)建自定義的儀表板,...
1、LTC6802—2介紹LTC6802—2內(nèi)部含有12位的AD轉(zhuǎn)換器,精密電壓基準,高電壓輸入多路轉(zhuǎn)換器和SPI串行接口。每個芯片可以檢測12節(jié)串聯(lián)在一起的電池。同時,芯片還支持串聯(lián)使用,最多可以將16個芯片串聯(lián)在一起使用,即最多可以檢測12x16=192節(jié)電池串聯(lián)組成的電池組。每個AD的轉(zhuǎn)換范同為0~5V,因此每個芯片的檢測串聯(lián)電池組電壓可達60V。另外,LTC6802.2在L...

史海拾趣

問答坊 | AI 解惑

動手做一個測速計、頻率計(含VC源代碼)

設計初衷     在單片機軟硬件開發(fā)中,常常需要測量出電機轉(zhuǎn)速、某個規(guī)則信號的頻率等,買一個頻率計又不劃算,于是打算自己做一個,夠用就行。 一開始打算用單片機,考慮到焊板、編程、燒錄等等工作量,還不如就地取材,使用手頭上的Ea ...…

查看全部問答∨

將每日領芯幣做成一個按鈕

我看到論壇中每日領芯幣那里還得人工加芯幣,不如做成如果當天第一次上論壇可以點擊一下就得到了那樣不就智能點了!…

查看全部問答∨

keil學習(五)

Keil 程序調(diào)試窗口 上一講中我們學習了幾種常用的程序調(diào)試方法,這一講中將介紹 Keil 提供各種窗口如輸出窗口、觀察窗口、存儲器窗口、反匯編窗口、串行窗口等的用途,以及這些窗口的使用 方法,并通過實例介紹這些窗口在調(diào)試中的使用。 一、 ...…

查看全部問答∨

2010年吉林省電子競賽討論

本帖最后由 paulhyde 于 2014-9-15 09:48 編輯 今年我參加了吉林省的電子競賽 哪位大俠能發(fā)表自己對今年比賽的一些看法,可以使題目的分析和預測,如果遇到問題希望各位高手多多指點  …

查看全部問答∨

PC機如何通過智能手機收發(fā)短信

是Smartphone 想做一個類似智能手機工作室的軟件,但是不需要那么復雜,只要能收,發(fā),刪除短信就可以了. 請朋友們給我些意見,我是用過sms.dll來發(fā)短信,但是讀短信就不知道怎么做了.我用的C#…

查看全部問答∨

Wince生成系統(tǒng)時錯誤,請好心人幫下忙~~~~

我是一個做WinCE得新手,用得是Sumsung2410得板子,導入BSP后,生成系統(tǒng)時出現(xiàn)了以下錯誤,在網(wǎng)上搜了半天也不知道到底怎么解決 請高手指點一二,不勝感激 BUILD: [01:0000000696:ERRORE] init.obj : error LNK2001: unresolved external symbo ...…

查看全部問答∨

AME1117穩(wěn)壓管突然爆炸

今天在用MSP430F149進行PWM控制直流電機調(diào)試,電壓7.2V,穩(wěn)壓管ame1117突然冒煙然后就爆炸。電路穩(wěn)定運行了很久,突然出現(xiàn)了這個問題,真是莫名其妙…

查看全部問答∨

USB的時鐘配置

寫STR711程序時,USB的時鐘配置過程遇到以下問題,我用的是4M晶振,并直接連接到HCLK上以下時鐘培植過程中,前兩個在USB枚舉的過程中找不到設備,后兩個時鐘配置是可以成功找到設備.不知道為什么,差別也就在PCLK這塊 ...…

查看全部問答∨

stm32從片內(nèi)SRAM加載/存貯數(shù)據(jù)要4個周期.

                                 數(shù)據(jù)處理性能太打折扣.…

查看全部問答∨

windows mobile 6 遇到問題

1>C:\\Program Files\\Windows Mobile 6 SDK\\PocketPC\\include\\ARMV4I\\winnt.h(2977) : error C2061: 語法錯誤 : 標識符“PCONTEXT”1>C:\\Program Files\\Windows Mobile 6 SDK\\PocketPC\\include\\ARMV4I\\winnt.h(2978) : error C2059: ...…

查看全部問答∨
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 麻栗坡县| 孝感市| 博兴县| 页游| 柳江县| 淄博市| 运城市| 南投市| 探索| 石门县| 那坡县| 亳州市| 隆林| 潍坊市| 静海县| 揭阳市| 文登市| 两当县| 栖霞市| 汝州市| 芒康县| 榆社县| 贵溪市| 定州市| 大埔区| 宁海县| 吉水县| 焦作市| 华安县| 秭归县| 清新县| 平顶山市| 天等县| 武陟县| 汉寿县| 枣强县| 台江县| 西贡区| 高淳县| 呼和浩特市| 南开区|