一、用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
上一篇:STM32F0兩路AD配置參考
下一篇:STM8L驅(qū)動I2C類型的12864
推薦閱讀
史海拾趣
Fine Products Microelectronics Corp公司發(fā)展故事(虛構(gòu))
故事一:技術(shù)創(chuàng)新引領市場
Fine Products Microelectronics Corp(簡稱FPMC)自創(chuàng)立之初便致力于半導體技術(shù)的創(chuàng)新。在上世紀90年代,當半導體行業(yè)還普遍使用傳統(tǒng)光刻技術(shù)時,F(xiàn)PMC的研發(fā)團隊率先提出了步進式光刻機(Wafer Stepper)的概念。這一創(chuàng)新極大地提高了芯片制造的精度和效率,使得芯片特征尺寸得以大幅縮小。盡管初期面臨技術(shù)難度大、市場接受度低等挑戰(zhàn),但FPMC憑借堅持不懈的努力,最終成功研發(fā)出并量產(chǎn)了步進式光刻機,迅速在半導體制造領域占據(jù)了領先地位。
故事二:與巨頭的合作與競爭
在FPMC的成長過程中,與行業(yè)內(nèi)巨頭的合作與競爭是不可或缺的一部分。特別是在21世紀初,F(xiàn)PMC與IBM、TI等知名企業(yè)建立了合作關(guān)系,共同推進半導體技術(shù)的研發(fā)和應用。然而,這種合作并非一帆風順,F(xiàn)PMC在某些關(guān)鍵技術(shù)上堅持自主研發(fā),與IBM的電子束光刻(e-beam)技術(shù)產(chǎn)生了競爭。盡管這種競爭給FPMC帶來了一定的壓力,但也促使公司不斷加大研發(fā)投入,提升技術(shù)實力,最終形成了自己獨特的競爭優(yōu)勢。
故事三:石墨烯電極技術(shù)的突破
近年來,隨著二維材料研究的興起,F(xiàn)PMC緊跟科技前沿,成功研發(fā)出了石墨烯輔助金屬電極轉(zhuǎn)印技術(shù)。這一技術(shù)利用石墨烯與金屬間較弱的范德華作用力,實現(xiàn)了金屬電極陣列在二維溝道材料上的無損轉(zhuǎn)移。該技術(shù)不僅提高了電極的制備精度和效率,還降低了制造成本,為二維芯片的應用開辟了新的路徑。FPMC的這一創(chuàng)新成果迅速獲得了業(yè)界的關(guān)注和認可,進一步鞏固了公司在半導體材料領域的領先地位。
故事四:物聯(lián)網(wǎng)時代的布局
隨著物聯(lián)網(wǎng)技術(shù)的快速發(fā)展,F(xiàn)PMC敏銳地捕捉到了這一市場機遇。公司及時調(diào)整戰(zhàn)略方向,加大了對物聯(lián)網(wǎng)相關(guān)產(chǎn)品的研發(fā)力度。通過與多家物聯(lián)網(wǎng)企業(yè)和研究機構(gòu)的合作,F(xiàn)PMC成功推出了一系列高性能、低功耗的物聯(lián)網(wǎng)芯片和解決方案。這些產(chǎn)品廣泛應用于智能家居、智慧城市、工業(yè)控制等領域,為物聯(lián)網(wǎng)的普及和發(fā)展提供了強有力的支持。
故事五:綠色可持續(xù)發(fā)展
在追求技術(shù)創(chuàng)新和市場拓展的同時,F(xiàn)PMC始終不忘企業(yè)的社會責任。公司積極響應全球綠色可持續(xù)發(fā)展的號召,致力于研發(fā)環(huán)保型半導體產(chǎn)品和制造工藝。通過采用先進的節(jié)能減排技術(shù)和循環(huán)利用材料等手段,F(xiàn)PMC不僅降低了自身的生產(chǎn)成本和能耗水平,還為推動半導體行業(yè)的綠色可持續(xù)發(fā)展做出了積極貢獻。此外,公司還積極參與社會公益活動,為構(gòu)建和諧社會貢獻自己的一份力量。
1964年,超霸電池的前身——金山工業(yè)集團在中國香港地區(qū)成立,最初專注于生產(chǎn)9伏干電池,以滿足當時收音機等電子產(chǎn)品的需求。這一時期的超霸電池以其穩(wěn)定的質(zhì)量和可靠的性能迅速在市場上站穩(wěn)腳跟。隨著電子產(chǎn)品的普及,金山工業(yè)敏銳地捕捉到市場機遇,逐步擴大生產(chǎn)規(guī)模,為后續(xù)的發(fā)展奠定了堅實基礎。
安普康(AMPCOM)自創(chuàng)立之初,就致力于將品牌推向國際市場。隨著公司規(guī)模的擴大和產(chǎn)品線的豐富,安普康開始實施全球商標注冊戰(zhàn)略。從2011年首次申請安普康AMPCOM商標,到隨后的幾年內(nèi)在泰國、日本、新加坡、老撾、澳大利亞等多個國家成功注冊,安普康的品牌影響力逐漸擴大。這一過程中,公司不僅面臨著不同國家法律法規(guī)的挑戰(zhàn),還需應對文化差異和市場需求的差異。然而,憑借專業(yè)的團隊和精準的市場定位,安普康成功地將品牌推向了全球舞臺。
近年來,隨著工業(yè)互聯(lián)網(wǎng)和智能制造技術(shù)的快速發(fā)展,Hokuriku Electric也加快了數(shù)字化轉(zhuǎn)型的步伐。公司引入先進的自動化設備和智能管理系統(tǒng),實現(xiàn)了生產(chǎn)過程的智能化和精細化管理。通過數(shù)字化轉(zhuǎn)型,Hokuriku Electric不僅提高了生產(chǎn)效率和產(chǎn)品質(zhì)量,還降低了運營成本和市場風險。同時,公司還積極探索智能制造的新模式和新應用,為電子行業(yè)的未來發(fā)展貢獻智慧和力量。
請注意,以上故事均為基于Hokuriku Electric公司背景和行業(yè)趨勢的虛構(gòu)內(nèi)容,旨在展示公司可能的發(fā)展路徑和成就。實際情況可能有所不同。
博眾電氣自創(chuàng)立之初,就明確了自己的市場定位和發(fā)展方向。作為一家致力于成為一站式電子物料供應企業(yè)的公司,博眾電氣從一開始就注重技術(shù)研發(fā)和產(chǎn)品質(zhì)量。公司創(chuàng)始人憑借對電子行業(yè)的深刻理解和敏銳的市場洞察力,為博眾電氣奠定了堅實的基礎。
在初創(chuàng)期,博眾電氣通過引進國內(nèi)外先進的生產(chǎn)設備和檢測設備,不斷提升產(chǎn)品的性能和質(zhì)量。同時,公司還注重與國內(nèi)外知名同行的技術(shù)交流和協(xié)作,積極吸收和借鑒先進的生產(chǎn)和管理經(jīng)驗。這些舉措使得博眾電氣在激烈的市場競爭中逐漸脫穎而出。
作為一家負責任的企業(yè),Embedded Planet公司一直將綠色環(huán)保理念融入產(chǎn)品設計和生產(chǎn)過程中。公司積極采用環(huán)保材料和技術(shù),努力降低產(chǎn)品對環(huán)境的負面影響。同時,公司還倡導員工參與環(huán)保活動,共同為地球的可持續(xù)發(fā)展貢獻力量。這些環(huán)保實踐不僅提升了公司的社會形象,也為公司贏得了更多客戶的信任和支持。
設計初衷 在單片機軟硬件開發(fā)中,常常需要測量出電機轉(zhuǎn)速、某個規(guī)則信號的頻率等,買一個頻率計又不劃算,于是打算自己做一個,夠用就行。 一開始打算用單片機,考慮到焊板、編程、燒錄等等工作量,還不如就地取材,使用手頭上的Ea ...… 查看全部問答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 09:48 編輯 今年我參加了吉林省的電子競賽 哪位大俠能發(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 ...… 查看全部問答∨ |
今天在用MSP430F149進行PWM控制直流電機調(diào)試,電壓7.2V,穩(wěn)壓管ame1117突然冒煙然后就爆炸。電路穩(wěn)定運行了很久,突然出現(xiàn)了這個問題,真是莫名其妙… 查看全部問答∨ |
|
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ā)板 精華推薦
- 宇稱電子發(fā)布8通道多閾值ASIC芯片:重構(gòu)激光雷達產(chǎn)業(yè)格局,開啟“ASIC平權(quán)”時代
- 三星SDI與LGES將在美國設置磷酸鐵鋰電池生產(chǎn)線
- 福特汽車公司申請新專利 或?qū)⒋钶d車輛噪音控制系統(tǒng)
- 福特汽車申請新專利 福特Pro Power Onboard或新增安全模式
- 華為乾崑如何驅(qū)動中國智能汽車產(chǎn)業(yè)共創(chuàng)?
- 激光雷達VS純視覺,小米小鵬隔空交鋒
- 機器人實現(xiàn)空中變形 飛行與地面行駛模式無縫切換
- -35℃直充技術(shù)顛覆革新,邢東鋰電引領低溫電池進入“直充時代”!
- 硬核解讀:人形機器人跑“半馬”映射出哪些產(chǎn)業(yè)問題
- V2X 連接器產(chǎn)品綜述