STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序
生活随笔
收集整理的這篇文章主要介紹了
STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
STM32?USART1?USART2?UASRT3?UART4?UART5串口通信測試程序
(2014-02-11 20:09:19) 轉(zhuǎn)載▼| | 分類:?單片機(jī)、嵌入系統(tǒng) |
#include "stm32f10x_lib.h" #include"stdio.h"
#define uchar unsigned char #define uint unsigned int #define ulong unsigned long
uint TimingDelay;
#define YES ?1 #define NO ??0
#define ?COM1_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_1) // GPIOC->BSRR=0xfd //&=0xfd ?//USART1 發(fā)送使能 #define ?COM1_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_1) // GPIOC->BSRR=0x02 //|=0x02 ?//USART1 禁止發(fā)送
#define ?COM2_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_2) // GPIOC->BSRR=0xfd //&=0xfd ?//USART2 發(fā)送使能 #define ?COM2_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_2)?
#define ?COM3_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_3) // GPIOC->BSRR=0xfd //&=0xfd ?//USART3 發(fā)送使能 #define ?COM3_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_3) // GPIOC->BSRR=0x02 //|=0x02 ?//USART3 禁止發(fā)送
#define ?COM4_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0xfd //&=0xfd ?//UART4 發(fā)送使能 #define ?COM4_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0x02 //|=0x02 ?//UART4 禁止發(fā)送
//UART5 上行串口接收中斷數(shù)據(jù)定義 uchar ComSynFlag; ?????????//=YES同步建立,UART0內(nèi)部私有 uchar ComReceiveCounter; ??//接收字節(jié)計(jì)數(shù),UART0內(nèi)部私有 uchar ComReceiveData[24]; ?//接收緩沖,UART0內(nèi)部私有
GPIO_InitTypeDef GPIO_InitStructure; ErrorStatus HSEStartUpStatus; TIM_TimeBaseInitTypeDef ?TIM_TimeBaseStructure; TIM_OCInitTypeDef ?TIM_OCInitStructure;
u16 Status; //定時(shí)器累加
void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void); void TIM2_Configuration(void); void UART5_Configuration(void); void SysTick_Configuration(void) ?; void Com3TxChar(vu8);
vu16 CCR1_Val = 0x0E10; ?//360 ?50Hz ?20ms vu16 CCR2_Val = 0x0048; ?//7200 10hz ????100ms ??? vu16 CCR3_Val = 0x7530; ?//30000 10Hz vu16 CCR4_Val = 0x1000;?
u16 capture1 = 0; u16 capture2 = 0; u16 capture3 = 0; u16 capture4 = 0;
int cnt1,cnt2,nt2=50;
//UART1 下行串口接收中斷數(shù)據(jù)定義 #define C1_LEN ???300 ?????//緩沖區(qū)長度 uint ?Com1RecCnt; ?????????//COM1接收字節(jié)計(jì)數(shù) uchar Com1RecDat[C1_LEN]; ?//COM1接收緩沖 uchar Com1AnsDat[24]; uint ?Com1AnsCnt;
uint ?Com2RecCnt; ?????????//COM2接收字節(jié)計(jì)數(shù) uchar Com2RecDat[C1_LEN]; ?//COM2接收緩沖 uchar Com2AnsDat[24]; uint ?Com2AnsCnt;?
uint ?Com3RecCnt; ?????????//COM3接收字節(jié)計(jì)數(shù) uchar Com3RecDat[C1_LEN]; ?//COM3接收緩沖 uchar Com3AnsDat[24]; uint ?Com3AnsCnt;
uint ?Com4RecCnt; ?????????//COM4接收字節(jié)計(jì)數(shù) uchar Com4RecDat[C1_LEN]; ?//COM4接收緩沖 uchar Com4AnsDat[24]; uint ?Com4AnsCnt;
uint ?Time20msCnt; ??//20ms定時(shí)器 uint ?T20msCnt; ?????//20ms定時(shí)器 uint ?T1sCnt; ???????//1s定時(shí)器
uchar RunCnt; ????//RUN LED閃光頻率參數(shù) //=======================================================================
void RCC_Configuration() { ??ErrorStatus HSEStartUpStatus; //定義外部高速晶振啟動(dòng)狀態(tài)枚舉變量 ??RCC_DeInit(); //復(fù)位RCC外部寄存器到默認(rèn)值 ??RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振 ??HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速時(shí)鐘準(zhǔn)備好
??if(HSEStartUpStatus==SUCCESS) ??{ //外部高速時(shí)鐘已經(jīng)準(zhǔn)備好 ????FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預(yù)讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法,位置:RCC初始化子函數(shù)里面,時(shí)鐘起振之后 ????FLASH_SetLatency(FLASH_Latency_2); //FLASH時(shí)序延遲幾個(gè)周期,等待總線同步操作。推薦按照單片機(jī)系統(tǒng)運(yùn)行頻率,0—24MHz時(shí),取Latency=0;24—48MHz時(shí),取Latency=1;48~72MHz時(shí),取Latency=2。
????RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)==系統(tǒng)時(shí)鐘/1 ????RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(高速)(PCLK2)==系統(tǒng)時(shí)鐘/1? ????RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(低速)(PCLK1)==系統(tǒng)時(shí)鐘/2 //注:AHB主要負(fù)責(zé)外部存儲(chǔ)器時(shí)鐘。APB2負(fù)責(zé)AD,I/O,高級(jí)TIM,串口1。APB1負(fù)責(zé)DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
????RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL時(shí)鐘==(外部高速晶體時(shí)鐘/1)* 9 ==72MHz ????RCC_PLLCmd(ENABLE); //使能PLL時(shí)鐘 ???while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL時(shí)鐘就緒 ???RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統(tǒng)時(shí)鐘==PLL時(shí)鐘 ???while(RCC_GetSYSCLKSource()!=0x08); //等待系統(tǒng)時(shí)鐘源的啟動(dòng) }
//==============以下為開啟外設(shè)時(shí)鐘的操作============================// // RCC_AHBPeriphClockCmd (ABP2設(shè)備1 | ABP2設(shè)備2 , ENABLE); //啟動(dòng)AHB設(shè)備 // RCC_APB2PeriphClockCmd(ABP2設(shè)備1 | ABP2設(shè)備2 , ENABLE); //啟動(dòng)ABP2設(shè)備 // RCC_APB1PeriphClockCmd(ABP2設(shè)備1 | ABP2設(shè)備2 , ENABLE); //啟動(dòng)ABP1設(shè)備
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); //打開APB2外設(shè)
????RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB ?|RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); ???RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5 |RCC_APB1Periph_UART4 |RCC_APB1Periph_USART2 |RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2,ENABLE); }? //==============================================================
void SysTick_Configuration(void) ????????//延時(shí)函數(shù)初始化 { ? ??SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); ??NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0); ??SysTick_SetReload(72000); ??SysTick_ITConfig(ENABLE); } //================================= void delay(u32 nTime) {? ??SysTick_CounterCmd(SysTick_Counter_Enable); ? ??TimingDelay = nTime; ??while(TimingDelay != 0); ? ??SysTick_CounterCmd(SysTick_Counter_Disable); ? ??SysTick_CounterCmd(SysTick_Counter_Clear); } //==================================
void TimingDelay_Decrement(void) { ??if (TimingDelay != 0x00) ??{? ????TimingDelay--; ??} }
void Delay(vu32 nCount) { ??for(; nCount != 0; nCount--); } //============================================
void NVIC_Configuration(void ) { ??NVIC_InitTypeDef NVIC_InitStructure; //定義一個(gè)中斷結(jié)構(gòu)體
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //設(shè)置中斷向量表的起始地址為0x08000000 ??NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //設(shè)置NVIC優(yōu)先級(jí)分組,方式。 //注:一共16個(gè)優(yōu)先級(jí),分為搶占式和響應(yīng)式。兩種優(yōu)先級(jí)所占的數(shù)量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4, //分別代表搶占優(yōu)先級(jí)有1、2、4、8、16個(gè)和響應(yīng)優(yōu)先級(jí)有16、8、4、2、1個(gè)。規(guī)定兩種優(yōu)先級(jí)的數(shù)量后,所有的中斷級(jí)別必須在其中選擇, //搶占級(jí)別高的會(huì)打斷其他中斷優(yōu)先執(zhí)行,而響應(yīng)級(jí)別高的會(huì)在其他中斷執(zhí)行完優(yōu)先執(zhí)行。
??NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQChannel; //通道設(shè)置為串口5中斷 ??NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中斷響應(yīng)優(yōu)先級(jí)0 ??NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打開中斷 ??NVIC_Init(&NVIC_InitStructure); //初始化 ? ??//定時(shí)器2中斷
???NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure); }? void GPIO_Configuration(void) { ????GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化結(jié)構(gòu)體
??? //--------將UART5 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ????GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //管腳位置定義,標(biāo)號(hào)可以是NONE、ALL、0至15。 ????GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //輸出速度50MHz ????GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //推挽輸出模式 Out_PP ????GPIO_Init(GPIOC,&GPIO_InitStructure); //E組GPIO初始化
//--------將USART1,USART2 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 |GPIO_Pin_2 | GPIO_Pin_0 | GPIO_Pin_6; ???GPIO_Init(GPIOA, &GPIO_InitStructure);
//--------將USART3 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------將UART4 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOC, &GPIO_InitStructure);
//--------將UART5 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ???GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //管腳位置定義 //輸入模式下配置輸出速度無意義 //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; //輸出速度2MHz? ???GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ???GPIO_Init(GPIOD,&GPIO_InitStructure); //C組GPIO初始化
//--------將USART1 USART2 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 |GPIO_Pin_3; ???GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ???GPIO_Init(GPIOA, &GPIO_InitStructure);
//--------將USART3 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ??GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; ??GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ??GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------將UART4 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ??GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; ??GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ??GPIO_Init(GPIOC, &GPIO_InitStructure); } //============================================================== void TIM2_Configuration(void) {? ??TIM_TimeBaseInitTypeDef ?TIM_TimeBaseStructure;//定時(shí)器初始化結(jié)構(gòu) ??//TIM_ICInitTypeDef TIM_ICInitStructure; ????????//通道輸入初始化結(jié)構(gòu) ??? ??? ???RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); ??TIM_TimeBaseStructure.TIM_Period = 0xffff; ????????? ??TIM_TimeBaseStructure.TIM_Prescaler = 499; ?????????//時(shí)鐘分頻 ??TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; ????//時(shí)鐘分割 ??TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ? ??TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //基本初始化 ? ??TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; ??TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ??TIM_OCInitStructure.TIM_Pulse = CCR1_Val; ??TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; ??TIM_OC1Init(TIM2, &TIM_OCInitStructure); ??TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); ? ??TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ??TIM_OCInitStructure.TIM_Pulse = CCR2_Val; ??TIM_OC2Init(TIM2, &TIM_OCInitStructure); ??TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable); ??//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ??//TIM_OCInitStructure.TIM_Pulse = 255; ??//TIM_OC4Init(TIM2, &TIM_OCInitStructure); ?? ? ??TIM_Cmd(TIM2, ENABLE);
??TIM_ClearFlag(TIM2, TIM_FLAG_Update); ????????????????? ??TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); ???????//清除TIM2等待中斷更新中斷標(biāo)志位
? ??TIM_ITConfig(TIM2, TIM_IT_CC1 |TIM_IT_CC2 , ENABLE); }
//================================================?? ?void Com5TxChar( vu8 i ) ?{ ??USART_SendData(UART5,i); //回發(fā)給PC ? ??while(USART_GetFlagStatus(UART5, USART_FLAG_TXE)==RESET); ?} //---------------------?? ??void Com5TxStr( vu8 *pt, vu8 length ) ??{ ??? ???vu8 i;
????for( i=0;i ????{
???????Com5TxChar(*pt++);
????}
???// delay(10);??? ??} ?? ?//---------------------------- ?void Com1TxChar( vu8 i ) ?{ ???USART_SendData(USART1,(u8) i); //回發(fā)給PC ? ???while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET) ???{ ????} ????// ?return i;? ?}? ??void Com1TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com1TxChar(*pt++); ??} ??// ??delay(10); ? ??} ?? ? ?void Com2TxChar( vu8 i ) ?{ ??USART_SendData(USART2,(u8) i); //回發(fā)給PC ? ?while(USART_GetFlagStatus(USART2, USART_FLAG_TXE)==RESET) ?{ ?} ??// ?return i; ? ?} ?? ? ??void Com2TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com2TxChar(*pt++); ??} ??// ??delay(10); ? ??} ?? ? ?void Com3TxChar( vu8 i ) ?{ ??USART_SendData(USART3,(u8) i); //回發(fā)給PC ? ?while(USART_GetFlagStatus(USART3, USART_FLAG_TXE)==RESET) ?{ ?} ??// ?return i; ? ?} ?? ? ??void Com3TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com3TxChar(*pt++); ??} ??// ??delay(10); ? ??} ?? ? ?void Com4TxChar( vu8 i ) ?{ ??USART_SendData(UART4,(u8) i); //回發(fā)給PC ?? ?while(USART_GetFlagStatus(UART4, USART_FLAG_TXE)==RESET) ?{ ?} ??// ?return i; ? ?} ?? ? ??void Com4TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com4TxChar(*pt++); ??} ??// ??delay(10); ? ??}
?? ??void TIM2_IRQHandler(void) { ??????vu8 i; ? ????if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) ?????{ ??????TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); ?cnt1++; ?cnt2++; ?if(cnt1>=500) ?{ // ??polling=1; ??cnt1=0; ?} ?if(cnt2>=nt2) //RUNLED,WDI ???{? ?GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0))); ? ?if(Alert_flag==1) ??{ ??GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_6))); ? ??} ? ?cnt2=0; ??? ???}
?Time20msCnt++; ?// 秒級(jí)硬件延時(shí) if( Time20msCnt>=50 && T1sCnt ){ Time20msCnt=0; T1sCnt--; } if(T20msCnt){ ?//20ms單位延時(shí) T20msCnt--; }
? ??????capture1 = TIM_GetCapture1(TIM2); ?TIM_SetCompare1(TIM2, capture1 + CCR1_Val ); ?????}
????????? ??if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) ?? ?????{ ??????TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
? ?capture2 = TIM_GetCapture2(TIM2); ?TIM_SetCompare2(TIM2, capture2 + CCR2_Val ); ?????}??????? } //********串口COM5配置*****************************
void UART5_Configuration(void) { ???USART_InitTypeDef USART_InitStructure; //串口設(shè)置恢復(fù)默認(rèn)參數(shù)
???USART_InitStructure.USART_BaudRate = 115200; //波特率115200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止字節(jié) ???USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗(yàn) ???USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無流控制 ???USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //打開Rx接收和Tx發(fā)送功能 ???//USART_Init(USART1, &USART_InitStructure); ???USART_Init(UART5, &USART_InitStructure); //初始化 ???// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); ???// USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
???USART_ITConfig(UART5, ?USART_IT_RXNE, ENABLE); // 若接收數(shù)據(jù)寄存器滿,則產(chǎn)生中斷 ????//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
????// USART_ITConfig(UART5, USART_IT_TXE, ENABLE);
????USART_Cmd(UART5, ENABLE); //啟動(dòng)串口? ????//USART_Cmd(USART1, ENABLE);?
//-----如下語句解決第1個(gè)字節(jié)無法正確發(fā)送出去的問題-----//? ????USART_ClearFlag(UART5, USART_FLAG_TC); // 清標(biāo)志 ???//USART_ClearFlag(USART1, USART_FLAG_TC); } //************串口COM1~COM44配置*********************************
void USART_Configuration(void) { ???USART_InitTypeDef USART_InitStructure; //串口設(shè)置恢復(fù)默認(rèn)參數(shù)
???USART_InitStructure.USART_BaudRate = 1200; //波特率1200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止字節(jié) ???USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗(yàn) ???USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無流控制 ???USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //打開Rx接收和Tx發(fā)送功能 ???USART_Init(USART1, &USART_InitStructure); ???USART_Init(USART2, &USART_InitStructure); ???USART_Init(USART3, &USART_InitStructure); ???USART_Init(UART4 , &USART_InitStructure); ????????????????? ???USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 若接收數(shù)據(jù)寄存器滿,則產(chǎn)生中斷 ???USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); ???USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); ???USART_ITConfig(UART4 , USART_IT_RXNE, ENABLE);
???USART_Cmd(USART1, ENABLE); //啟動(dòng)串口 ???USART_Cmd(USART2, ENABLE); ???USART_Cmd(USART3, ENABLE); ???USART_Cmd(UART4, ENABLE);
??//-----如下語句解決第1個(gè)字節(jié)無法正確發(fā)送出去的問題-----//? ???USART_ClearFlag(USART1, USART_FLAG_TC);// 清標(biāo)志 ???USART_ClearFlag(USART2, USART_FLAG_TC); ???USART_ClearFlag(USART3, USART_FLAG_TC); ???USART_ClearFlag(UART4 , USART_FLAG_TC); } //**********??串口中斷函數(shù)??******************** void UART5_IRQHandler(void) { ???uchar x,y,z; ???uint checksum1,checksum2; ???if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ??{ ????x=USART_ReceiveData(UART5); ???}? ??Com5TxChar(x); } //------------------------------------------------
void USART1_IRQHandler(void) { ??if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ???{ ??????Com1RecDat[Com1RecCnt]=USART_ReceiveData(USART1);? ????}? ??Com1RecCnt++; ??Com1RecCnt%=C1_LEN;
??Com1TxChar(USART_ReceiveData(USART1)); } //----------------------------------------------
void USART2_IRQHandler(void) { ???if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ???{ ??????Com2RecDat[Com2RecCnt]=USART_ReceiveData(USART2);? ????}? ???Com2RecCnt++; ???Com2RecCnt%=C1_LEN; ???Com2TxChar(USART_ReceiveData(USART2)); } //-------------------------------------------------
void USART3_IRQHandler(void) { ??if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ??{ ?????Com3RecDat[Com3RecCnt]=USART_ReceiveData(USART3);? ???}? ???Com3RecCnt++; ???Com3RecCnt%=C1_LEN; ???Com3TxChar(USART_ReceiveData(USART3)); } //----------------------------------------------------
void UART4_IRQHandler(void) { ??if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ??{ ?????Com4RecDat[Com4RecCnt]=USART_ReceiveData(UART4);? ??}? ???Com4RecCnt++; ???Com4RecCnt%=C1_LEN; ???Com4TxChar(USART_ReceiveData(UART4)); } //*****************主函數(shù)************************ int main(void) { ?u8 ld[69]=0; ?u8 i;
?RCC_Configuration(); ?GPIO_Configuration(); ?NVIC_Configuration(); ?UART5_Configuration(); ?USART_Configuration(); ?TIM2_Configuration(); ?SysTick_Configuration();
?for(i=0;i<69;i++) ?{ ??ld[i]=i; ?} ?Com1TxStr(ld,69); ?Com2TxStr(ld,69); ?Com3TxStr(ld,69); ?Com4TxStr(ld,69); ?Com5TxStr(ld,69); ?while(1) ???{ ?????}
STM32?USART1?USART2?UASRT3?UART4?UART5串口通信測試程序
(2014-02-11 20:09:19) 轉(zhuǎn)載▼| | 分類:?單片機(jī)、嵌入系統(tǒng) |
#include "stm32f10x_lib.h" #include"stdio.h"
#define uchar unsigned char #define uint unsigned int #define ulong unsigned long
uint TimingDelay;
#define YES ?1 #define NO ??0
#define ?COM1_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_1) // GPIOC->BSRR=0xfd //&=0xfd ?//USART1 發(fā)送使能 #define ?COM1_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_1) // GPIOC->BSRR=0x02 //|=0x02 ?//USART1 禁止發(fā)送
#define ?COM2_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_2) // GPIOC->BSRR=0xfd //&=0xfd ?//USART2 發(fā)送使能 #define ?COM2_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_2)?
#define ?COM3_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_3) // GPIOC->BSRR=0xfd //&=0xfd ?//USART3 發(fā)送使能 #define ?COM3_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_3) // GPIOC->BSRR=0x02 //|=0x02 ?//USART3 禁止發(fā)送
#define ?COM4_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0xfd //&=0xfd ?//UART4 發(fā)送使能 #define ?COM4_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0x02 //|=0x02 ?//UART4 禁止發(fā)送
//UART5 上行串口接收中斷數(shù)據(jù)定義 uchar ComSynFlag; ?????????//=YES同步建立,UART0內(nèi)部私有 uchar ComReceiveCounter; ??//接收字節(jié)計(jì)數(shù),UART0內(nèi)部私有 uchar ComReceiveData[24]; ?//接收緩沖,UART0內(nèi)部私有
GPIO_InitTypeDef GPIO_InitStructure; ErrorStatus HSEStartUpStatus; TIM_TimeBaseInitTypeDef ?TIM_TimeBaseStructure; TIM_OCInitTypeDef ?TIM_OCInitStructure;
u16 Status; //定時(shí)器累加
void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void); void TIM2_Configuration(void); void UART5_Configuration(void); void SysTick_Configuration(void) ?; void Com3TxChar(vu8);
vu16 CCR1_Val = 0x0E10; ?//360 ?50Hz ?20ms vu16 CCR2_Val = 0x0048; ?//7200 10hz ????100ms ??? vu16 CCR3_Val = 0x7530; ?//30000 10Hz vu16 CCR4_Val = 0x1000;?
u16 capture1 = 0; u16 capture2 = 0; u16 capture3 = 0; u16 capture4 = 0;
int cnt1,cnt2,nt2=50;
//UART1 下行串口接收中斷數(shù)據(jù)定義 #define C1_LEN ???300 ?????//緩沖區(qū)長度 uint ?Com1RecCnt; ?????????//COM1接收字節(jié)計(jì)數(shù) uchar Com1RecDat[C1_LEN]; ?//COM1接收緩沖 uchar Com1AnsDat[24]; uint ?Com1AnsCnt;
uint ?Com2RecCnt; ?????????//COM2接收字節(jié)計(jì)數(shù) uchar Com2RecDat[C1_LEN]; ?//COM2接收緩沖 uchar Com2AnsDat[24]; uint ?Com2AnsCnt;?
uint ?Com3RecCnt; ?????????//COM3接收字節(jié)計(jì)數(shù) uchar Com3RecDat[C1_LEN]; ?//COM3接收緩沖 uchar Com3AnsDat[24]; uint ?Com3AnsCnt;
uint ?Com4RecCnt; ?????????//COM4接收字節(jié)計(jì)數(shù) uchar Com4RecDat[C1_LEN]; ?//COM4接收緩沖 uchar Com4AnsDat[24]; uint ?Com4AnsCnt;
uint ?Time20msCnt; ??//20ms定時(shí)器 uint ?T20msCnt; ?????//20ms定時(shí)器 uint ?T1sCnt; ???????//1s定時(shí)器
uchar RunCnt; ????//RUN LED閃光頻率參數(shù) //=======================================================================
void RCC_Configuration() { ??ErrorStatus HSEStartUpStatus; //定義外部高速晶振啟動(dòng)狀態(tài)枚舉變量 ??RCC_DeInit(); //復(fù)位RCC外部寄存器到默認(rèn)值 ??RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振 ??HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速時(shí)鐘準(zhǔn)備好
??if(HSEStartUpStatus==SUCCESS) ??{ //外部高速時(shí)鐘已經(jīng)準(zhǔn)備好 ????FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預(yù)讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法,位置:RCC初始化子函數(shù)里面,時(shí)鐘起振之后 ????FLASH_SetLatency(FLASH_Latency_2); //FLASH時(shí)序延遲幾個(gè)周期,等待總線同步操作。推薦按照單片機(jī)系統(tǒng)運(yùn)行頻率,0—24MHz時(shí),取Latency=0;24—48MHz時(shí),取Latency=1;48~72MHz時(shí),取Latency=2。
????RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)==系統(tǒng)時(shí)鐘/1 ????RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(高速)(PCLK2)==系統(tǒng)時(shí)鐘/1? ????RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(低速)(PCLK1)==系統(tǒng)時(shí)鐘/2 //注:AHB主要負(fù)責(zé)外部存儲(chǔ)器時(shí)鐘。APB2負(fù)責(zé)AD,I/O,高級(jí)TIM,串口1。APB1負(fù)責(zé)DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
????RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL時(shí)鐘==(外部高速晶體時(shí)鐘/1)* 9 ==72MHz ????RCC_PLLCmd(ENABLE); //使能PLL時(shí)鐘 ???while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL時(shí)鐘就緒 ???RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統(tǒng)時(shí)鐘==PLL時(shí)鐘 ???while(RCC_GetSYSCLKSource()!=0x08); //等待系統(tǒng)時(shí)鐘源的啟動(dòng) }
//==============以下為開啟外設(shè)時(shí)鐘的操作============================// // RCC_AHBPeriphClockCmd (ABP2設(shè)備1 | ABP2設(shè)備2 , ENABLE); //啟動(dòng)AHB設(shè)備 // RCC_APB2PeriphClockCmd(ABP2設(shè)備1 | ABP2設(shè)備2 , ENABLE); //啟動(dòng)ABP2設(shè)備 // RCC_APB1PeriphClockCmd(ABP2設(shè)備1 | ABP2設(shè)備2 , ENABLE); //啟動(dòng)ABP1設(shè)備
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); //打開APB2外設(shè)
????RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB ?|RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); ???RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5 |RCC_APB1Periph_UART4 |RCC_APB1Periph_USART2 |RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2,ENABLE); }? //==============================================================
void SysTick_Configuration(void) ????????//延時(shí)函數(shù)初始化 { ? ??SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); ??NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0); ??SysTick_SetReload(72000); ??SysTick_ITConfig(ENABLE); } //================================= void delay(u32 nTime) {? ??SysTick_CounterCmd(SysTick_Counter_Enable); ? ??TimingDelay = nTime; ??while(TimingDelay != 0); ? ??SysTick_CounterCmd(SysTick_Counter_Disable); ? ??SysTick_CounterCmd(SysTick_Counter_Clear); } //==================================
void TimingDelay_Decrement(void) { ??if (TimingDelay != 0x00) ??{? ????TimingDelay--; ??} }
void Delay(vu32 nCount) { ??for(; nCount != 0; nCount--); } //============================================
void NVIC_Configuration(void ) { ??NVIC_InitTypeDef NVIC_InitStructure; //定義一個(gè)中斷結(jié)構(gòu)體
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //設(shè)置中斷向量表的起始地址為0x08000000 ??NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //設(shè)置NVIC優(yōu)先級(jí)分組,方式。 //注:一共16個(gè)優(yōu)先級(jí),分為搶占式和響應(yīng)式。兩種優(yōu)先級(jí)所占的數(shù)量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4, //分別代表搶占優(yōu)先級(jí)有1、2、4、8、16個(gè)和響應(yīng)優(yōu)先級(jí)有16、8、4、2、1個(gè)。規(guī)定兩種優(yōu)先級(jí)的數(shù)量后,所有的中斷級(jí)別必須在其中選擇, //搶占級(jí)別高的會(huì)打斷其他中斷優(yōu)先執(zhí)行,而響應(yīng)級(jí)別高的會(huì)在其他中斷執(zhí)行完優(yōu)先執(zhí)行。
??NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQChannel; //通道設(shè)置為串口5中斷 ??NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中斷響應(yīng)優(yōu)先級(jí)0 ??NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打開中斷 ??NVIC_Init(&NVIC_InitStructure); //初始化 ? ??//定時(shí)器2中斷
???NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure); }? void GPIO_Configuration(void) { ????GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化結(jié)構(gòu)體
??? //--------將UART5 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ????GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //管腳位置定義,標(biāo)號(hào)可以是NONE、ALL、0至15。 ????GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //輸出速度50MHz ????GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //推挽輸出模式 Out_PP ????GPIO_Init(GPIOC,&GPIO_InitStructure); //E組GPIO初始化
//--------將USART1,USART2 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 |GPIO_Pin_2 | GPIO_Pin_0 | GPIO_Pin_6; ???GPIO_Init(GPIOA, &GPIO_InitStructure);
//--------將USART3 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------將UART4 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOC, &GPIO_InitStructure);
//--------將UART5 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ???GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //管腳位置定義 //輸入模式下配置輸出速度無意義 //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; //輸出速度2MHz? ???GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ???GPIO_Init(GPIOD,&GPIO_InitStructure); //C組GPIO初始化
//--------將USART1 USART2 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 |GPIO_Pin_3; ???GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ???GPIO_Init(GPIOA, &GPIO_InitStructure);
//--------將USART3 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ??GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; ??GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ??GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------將UART4 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ??GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; ??GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ??GPIO_Init(GPIOC, &GPIO_InitStructure); } //============================================================== void TIM2_Configuration(void) {? ??TIM_TimeBaseInitTypeDef ?TIM_TimeBaseStructure;//定時(shí)器初始化結(jié)構(gòu) ??//TIM_ICInitTypeDef TIM_ICInitStructure; ????????//通道輸入初始化結(jié)構(gòu) ??? ??? ???RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); ??TIM_TimeBaseStructure.TIM_Period = 0xffff; ????????? ??TIM_TimeBaseStructure.TIM_Prescaler = 499; ?????????//時(shí)鐘分頻 ??TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; ????//時(shí)鐘分割 ??TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ? ??TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //基本初始化 ? ??TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; ??TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ??TIM_OCInitStructure.TIM_Pulse = CCR1_Val; ??TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; ??TIM_OC1Init(TIM2, &TIM_OCInitStructure); ??TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); ? ??TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ??TIM_OCInitStructure.TIM_Pulse = CCR2_Val; ??TIM_OC2Init(TIM2, &TIM_OCInitStructure); ??TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable); ??//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ??//TIM_OCInitStructure.TIM_Pulse = 255; ??//TIM_OC4Init(TIM2, &TIM_OCInitStructure); ?? ? ??TIM_Cmd(TIM2, ENABLE);
??TIM_ClearFlag(TIM2, TIM_FLAG_Update); ????????????????? ??TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); ???????//清除TIM2等待中斷更新中斷標(biāo)志位
? ??TIM_ITConfig(TIM2, TIM_IT_CC1 |TIM_IT_CC2 , ENABLE); }
//================================================?? ?void Com5TxChar( vu8 i ) ?{ ??USART_SendData(UART5,i); //回發(fā)給PC ? ??while(USART_GetFlagStatus(UART5, USART_FLAG_TXE)==RESET); ?} //---------------------?? ??void Com5TxStr( vu8 *pt, vu8 length ) ??{ ??? ???vu8 i;
????for( i=0;i ????{
???????Com5TxChar(*pt++);
????}
???// delay(10);??? ??} ?? ?//---------------------------- ?void Com1TxChar( vu8 i ) ?{ ???USART_SendData(USART1,(u8) i); //回發(fā)給PC ? ???while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET) ???{ ????} ????// ?return i;? ?}? ??void Com1TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com1TxChar(*pt++); ??} ??// ??delay(10); ? ??} ?? ? ?void Com2TxChar( vu8 i ) ?{ ??USART_SendData(USART2,(u8) i); //回發(fā)給PC ? ?while(USART_GetFlagStatus(USART2, USART_FLAG_TXE)==RESET) ?{ ?} ??// ?return i; ? ?} ?? ? ??void Com2TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com2TxChar(*pt++); ??} ??// ??delay(10); ? ??} ?? ? ?void Com3TxChar( vu8 i ) ?{ ??USART_SendData(USART3,(u8) i); //回發(fā)給PC ? ?while(USART_GetFlagStatus(USART3, USART_FLAG_TXE)==RESET) ?{ ?} ??// ?return i; ? ?} ?? ? ??void Com3TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com3TxChar(*pt++); ??} ??// ??delay(10); ? ??} ?? ? ?void Com4TxChar( vu8 i ) ?{ ??USART_SendData(UART4,(u8) i); //回發(fā)給PC ?? ?while(USART_GetFlagStatus(UART4, USART_FLAG_TXE)==RESET) ?{ ?} ??// ?return i; ? ?} ?? ? ??void Com4TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com4TxChar(*pt++); ??} ??// ??delay(10); ? ??}
?? ??void TIM2_IRQHandler(void) { ??????vu8 i; ? ????if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) ?????{ ??????TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); ?cnt1++; ?cnt2++; ?if(cnt1>=500) ?{ // ??polling=1; ??cnt1=0; ?} ?if(cnt2>=nt2) //RUNLED,WDI ???{? ?GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0))); ? ?if(Alert_flag==1) ??{ ??GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_6))); ? ??} ? ?cnt2=0; ??? ???}
?Time20msCnt++; ?// 秒級(jí)硬件延時(shí) if( Time20msCnt>=50 && T1sCnt ){ Time20msCnt=0; T1sCnt--; } if(T20msCnt){ ?//20ms單位延時(shí) T20msCnt--; }
? ??????capture1 = TIM_GetCapture1(TIM2); ?TIM_SetCompare1(TIM2, capture1 + CCR1_Val ); ?????}
????????? ??if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) ?? ?????{ ??????TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
? ?capture2 = TIM_GetCapture2(TIM2); ?TIM_SetCompare2(TIM2, capture2 + CCR2_Val ); ?????}??????? } //********串口COM5配置*****************************
void UART5_Configuration(void) { ???USART_InitTypeDef USART_InitStructure; //串口設(shè)置恢復(fù)默認(rèn)參數(shù)
???USART_InitStructure.USART_BaudRate = 115200; //波特率115200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止字節(jié) ???USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗(yàn) ???USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無流控制 ???USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //打開Rx接收和Tx發(fā)送功能 ???//USART_Init(USART1, &USART_InitStructure); ???USART_Init(UART5, &USART_InitStructure); //初始化 ???// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); ???// USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
???USART_ITConfig(UART5, ?USART_IT_RXNE, ENABLE); // 若接收數(shù)據(jù)寄存器滿,則產(chǎn)生中斷 ????//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
????// USART_ITConfig(UART5, USART_IT_TXE, ENABLE);
????USART_Cmd(UART5, ENABLE); //啟動(dòng)串口? ????//USART_Cmd(USART1, ENABLE);?
//-----如下語句解決第1個(gè)字節(jié)無法正確發(fā)送出去的問題-----//? ????USART_ClearFlag(UART5, USART_FLAG_TC); // 清標(biāo)志 ???//USART_ClearFlag(USART1, USART_FLAG_TC); } //************串口COM1~COM44配置*********************************
void USART_Configuration(void) { ???USART_InitTypeDef USART_InitStructure; //串口設(shè)置恢復(fù)默認(rèn)參數(shù)
???USART_InitStructure.USART_BaudRate = 1200; //波特率1200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止字節(jié) ???USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗(yàn) ???USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無流控制 ???USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //打開Rx接收和Tx發(fā)送功能 ???USART_Init(USART1, &USART_InitStructure); ???USART_Init(USART2, &USART_InitStructure); ???USART_Init(USART3, &USART_InitStructure); ???USART_Init(UART4 , &USART_InitStructure); ????????????????? ???USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 若接收數(shù)據(jù)寄存器滿,則產(chǎn)生中斷 ???USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); ???USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); ???USART_ITConfig(UART4 , USART_IT_RXNE, ENABLE);
???USART_Cmd(USART1, ENABLE); //啟動(dòng)串口 ???USART_Cmd(USART2, ENABLE); ???USART_Cmd(USART3, ENABLE); ???USART_Cmd(UART4, ENABLE);
??//-----如下語句解決第1個(gè)字節(jié)無法正確發(fā)送出去的問題-----//? ???USART_ClearFlag(USART1, USART_FLAG_TC);// 清標(biāo)志 ???USART_ClearFlag(USART2, USART_FLAG_TC); ???USART_ClearFlag(USART3, USART_FLAG_TC); ???USART_ClearFlag(UART4 , USART_FLAG_TC); } //**********??串口中斷函數(shù)??******************** void UART5_IRQHandler(void) { ???uchar x,y,z; ???uint checksum1,checksum2; ???if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ??{ ????x=USART_ReceiveData(UART5); ???}? ??Com5TxChar(x); } //------------------------------------------------
void USART1_IRQHandler(void) { ??if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ???{ ??????Com1RecDat[Com1RecCnt]=USART_ReceiveData(USART1);? ????}? ??Com1RecCnt++; ??Com1RecCnt%=C1_LEN;
??Com1TxChar(USART_ReceiveData(USART1)); } //----------------------------------------------
void USART2_IRQHandler(void) { ???if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ???{ ??????Com2RecDat[Com2RecCnt]=USART_ReceiveData(USART2);? ????}? ???Com2RecCnt++; ???Com2RecCnt%=C1_LEN; ???Com2TxChar(USART_ReceiveData(USART2)); } //-------------------------------------------------
void USART3_IRQHandler(void) { ??if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ??{ ?????Com3RecDat[Com3RecCnt]=USART_ReceiveData(USART3);? ???}? ???Com3RecCnt++; ???Com3RecCnt%=C1_LEN; ???Com3TxChar(USART_ReceiveData(USART3)); } //----------------------------------------------------
void UART4_IRQHandler(void) { ??if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ??{ ?????Com4RecDat[Com4RecCnt]=USART_ReceiveData(UART4);? ??}? ???Com4RecCnt++; ???Com4RecCnt%=C1_LEN; ???Com4TxChar(USART_ReceiveData(UART4)); } //*****************主函數(shù)************************ int main(void) { ?u8 ld[69]=0; ?u8 i;
?RCC_Configuration(); ?GPIO_Configuration(); ?NVIC_Configuration(); ?UART5_Configuration(); ?USART_Configuration(); ?TIM2_Configuration(); ?SysTick_Configuration();
?for(i=0;i<69;i++) ?{ ??ld[i]=i; ?} ?Com1TxStr(ld,69); ?Com2TxStr(ld,69); ?Com3TxStr(ld,69); ?Com4TxStr(ld,69); ?Com5TxStr(ld,69); ?while(1) ???{ ?????}
STM32?USART1?USART2?UASRT3?UART4?UART5串口通信測試程序
(2014-02-11 20:09:19) 轉(zhuǎn)載▼| | 分類:?單片機(jī)、嵌入系統(tǒng) |
#include "stm32f10x_lib.h" #include"stdio.h"
#define uchar unsigned char #define uint unsigned int #define ulong unsigned long
uint TimingDelay;
#define YES ?1 #define NO ??0
#define ?COM1_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_1) // GPIOC->BSRR=0xfd //&=0xfd ?//USART1 發(fā)送使能 #define ?COM1_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_1) // GPIOC->BSRR=0x02 //|=0x02 ?//USART1 禁止發(fā)送
#define ?COM2_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_2) // GPIOC->BSRR=0xfd //&=0xfd ?//USART2 發(fā)送使能 #define ?COM2_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_2)?
#define ?COM3_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_3) // GPIOC->BSRR=0xfd //&=0xfd ?//USART3 發(fā)送使能 #define ?COM3_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_3) // GPIOC->BSRR=0x02 //|=0x02 ?//USART3 禁止發(fā)送
#define ?COM4_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0xfd //&=0xfd ?//UART4 發(fā)送使能 #define ?COM4_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0x02 //|=0x02 ?//UART4 禁止發(fā)送
//UART5 上行串口接收中斷數(shù)據(jù)定義 uchar ComSynFlag; ?????????//=YES同步建立,UART0內(nèi)部私有 uchar ComReceiveCounter; ??//接收字節(jié)計(jì)數(shù),UART0內(nèi)部私有 uchar ComReceiveData[24]; ?//接收緩沖,UART0內(nèi)部私有
GPIO_InitTypeDef GPIO_InitStructure; ErrorStatus HSEStartUpStatus; TIM_TimeBaseInitTypeDef ?TIM_TimeBaseStructure; TIM_OCInitTypeDef ?TIM_OCInitStructure;
u16 Status; //定時(shí)器累加
void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void); void TIM2_Configuration(void); void UART5_Configuration(void); void SysTick_Configuration(void) ?; void Com3TxChar(vu8);
vu16 CCR1_Val = 0x0E10; ?//360 ?50Hz ?20ms vu16 CCR2_Val = 0x0048; ?//7200 10hz ????100ms ??? vu16 CCR3_Val = 0x7530; ?//30000 10Hz vu16 CCR4_Val = 0x1000;?
u16 capture1 = 0; u16 capture2 = 0; u16 capture3 = 0; u16 capture4 = 0;
int cnt1,cnt2,nt2=50;
//UART1 下行串口接收中斷數(shù)據(jù)定義 #define C1_LEN ???300 ?????//緩沖區(qū)長度 uint ?Com1RecCnt; ?????????//COM1接收字節(jié)計(jì)數(shù) uchar Com1RecDat[C1_LEN]; ?//COM1接收緩沖 uchar Com1AnsDat[24]; uint ?Com1AnsCnt;
uint ?Com2RecCnt; ?????????//COM2接收字節(jié)計(jì)數(shù) uchar Com2RecDat[C1_LEN]; ?//COM2接收緩沖 uchar Com2AnsDat[24]; uint ?Com2AnsCnt;?
uint ?Com3RecCnt; ?????????//COM3接收字節(jié)計(jì)數(shù) uchar Com3RecDat[C1_LEN]; ?//COM3接收緩沖 uchar Com3AnsDat[24]; uint ?Com3AnsCnt;
uint ?Com4RecCnt; ?????????//COM4接收字節(jié)計(jì)數(shù) uchar Com4RecDat[C1_LEN]; ?//COM4接收緩沖 uchar Com4AnsDat[24]; uint ?Com4AnsCnt;
uint ?Time20msCnt; ??//20ms定時(shí)器 uint ?T20msCnt; ?????//20ms定時(shí)器 uint ?T1sCnt; ???????//1s定時(shí)器
uchar RunCnt; ????//RUN LED閃光頻率參數(shù) //=======================================================================
void RCC_Configuration() { ??ErrorStatus HSEStartUpStatus; //定義外部高速晶振啟動(dòng)狀態(tài)枚舉變量 ??RCC_DeInit(); //復(fù)位RCC外部寄存器到默認(rèn)值 ??RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振 ??HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速時(shí)鐘準(zhǔn)備好
??if(HSEStartUpStatus==SUCCESS) ??{ //外部高速時(shí)鐘已經(jīng)準(zhǔn)備好 ????FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預(yù)讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法,位置:RCC初始化子函數(shù)里面,時(shí)鐘起振之后 ????FLASH_SetLatency(FLASH_Latency_2); //FLASH時(shí)序延遲幾個(gè)周期,等待總線同步操作。推薦按照單片機(jī)系統(tǒng)運(yùn)行頻率,0—24MHz時(shí),取Latency=0;24—48MHz時(shí),取Latency=1;48~72MHz時(shí),取Latency=2。
????RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)==系統(tǒng)時(shí)鐘/1 ????RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(高速)(PCLK2)==系統(tǒng)時(shí)鐘/1? ????RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(低速)(PCLK1)==系統(tǒng)時(shí)鐘/2 //注:AHB主要負(fù)責(zé)外部存儲(chǔ)器時(shí)鐘。APB2負(fù)責(zé)AD,I/O,高級(jí)TIM,串口1。APB1負(fù)責(zé)DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
????RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL時(shí)鐘==(外部高速晶體時(shí)鐘/1)* 9 ==72MHz ????RCC_PLLCmd(ENABLE); //使能PLL時(shí)鐘 ???while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL時(shí)鐘就緒 ???RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統(tǒng)時(shí)鐘==PLL時(shí)鐘 ???while(RCC_GetSYSCLKSource()!=0x08); //等待系統(tǒng)時(shí)鐘源的啟動(dòng) }
//==============以下為開啟外設(shè)時(shí)鐘的操作============================// // RCC_AHBPeriphClockCmd (ABP2設(shè)備1 | ABP2設(shè)備2 , ENABLE); //啟動(dòng)AHB設(shè)備 // RCC_APB2PeriphClockCmd(ABP2設(shè)備1 | ABP2設(shè)備2 , ENABLE); //啟動(dòng)ABP2設(shè)備 // RCC_APB1PeriphClockCmd(ABP2設(shè)備1 | ABP2設(shè)備2 , ENABLE); //啟動(dòng)ABP1設(shè)備
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); //打開APB2外設(shè)
????RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB ?|RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); ???RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5 |RCC_APB1Periph_UART4 |RCC_APB1Periph_USART2 |RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2,ENABLE); }? //==============================================================
void SysTick_Configuration(void) ????????//延時(shí)函數(shù)初始化 { ? ??SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); ??NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0); ??SysTick_SetReload(72000); ??SysTick_ITConfig(ENABLE); } //================================= void delay(u32 nTime) {? ??SysTick_CounterCmd(SysTick_Counter_Enable); ? ??TimingDelay = nTime; ??while(TimingDelay != 0); ? ??SysTick_CounterCmd(SysTick_Counter_Disable); ? ??SysTick_CounterCmd(SysTick_Counter_Clear); } //==================================
void TimingDelay_Decrement(void) { ??if (TimingDelay != 0x00) ??{? ????TimingDelay--; ??} }
void Delay(vu32 nCount) { ??for(; nCount != 0; nCount--); } //============================================
void NVIC_Configuration(void ) { ??NVIC_InitTypeDef NVIC_InitStructure; //定義一個(gè)中斷結(jié)構(gòu)體
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //設(shè)置中斷向量表的起始地址為0x08000000 ??NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //設(shè)置NVIC優(yōu)先級(jí)分組,方式。 //注:一共16個(gè)優(yōu)先級(jí),分為搶占式和響應(yīng)式。兩種優(yōu)先級(jí)所占的數(shù)量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4, //分別代表搶占優(yōu)先級(jí)有1、2、4、8、16個(gè)和響應(yīng)優(yōu)先級(jí)有16、8、4、2、1個(gè)。規(guī)定兩種優(yōu)先級(jí)的數(shù)量后,所有的中斷級(jí)別必須在其中選擇, //搶占級(jí)別高的會(huì)打斷其他中斷優(yōu)先執(zhí)行,而響應(yīng)級(jí)別高的會(huì)在其他中斷執(zhí)行完優(yōu)先執(zhí)行。
??NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQChannel; //通道設(shè)置為串口5中斷 ??NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中斷響應(yīng)優(yōu)先級(jí)0 ??NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打開中斷 ??NVIC_Init(&NVIC_InitStructure); //初始化 ? ??//定時(shí)器2中斷
???NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure);
???NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQChannel; ???NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; ???NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ???NVIC_Init(&NVIC_InitStructure); }? void GPIO_Configuration(void) { ????GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化結(jié)構(gòu)體
??? //--------將UART5 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ????GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //管腳位置定義,標(biāo)號(hào)可以是NONE、ALL、0至15。 ????GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //輸出速度50MHz ????GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //推挽輸出模式 Out_PP ????GPIO_Init(GPIOC,&GPIO_InitStructure); //E組GPIO初始化
//--------將USART1,USART2 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 |GPIO_Pin_2 | GPIO_Pin_0 | GPIO_Pin_6; ???GPIO_Init(GPIOA, &GPIO_InitStructure);
//--------將USART3 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------將UART4 的TX 配置為復(fù)用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOC, &GPIO_InitStructure);
//--------將UART5 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ???GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //管腳位置定義 //輸入模式下配置輸出速度無意義 //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; //輸出速度2MHz? ???GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ???GPIO_Init(GPIOD,&GPIO_InitStructure); //C組GPIO初始化
//--------將USART1 USART2 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 |GPIO_Pin_3; ???GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ???GPIO_Init(GPIOA, &GPIO_InitStructure);
//--------將USART3 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ??GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; ??GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ??GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------將UART4 的RX 配置為復(fù)用浮空輸入 IN_FLOATING---------------------// ??GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; ??GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入 IN_FLOATING? ??GPIO_Init(GPIOC, &GPIO_InitStructure); } //============================================================== void TIM2_Configuration(void) {? ??TIM_TimeBaseInitTypeDef ?TIM_TimeBaseStructure;//定時(shí)器初始化結(jié)構(gòu) ??//TIM_ICInitTypeDef TIM_ICInitStructure; ????????//通道輸入初始化結(jié)構(gòu) ??? ??? ???RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); ??TIM_TimeBaseStructure.TIM_Period = 0xffff; ????????? ??TIM_TimeBaseStructure.TIM_Prescaler = 499; ?????????//時(shí)鐘分頻 ??TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; ????//時(shí)鐘分割 ??TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ? ??TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //基本初始化 ? ??TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; ??TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ??TIM_OCInitStructure.TIM_Pulse = CCR1_Val; ??TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; ??TIM_OC1Init(TIM2, &TIM_OCInitStructure); ??TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); ? ??TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ??TIM_OCInitStructure.TIM_Pulse = CCR2_Val; ??TIM_OC2Init(TIM2, &TIM_OCInitStructure); ??TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable); ??//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ??//TIM_OCInitStructure.TIM_Pulse = 255; ??//TIM_OC4Init(TIM2, &TIM_OCInitStructure); ?? ? ??TIM_Cmd(TIM2, ENABLE);
??TIM_ClearFlag(TIM2, TIM_FLAG_Update); ????????????????? ??TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); ???????//清除TIM2等待中斷更新中斷標(biāo)志位
? ??TIM_ITConfig(TIM2, TIM_IT_CC1 |TIM_IT_CC2 , ENABLE); }
//================================================?? ?void Com5TxChar( vu8 i ) ?{ ??USART_SendData(UART5,i); //回發(fā)給PC ? ??while(USART_GetFlagStatus(UART5, USART_FLAG_TXE)==RESET); ?} //---------------------?? ??void Com5TxStr( vu8 *pt, vu8 length ) ??{ ??? ???vu8 i;
????for( i=0;i ????{
???????Com5TxChar(*pt++);
????}
???// delay(10);??? ??} ?? ?//---------------------------- ?void Com1TxChar( vu8 i ) ?{ ???USART_SendData(USART1,(u8) i); //回發(fā)給PC ? ???while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET) ???{ ????} ????// ?return i;? ?}? ??void Com1TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com1TxChar(*pt++); ??} ??// ??delay(10); ? ??} ?? ? ?void Com2TxChar( vu8 i ) ?{ ??USART_SendData(USART2,(u8) i); //回發(fā)給PC ? ?while(USART_GetFlagStatus(USART2, USART_FLAG_TXE)==RESET) ?{ ?} ??// ?return i; ? ?} ?? ? ??void Com2TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com2TxChar(*pt++); ??} ??// ??delay(10); ? ??} ?? ? ?void Com3TxChar( vu8 i ) ?{ ??USART_SendData(USART3,(u8) i); //回發(fā)給PC ? ?while(USART_GetFlagStatus(USART3, USART_FLAG_TXE)==RESET) ?{ ?} ??// ?return i; ? ?} ?? ? ??void Com3TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com3TxChar(*pt++); ??} ??// ??delay(10); ? ??} ?? ? ?void Com4TxChar( vu8 i ) ?{ ??USART_SendData(UART4,(u8) i); //回發(fā)給PC ?? ?while(USART_GetFlagStatus(UART4, USART_FLAG_TXE)==RESET) ?{ ?} ??// ?return i; ? ?} ?? ? ??void Com4TxStr( vu8 *pt, vu8 length ) ??{ ??? ??vu8 i; ??for(i=0;i ?Com4TxChar(*pt++); ??} ??// ??delay(10); ? ??}
?? ??void TIM2_IRQHandler(void) { ??????vu8 i; ? ????if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) ?????{ ??????TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); ?cnt1++; ?cnt2++; ?if(cnt1>=500) ?{ // ??polling=1; ??cnt1=0; ?} ?if(cnt2>=nt2) //RUNLED,WDI ???{? ?GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0))); ? ?if(Alert_flag==1) ??{ ??GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_6))); ? ??} ? ?cnt2=0; ??? ???}
?Time20msCnt++; ?// 秒級(jí)硬件延時(shí) if( Time20msCnt>=50 && T1sCnt ){ Time20msCnt=0; T1sCnt--; } if(T20msCnt){ ?//20ms單位延時(shí) T20msCnt--; }
? ??????capture1 = TIM_GetCapture1(TIM2); ?TIM_SetCompare1(TIM2, capture1 + CCR1_Val ); ?????}
????????? ??if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) ?? ?????{ ??????TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
? ?capture2 = TIM_GetCapture2(TIM2); ?TIM_SetCompare2(TIM2, capture2 + CCR2_Val ); ?????}??????? } //********串口COM5配置*****************************
void UART5_Configuration(void) { ???USART_InitTypeDef USART_InitStructure; //串口設(shè)置恢復(fù)默認(rèn)參數(shù)
???USART_InitStructure.USART_BaudRate = 115200; //波特率115200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止字節(jié) ???USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗(yàn) ???USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無流控制 ???USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //打開Rx接收和Tx發(fā)送功能 ???//USART_Init(USART1, &USART_InitStructure); ???USART_Init(UART5, &USART_InitStructure); //初始化 ???// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); ???// USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
???USART_ITConfig(UART5, ?USART_IT_RXNE, ENABLE); // 若接收數(shù)據(jù)寄存器滿,則產(chǎn)生中斷 ????//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
????// USART_ITConfig(UART5, USART_IT_TXE, ENABLE);
????USART_Cmd(UART5, ENABLE); //啟動(dòng)串口? ????//USART_Cmd(USART1, ENABLE);?
//-----如下語句解決第1個(gè)字節(jié)無法正確發(fā)送出去的問題-----//? ????USART_ClearFlag(UART5, USART_FLAG_TC); // 清標(biāo)志 ???//USART_ClearFlag(USART1, USART_FLAG_TC); } //************串口COM1~COM44配置*********************************
void USART_Configuration(void) { ???USART_InitTypeDef USART_InitStructure; //串口設(shè)置恢復(fù)默認(rèn)參數(shù)
???USART_InitStructure.USART_BaudRate = 1200; //波特率1200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止字節(jié) ???USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗(yàn) ???USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無流控制 ???USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //打開Rx接收和Tx發(fā)送功能 ???USART_Init(USART1, &USART_InitStructure); ???USART_Init(USART2, &USART_InitStructure); ???USART_Init(USART3, &USART_InitStructure); ???USART_Init(UART4 , &USART_InitStructure); ????????????????? ???USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 若接收數(shù)據(jù)寄存器滿,則產(chǎn)生中斷 ???USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); ???USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); ???USART_ITConfig(UART4 , USART_IT_RXNE, ENABLE);
???USART_Cmd(USART1, ENABLE); //啟動(dòng)串口 ???USART_Cmd(USART2, ENABLE); ???USART_Cmd(USART3, ENABLE); ???USART_Cmd(UART4, ENABLE);
??//-----如下語句解決第1個(gè)字節(jié)無法正確發(fā)送出去的問題-----//? ???USART_ClearFlag(USART1, USART_FLAG_TC);// 清標(biāo)志 ???USART_ClearFlag(USART2, USART_FLAG_TC); ???USART_ClearFlag(USART3, USART_FLAG_TC); ???USART_ClearFlag(UART4 , USART_FLAG_TC); } //**********??串口中斷函數(shù)??******************** void UART5_IRQHandler(void) { ???uchar x,y,z; ???uint checksum1,checksum2; ???if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ??{ ????x=USART_ReceiveData(UART5); ???}? ??Com5TxChar(x); } //------------------------------------------------
void USART1_IRQHandler(void) { ??if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ???{ ??????Com1RecDat[Com1RecCnt]=USART_ReceiveData(USART1);? ????}? ??Com1RecCnt++; ??Com1RecCnt%=C1_LEN;
??Com1TxChar(USART_ReceiveData(USART1)); } //----------------------------------------------
void USART2_IRQHandler(void) { ???if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ???{ ??????Com2RecDat[Com2RecCnt]=USART_ReceiveData(USART2);? ????}? ???Com2RecCnt++; ???Com2RecCnt%=C1_LEN; ???Com2TxChar(USART_ReceiveData(USART2)); } //-------------------------------------------------
void USART3_IRQHandler(void) { ??if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ??{ ?????Com3RecDat[Com3RecCnt]=USART_ReceiveData(USART3);? ???}? ???Com3RecCnt++; ???Com3RecCnt%=C1_LEN; ???Com3TxChar(USART_ReceiveData(USART3)); } //----------------------------------------------------
void UART4_IRQHandler(void) { ??if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) //若接收數(shù)據(jù)寄存器滿 ??{ ?????Com4RecDat[Com4RecCnt]=USART_ReceiveData(UART4);? ??}? ???Com4RecCnt++; ???Com4RecCnt%=C1_LEN; ???Com4TxChar(USART_ReceiveData(UART4)); } //*****************主函數(shù)************************ int main(void) { ?u8 ld[69]=0; ?u8 i;
?RCC_Configuration(); ?GPIO_Configuration(); ?NVIC_Configuration(); ?UART5_Configuration(); ?USART_Configuration(); ?TIM2_Configuration(); ?SysTick_Configuration();
?for(i=0;i<69;i++) ?{ ??ld[i]=i; ?} ?Com1TxStr(ld,69); ?Com2TxStr(ld,69); ?Com3TxStr(ld,69); ?Com4TxStr(ld,69); ?Com5TxStr(ld,69); ?while(1) ???{ ?????}
總結(jié)
以上是生活随笔為你收集整理的STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python动态添加类方法_Python
- 下一篇: 同省异地社保卡要换吗_攀枝花社保卡在成都