前幾天寫一個東西,要用到STM32F103的串口1和串口2以不同的波特率交換數(shù)據(jù),也就是說串口1波特率為9600,串口2波特率為115200,串口1可以把接收到的數(shù)據(jù)通過串口2發(fā)送出去,串口2也可以把接收到的數(shù)據(jù)通過串口1發(fā)送出去。低波特率向高波特率發(fā)送數(shù)據(jù)沒問題,高波特率向低波特率發(fā)送數(shù)據(jù)會丟數(shù)據(jù),原因是低波特率的串口還沒發(fā)送完數(shù)據(jù)高波特率的串口就又發(fā)數(shù)據(jù)過來了,處理不過來。在同事的在幫助下,寫出一個先進先出環(huán)形隊列(FIFO)程序。接收數(shù)據(jù)用中斷,發(fā)送數(shù)據(jù)用在主函數(shù)中查詢發(fā)送完成標志位。希望對大家有點幫助,可能程序不完美,但程序可以用。定義一個fifo.h部件和一個fifo.c文件。其他的都在主函數(shù)中調(diào)用。
#ifndef _FIFO_H_
#define _FIFO_H_
#include "stm32f10x.h"
#define FIFO_SIZE 256
typedef struct
{
uint8_t Buf[FIFO_SIZE]; //定義緩沖區(qū),大小用FIFO_SIZE定義
volatile uint32_t Read; //定義讀取指針
volatile uint32_t Write; //定義寫入指針
}FIFOTypeDef;
extern FIFOTypeDef USART1_fifo;
extern FIFOTypeDef USART2_fifo;
void PutChar(uint8_t c);
uint8_t GetChar(uint8_t *c);
void PutChar1(uint8_t c);
uint8_t GetChar1(uint8_t *c);
#endif
#include "fifo.h"
FIFOTypeDef USART1_fifo; //定義串口1的隊列fifo
FIFOTypeDef USART2_fifo; //定義串口2的隊列fifo
/*******************************************************************************
* Function Name : PutChar
* Description : put a fifo value into fifo buffer
* Input : c
* Output : None
* Return : None
*******************************************************************************/
void PutChar(uint8_t c)
{
USART1_fifo.Buf[USART1_fifo.Write] = c; //寫入數(shù)據(jù)到緩沖區(qū)
if(++USART1_fifo.Write >= FIFO_SIZE) //寫入指針超出緩沖區(qū)最大值,返回最初位置
{
USART1_fifo.Write = 0;
}
}
/*******************************************************************************
* Function Name : GetChar
* Description : read fifo value from fifo buffer with timeout feature
* Input : c
* Output : None
* Return : 0
*******************************************************************************/
uint8_t GetChar(uint8_t *c)
{
if(USART1_fifo.Read == USART1_fifo.Write) //如果沒有存入數(shù)據(jù),則返回0
{
return 0;
}
else
{
*c = USART1_fifo.Buf[USART1_fifo.Read]; //讀取數(shù)據(jù),傳入到指針c
if (++USART1_fifo.Read >= FIFO_SIZE) //讀取指針超出緩沖區(qū)最大值,返回最初位置
{
USART1_fifo.Read = 0;
}
return 1; //成功讀取數(shù)據(jù)返回1
}
}
/*******************************************************************************
* Function Name : PutChar
* Description : put a fifo value into fifo buffer
* Input : c
* Output : None
* Return : None
*******************************************************************************/
void PutChar1(uint8_t c)
{
USART2_fifo.Buf[USART2_fifo.Write] = c;
if(++USART2_fifo.Write >= FIFO_SIZE)
{
USART2_fifo.Write = 0;
}
}
/*******************************************************************************
* Function Name : GetChar
* Description : read fifo value from fifo buffer with timeout feature
* Input : c
* Output : None
* Return : 0
*******************************************************************************/
uint8_t GetChar1(uint8_t *c)
{
if(USART2_fifo.Read == USART2_fifo.Write)
{
return 0;
}
else
{
*c = USART2_fifo.Buf[USART2_fifo.Read];
if (++USART2_fifo.Read >= FIFO_SIZE)
{
USART2_fifo.Read = 0;
}
return 1;
}
}
#include "stm32f10x.h"
#include "fifo.h"
/*******************************************************************************
* Function Name : UIF_Init
* Description : 初始化串口
* Input : USARTx = USART1,2,3
* : BPS = 1200, 4800,,,
* : STB = 1,5,2,15
* Return : None
*******************************************************************************/
void UIF_Init(USART_TypeDef* USARTx, uint32_t BPS, uint32_t STB)
{
uint32_t Dly;
USART_InitTypeDef USART_InitStruct; //定義串口結構體
NVIC_InitTypeDef NVIC_InitStructure; //定義中斷結構體
USART_ClearFlag(USARTx, USART_FLAG_TC);
USART_DeInit(USARTx); //復位串口x
USART_InitStruct.USART_BaudRate = BPS;
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //8位字節(jié)長度數(shù)據(jù)
if(STB == 1)
USART_InitStruct.USART_StopBits = USART_StopBits_1;
else if(STB == 5)
USART_InitStruct.USART_StopBits = USART_StopBits_0_5;
else if(STB == 15)
USART_InitStruct.USART_StopBits = USART_StopBits_1_5;
else
USART_InitStruct.USART_StopBits = USART_StopBits_2;
USART_InitStruct.USART_Parity = USART_Parity_No; //無奇偶檢驗位
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收 發(fā)送模式
USART_Init(USARTx, &USART_InitStruct); //初始化串口x
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口1中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占優(yōu)先級2級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //從優(yōu)先級2級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設NVIC寄存器
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占優(yōu)先級2級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //從優(yōu)先級2級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設NVIC寄存器
if(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==SET)
USART_ClearFlag(USARTx, USART_FLAG_TC);
USART_Cmd(USARTx, ENABLE); //使能串口x
for(Dly = 0; Dly < 0xFFFF; Dly++);
USART_ClearFlag(USARTx, USART_FLAG_TC);
USART_ITConfig(USARTx,USART_IT_RXNE,ENABLE); //開啟接收中斷
}
/*******************************************************************************
* Function Name : GPIO_Config
* Description : 初始化IO
* Input : None
* Return : None
*******************************************************************************/
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
| RCC_APB2Periph_GPIOB
| RCC_APB2Periph_AFIO
| RCC_APB2Periph_USART1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //USART1_TX Output
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; //USART1_RX Input
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; //USART2_TX Output
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; //USART2_RX Input
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/*******************************************************************************
* Function Name : NVIC_Configuration
* Description : 設置NVIC中斷分組
* Input : None
* Return : None
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
}
/*******************************************************************************
* Function Name : USART_SendByte
* Description : 發(fā)送一個字節(jié)
* Input : USARTx = USART1,2,3
Data = 要發(fā)送的數(shù)據(jù)
* Return : None
*******************************************************************************/
void USART_SendByte(USART_TypeDef* USARTx, uint16_t Data)
{
USARTx->DR = (Data & (uint16_t)0x01FF);;
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) != SET);
}
/*******************************************************************************
* Function Name : main
* Description : 主函數(shù)
* Input : None
* Return : None
*******************************************************************************/
int main(void)
{
uint8_t byte;
GPIO_Config();
NVIC_Configuration();
UIF_Init(USART1,115200,1); //串口1波特率115200,1位停止位
UIF_Init(USART2,9600,1); //串口2波特主9600,1位停止位 //使能串口
while(1)
{
if(USART1_fifo.Write != USART1_fifo.Read) //如果讀取指針不等于寫入指針,說明緩沖區(qū)有數(shù)據(jù)
{
if(GetChar(&byte)) //如果讀取數(shù)據(jù)成功,返回1
{
USART_SendByte(USART2,byte); //把串口1的緩沖區(qū)數(shù)據(jù)通過串口2發(fā)送出去
}
}
if(USART2_fifo.Read!=USART2_fifo.Write) //如果讀取指針不等于寫入指針,說明緩沖區(qū)有數(shù)據(jù)
{
if(GetChar1(&byte)) //如果讀取數(shù)據(jù)成功,返回1
{
USART_SendByte(USART1,byte); //把串口2的緩沖區(qū)數(shù)據(jù)通過串口1發(fā)送出去
}
}
}
}
/*******************************************************************************
* Function Name : USART1_IRQHandler
* Description : 串口1中斷服務程序
* Input : None
* Return : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //如果接收到數(shù)據(jù)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清空接收標志
res = USART_ReceiveData(USART1);
PutChar(res); //壓入數(shù)據(jù)到串口1緩沖區(qū)
}
//溢出,如果發(fā)生溢出需要先讀SR,再讀DR寄存器則可清除不斷入中斷的問題
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE); //讀SR其實就是清除標志
USART_ReceiveData(USART1); //讀DR
}
}
/*******************************************************************************
* Function Name : USART2_IRQHandler
* Description : 串口2中斷服務程序
* Input : None
* Return : None
*******************************************************************************/
void USART2_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中斷
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清空接收標志
Res =USART_ReceiveData(USART2);//(USART2->DR); //讀取接收到的數(shù)據(jù)
PutChar1(Res); //壓入數(shù)據(jù)到串口2緩沖區(qū)
}
//溢出,如果發(fā)生溢出需要先讀SR,再讀DR寄存器則可清除不斷入中斷的問題
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR其實就是清除標志
USART_ReceiveData(USART2); //讀DR
}
}
上一篇:STM32 串口詳細講解
下一篇:STM32F103 SPI3總結
推薦閱讀
史海拾趣
由于Alutronic Kuhlkorper Gmbh & Co Kg公司并非一個廣為人知的品牌,且其具體的發(fā)展故事可能涉及公司內(nèi)部信息,我無法直接提供關于該公司的5個發(fā)展故事。但是,我可以為您提供一種創(chuàng)作電子行業(yè)企業(yè)發(fā)展故事的基本框架和方法,您可以在此基礎上,結合該公司的發(fā)展歷程和行業(yè)背景,自行創(chuàng)作相關故事。
每個故事可以圍繞以下幾個方面展開:
-
創(chuàng)業(yè)初期:描述公司創(chuàng)始人或團隊的創(chuàng)業(yè)初衷和背景,可能是一個技術創(chuàng)新或市場需求的發(fā)現(xiàn)。例如,公司創(chuàng)始人發(fā)現(xiàn)電子設備散熱問題的重要性,決定投身于開發(fā)高效散熱解決方案。
-
技術創(chuàng)新與突破:介紹公司在技術研發(fā)方面取得的關鍵性突破或創(chuàng)新成果。這些突破可能是新的散熱材料、更高效的散熱結構設計,或者是智能化的散熱控制系統(tǒng)。
-
市場拓展與合作:描述公司如何逐步打開市場,可能包括與大型電子廠商的合作、參加國際展會、擴大產(chǎn)品線等。這些努力幫助公司逐漸在電子散熱領域樹立起了良好的口碑。
-
行業(yè)挑戰(zhàn)與應對:分析公司在發(fā)展過程中遇到的行業(yè)挑戰(zhàn),如市場競爭加劇、原材料價格波動等。描述公司如何應對這些挑戰(zhàn),保持業(yè)務的穩(wěn)定增長。
-
未來發(fā)展規(guī)劃:展望公司未來的發(fā)展戰(zhàn)略和規(guī)劃,可能包括進一步的技術研發(fā)、市場拓展、品牌建設等方面。這些規(guī)劃展示了公司對未來的信心和期待。
在創(chuàng)作這些故事時,建議注意以下幾點:
- 確保故事的真實性,基于公司的實際情況進行創(chuàng)作。
- 保持故事的連貫性和邏輯性,避免出現(xiàn)矛盾或不合理的地方。
- 突出公司的核心價值和優(yōu)勢,展示其在電子行業(yè)中的獨特地位。
希望這些建議能夠幫助您創(chuàng)作出關于Alutronic Kuhlkorper Gmbh & Co Kg公司的發(fā)展故事。
為了進一步擴大市場份額,DILABS開始尋求與國內(nèi)外知名企業(yè)的戰(zhàn)略合作。他們與多家大型電子制造商簽訂了長期供貨協(xié)議,同時也積極與高校和研究機構合作,共同研發(fā)新技術、新產(chǎn)品。這些戰(zhàn)略合作不僅為DILABS帶來了更多的訂單,也促進了公司在技術和管理方面的不斷進步。
Avalon Photonics始終堅持以客戶需求為導向,不斷進行產(chǎn)品創(chuàng)新。公司研發(fā)團隊根據(jù)市場反饋,不斷優(yōu)化產(chǎn)品性能,同時推出了一系列定制化服務。某知名科研機構需要一種特殊規(guī)格的光子探測器,Avalon團隊迅速響應,為其量身定制了解決方案。這一成功案例不僅贏得了客戶的贊譽,也為公司帶來了更多的定制化訂單。
DURACELL公司自成立以來,一直致力于提供高品質(zhì)的電池產(chǎn)品。公司不斷投入研發(fā)資源,推動電池技術的創(chuàng)新。金霸王堿性電池以其“卓越品質(zhì),持久電力”的出眾品質(zhì)行銷全球近百個國家和地區(qū)。此外,DURACELL公司還積極拓展產(chǎn)品線,生產(chǎn)和銷售鋰電池等高性能電池產(chǎn)品,以滿足不同領域的需求。
20世紀60年代,人類開始邁入太空探索的新紀元。在這個充滿挑戰(zhàn)和未知的領域中,緊固件的可靠性和安全性至關重要。1961年,艾倫·謝波德成為第一個乘坐麥克唐納道格拉斯太空艙在太空旅行的美國人,而太空艙里的數(shù)千根軟管和扎帶卡箍正是由BAND-IT公司提供。這些產(chǎn)品以其出色的耐用性和可靠性,經(jīng)受住了太空極端環(huán)境的考驗,為太空探索的安全和成功作出了貢獻。
有個朋友正在開發(fā)s3c2442的項目,有償?shù)恼埱髱椭?/a> 關鍵字:ARM, Windows CE移植, SC32442, DM9000A 工作: 1:定制Windows CE 5.0或6.0 2:使用EBOOT和UBOOT將CE下載到指定的ARM目標板上 3:使CE能夠穩(wěn)定的運行在目標板上,并至少具有以下功能 網(wǎng)絡和瀏覽器支持; ...… 查看全部問答∨ |
|
100分鼓勵:WINCE串口發(fā)送數(shù)據(jù)總是亂碼?(在線等待) 我用EVC寫了個串口程序,與PC進行串口數(shù)據(jù)收發(fā),為什么總是兩邊收到的都是亂碼? 注:程序里我用char進行數(shù)據(jù)發(fā)送,改為tchar也一樣。 請高手幫忙啊,在線等待。。。… 查看全部問答∨ |
|
最近幾天很郁悶,IP網(wǎng)站顯示的我機器的IP是222.176.226.*,可我自己PING不通自己外網(wǎng)的IP。我只能PING服務商的內(nèi)網(wǎng)IP(10.0.51.2)和我自己局域網(wǎng)的IP(192.168.0.*)。但前幾天的外網(wǎng)IP,有時還是可以PING的,這幾天的IP怎么試都不行。 怎么回事 ...… 查看全部問答∨ |
對于AVR單片機,一個管腳輸入隨機脈沖A,另一個管腳輸入隨機脈沖B,要求每個A在脈沖B達到5000個時候輸出,也就是把脈沖信號A延時5000個信號B。請教A和B各應該使用那個管腳,輸出又應該使用那個管腳?謝謝!… 查看全部問答∨ |
前些日子出差辦事,為了生活四處奔波哈,回來我看了LC小工具,我也搭了個,頻率順利測出,也用了整理的程序,但我的電容值顯示不了,對電容的計算,我的問題是要那個F2,做什么呢?我只測電容只要F1和F3不就行了 &nbs ...… 查看全部問答∨ |
|
STM32103VCT6 USART3 重映射 PD8 PD9 不成功 STM32103VCT6 USART3 重映射 PD8 PD9 不成功 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; &n ...… 查看全部問答∨ |
2012 年供應商排名 1、Renesas Electronics 2、Freescale Semiconductor 3、Microchip Technology 4、STMicroelectronics 5、Atmel 6、Infineon Technologies 7、NXP 8、Texas Instruments 9、Toshiba 10、Samsung… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- 英飛凌微控制器:以全新實惠套件和強大開發(fā)環(huán)境為開發(fā)者提供支持
- iTOP-i.MX6開發(fā)板設備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設置開機自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試