日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STM32?USART1?USART2?UASRT3?UART4?UART5串口通信測試程序

(2014-02-11 20:09:19) 轉載

分類:?單片機、嵌入系統
// 5個串口均可工作,已經把定時器中斷、 串口中斷和配置函數寫在一個文件中 ??晶振 ?8Mhz?
#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 發送使能 #define ?COM1_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_1) // GPIOC->BSRR=0x02 //|=0x02 ?//USART1 禁止發送
#define ?COM2_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_2) // GPIOC->BSRR=0xfd //&=0xfd ?//USART2 發送使能 #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 發送使能 #define ?COM3_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_3) // GPIOC->BSRR=0x02 //|=0x02 ?//USART3 禁止發送
#define ?COM4_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0xfd //&=0xfd ?//UART4 發送使能 #define ?COM4_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0x02 //|=0x02 ?//UART4 禁止發送

//UART5 上行串口接收中斷數據定義 uchar ComSynFlag; ?????????//=YES同步建立,UART0內部私有 uchar ComReceiveCounter; ??//接收字節計數,UART0內部私有 uchar ComReceiveData[24]; ?//接收緩沖,UART0內部私有

GPIO_InitTypeDef GPIO_InitStructure; ErrorStatus HSEStartUpStatus; TIM_TimeBaseInitTypeDef ?TIM_TimeBaseStructure; TIM_OCInitTypeDef ?TIM_OCInitStructure;
u16 Status; //定時器累加
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 下行串口接收中斷數據定義 #define C1_LEN ???300 ?????//緩沖區長度 uint ?Com1RecCnt; ?????????//COM1接收字節計數 uchar Com1RecDat[C1_LEN]; ?//COM1接收緩沖 uchar Com1AnsDat[24]; uint ?Com1AnsCnt;
uint ?Com2RecCnt; ?????????//COM2接收字節計數 uchar Com2RecDat[C1_LEN]; ?//COM2接收緩沖 uchar Com2AnsDat[24]; uint ?Com2AnsCnt;?
uint ?Com3RecCnt; ?????????//COM3接收字節計數 uchar Com3RecDat[C1_LEN]; ?//COM3接收緩沖 uchar Com3AnsDat[24]; uint ?Com3AnsCnt;
uint ?Com4RecCnt; ?????????//COM4接收字節計數 uchar Com4RecDat[C1_LEN]; ?//COM4接收緩沖 uchar Com4AnsDat[24]; uint ?Com4AnsCnt;

uint ?Time20msCnt; ??//20ms定時器 uint ?T20msCnt; ?????//20ms定時器 uint ?T1sCnt; ???????//1s定時器

uchar RunCnt; ????//RUN LED閃光頻率參數 //=======================================================================
void RCC_Configuration() { ??ErrorStatus HSEStartUpStatus; //定義外部高速晶振啟動狀態枚舉變量 ??RCC_DeInit(); //復位RCC外部寄存器到默認值 ??RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振 ??HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速時鐘準備好
??if(HSEStartUpStatus==SUCCESS) ??{ //外部高速時鐘已經準備好 ????FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法,位置:RCC初始化子函數里面,時鐘起振之后 ????FLASH_SetLatency(FLASH_Latency_2); //FLASH時序延遲幾個周期,等待總線同步操作。推薦按照單片機系統運行頻率,0—24MHz時,取Latency=0;24—48MHz時,取Latency=1;48~72MHz時,取Latency=2。
????RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)==系統時鐘/1 ????RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(高速)(PCLK2)==系統時鐘/1? ????RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(低速)(PCLK1)==系統時鐘/2 //注:AHB主要負責外部存儲器時鐘。APB2負責AD,I/O,高級TIM,串口1。APB1負責DA,USB,SPI,I2C,CAN,串口2345,普通TIM。

????RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL時鐘==(外部高速晶體時鐘/1)* 9 ==72MHz ????RCC_PLLCmd(ENABLE); //使能PLL時鐘 ???while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL時鐘就緒 ???RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統時鐘==PLL時鐘 ???while(RCC_GetSYSCLKSource()!=0x08); //等待系統時鐘源的啟動 }
//==============以下為開啟外設時鐘的操作============================// // RCC_AHBPeriphClockCmd (ABP2設備1 | ABP2設備2 , ENABLE); //啟動AHB設備 // RCC_APB2PeriphClockCmd(ABP2設備1 | ABP2設備2 , ENABLE); //啟動ABP2設備 // RCC_APB1PeriphClockCmd(ABP2設備1 | ABP2設備2 , ENABLE); //啟動ABP1設備
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); //打開APB2外設
????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) ????????//延時函數初始化 { ? ??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; //定義一個中斷結構體
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //設置中斷向量表的起始地址為0x08000000 ??NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //設置NVIC優先級分組,方式。 //注:一共16個優先級,分為搶占式和響應式。兩種優先級所占的數量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4, //分別代表搶占優先級有1、2、4、8、16個和響應優先級有16、8、4、2、1個。規定兩種優先級的數量后,所有的中斷級別必須在其中選擇, //搶占級別高的會打斷其他中斷優先執行,而響應級別高的會在其他中斷執行完優先執行。
??NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQChannel; //通道設置為串口5中斷 ??NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中斷響應優先級0 ??NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打開中斷 ??NVIC_Init(&NVIC_InitStructure); //初始化 ? ??//定時器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初始化結構體
??? //--------將UART5 的TX 配置為復用推挽輸出 AF_PP---------------------// ????GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //管腳位置定義,標號可以是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 配置為復用推挽輸出 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 配置為復用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------將UART4 的TX 配置為復用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOC, &GPIO_InitStructure);
//--------將UART5 的RX 配置為復用浮空輸入 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 配置為復用浮空輸入 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 配置為復用浮空輸入 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 配置為復用浮空輸入 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;//定時器初始化結構 ??//TIM_ICInitTypeDef TIM_ICInitStructure; ????????//通道輸入初始化結構 ??? ??? ???RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); ??TIM_TimeBaseStructure.TIM_Period = 0xffff; ????????? ??TIM_TimeBaseStructure.TIM_Prescaler = 499; ?????????//時鐘分頻 ??TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; ????//時鐘分割 ??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等待中斷更新中斷標志位
? ??TIM_ITConfig(TIM2, TIM_IT_CC1 |TIM_IT_CC2 , ENABLE); }
//================================================?? ?void Com5TxChar( vu8 i ) ?{ ??USART_SendData(UART5,i); //回發給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); //回發給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); //回發給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); //回發給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); //回發給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++; ?// 秒級硬件延時 if( Time20msCnt>=50 && T1sCnt ){ Time20msCnt=0; T1sCnt--; } if(T20msCnt){ ?//20ms單位延時 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; //串口設置恢復默認參數
???USART_InitStructure.USART_BaudRate = 115200; //波特率115200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //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; //打開Rx接收和Tx發送功能 ???//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); // 若接收數據寄存器滿,則產生中斷 ????//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
????// USART_ITConfig(UART5, USART_IT_TXE, ENABLE);
????USART_Cmd(UART5, ENABLE); //啟動串口? ????//USART_Cmd(USART1, ENABLE);?

//-----如下語句解決第1個字節無法正確發送出去的問題-----//? ????USART_ClearFlag(UART5, USART_FLAG_TC); // 清標志 ???//USART_ClearFlag(USART1, USART_FLAG_TC); } //************串口COM1~COM44配置*********************************
void USART_Configuration(void)
{ ???USART_InitTypeDef USART_InitStructure; //串口設置恢復默認參數
???USART_InitStructure.USART_BaudRate = 1200; //波特率1200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //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; //打開Rx接收和Tx發送功能 ???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);// 若接收數據寄存器滿,則產生中斷 ???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); //啟動串口 ???USART_Cmd(USART2, ENABLE); ???USART_Cmd(USART3, ENABLE); ???USART_Cmd(UART4, ENABLE);
??//-----如下語句解決第1個字節無法正確發送出去的問題-----//? ???USART_ClearFlag(USART1, USART_FLAG_TC);// 清標志 ???USART_ClearFlag(USART2, USART_FLAG_TC); ???USART_ClearFlag(USART3, USART_FLAG_TC); ???USART_ClearFlag(UART4 , USART_FLAG_TC); } //**********??串口中斷函數??******************** void UART5_IRQHandler(void) { ???uchar x,y,z; ???uint checksum1,checksum2; ???if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) //若接收數據寄存器滿 ??{ ????x=USART_ReceiveData(UART5); ???}? ??Com5TxChar(x); } //------------------------------------------------
void USART1_IRQHandler(void) { ??if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //若接收數據寄存器滿 ???{ ??????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) //若接收數據寄存器滿 ???{ ??????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) //若接收數據寄存器滿 ??{ ?????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) //若接收數據寄存器滿 ??{ ?????Com4RecDat[Com4RecCnt]=USART_ReceiveData(UART4);? ??}? ???Com4RecCnt++; ???Com4RecCnt%=C1_LEN; ???Com4TxChar(USART_ReceiveData(UART4)); } //*****************主函數************************ 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) 轉載

分類:?單片機、嵌入系統
// 5個串口均可工作,已經把定時器中斷、 串口中斷和配置函數寫在一個文件中 ??晶振 ?8Mhz?
#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 發送使能 #define ?COM1_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_1) // GPIOC->BSRR=0x02 //|=0x02 ?//USART1 禁止發送
#define ?COM2_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_2) // GPIOC->BSRR=0xfd //&=0xfd ?//USART2 發送使能 #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 發送使能 #define ?COM3_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_3) // GPIOC->BSRR=0x02 //|=0x02 ?//USART3 禁止發送
#define ?COM4_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0xfd //&=0xfd ?//UART4 發送使能 #define ?COM4_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0x02 //|=0x02 ?//UART4 禁止發送

//UART5 上行串口接收中斷數據定義 uchar ComSynFlag; ?????????//=YES同步建立,UART0內部私有 uchar ComReceiveCounter; ??//接收字節計數,UART0內部私有 uchar ComReceiveData[24]; ?//接收緩沖,UART0內部私有

GPIO_InitTypeDef GPIO_InitStructure; ErrorStatus HSEStartUpStatus; TIM_TimeBaseInitTypeDef ?TIM_TimeBaseStructure; TIM_OCInitTypeDef ?TIM_OCInitStructure;
u16 Status; //定時器累加
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 下行串口接收中斷數據定義 #define C1_LEN ???300 ?????//緩沖區長度 uint ?Com1RecCnt; ?????????//COM1接收字節計數 uchar Com1RecDat[C1_LEN]; ?//COM1接收緩沖 uchar Com1AnsDat[24]; uint ?Com1AnsCnt;
uint ?Com2RecCnt; ?????????//COM2接收字節計數 uchar Com2RecDat[C1_LEN]; ?//COM2接收緩沖 uchar Com2AnsDat[24]; uint ?Com2AnsCnt;?
uint ?Com3RecCnt; ?????????//COM3接收字節計數 uchar Com3RecDat[C1_LEN]; ?//COM3接收緩沖 uchar Com3AnsDat[24]; uint ?Com3AnsCnt;
uint ?Com4RecCnt; ?????????//COM4接收字節計數 uchar Com4RecDat[C1_LEN]; ?//COM4接收緩沖 uchar Com4AnsDat[24]; uint ?Com4AnsCnt;

uint ?Time20msCnt; ??//20ms定時器 uint ?T20msCnt; ?????//20ms定時器 uint ?T1sCnt; ???????//1s定時器

uchar RunCnt; ????//RUN LED閃光頻率參數 //=======================================================================
void RCC_Configuration() { ??ErrorStatus HSEStartUpStatus; //定義外部高速晶振啟動狀態枚舉變量 ??RCC_DeInit(); //復位RCC外部寄存器到默認值 ??RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振 ??HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速時鐘準備好
??if(HSEStartUpStatus==SUCCESS) ??{ //外部高速時鐘已經準備好 ????FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法,位置:RCC初始化子函數里面,時鐘起振之后 ????FLASH_SetLatency(FLASH_Latency_2); //FLASH時序延遲幾個周期,等待總線同步操作。推薦按照單片機系統運行頻率,0—24MHz時,取Latency=0;24—48MHz時,取Latency=1;48~72MHz時,取Latency=2。
????RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)==系統時鐘/1 ????RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(高速)(PCLK2)==系統時鐘/1? ????RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(低速)(PCLK1)==系統時鐘/2 //注:AHB主要負責外部存儲器時鐘。APB2負責AD,I/O,高級TIM,串口1。APB1負責DA,USB,SPI,I2C,CAN,串口2345,普通TIM。

????RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL時鐘==(外部高速晶體時鐘/1)* 9 ==72MHz ????RCC_PLLCmd(ENABLE); //使能PLL時鐘 ???while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL時鐘就緒 ???RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統時鐘==PLL時鐘 ???while(RCC_GetSYSCLKSource()!=0x08); //等待系統時鐘源的啟動 }
//==============以下為開啟外設時鐘的操作============================// // RCC_AHBPeriphClockCmd (ABP2設備1 | ABP2設備2 , ENABLE); //啟動AHB設備 // RCC_APB2PeriphClockCmd(ABP2設備1 | ABP2設備2 , ENABLE); //啟動ABP2設備 // RCC_APB1PeriphClockCmd(ABP2設備1 | ABP2設備2 , ENABLE); //啟動ABP1設備
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); //打開APB2外設
????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) ????????//延時函數初始化 { ? ??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; //定義一個中斷結構體
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //設置中斷向量表的起始地址為0x08000000 ??NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //設置NVIC優先級分組,方式。 //注:一共16個優先級,分為搶占式和響應式。兩種優先級所占的數量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4, //分別代表搶占優先級有1、2、4、8、16個和響應優先級有16、8、4、2、1個。規定兩種優先級的數量后,所有的中斷級別必須在其中選擇, //搶占級別高的會打斷其他中斷優先執行,而響應級別高的會在其他中斷執行完優先執行。
??NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQChannel; //通道設置為串口5中斷 ??NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中斷響應優先級0 ??NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打開中斷 ??NVIC_Init(&NVIC_InitStructure); //初始化 ? ??//定時器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初始化結構體
??? //--------將UART5 的TX 配置為復用推挽輸出 AF_PP---------------------// ????GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //管腳位置定義,標號可以是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 配置為復用推挽輸出 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 配置為復用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------將UART4 的TX 配置為復用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOC, &GPIO_InitStructure);
//--------將UART5 的RX 配置為復用浮空輸入 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 配置為復用浮空輸入 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 配置為復用浮空輸入 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 配置為復用浮空輸入 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;//定時器初始化結構 ??//TIM_ICInitTypeDef TIM_ICInitStructure; ????????//通道輸入初始化結構 ??? ??? ???RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); ??TIM_TimeBaseStructure.TIM_Period = 0xffff; ????????? ??TIM_TimeBaseStructure.TIM_Prescaler = 499; ?????????//時鐘分頻 ??TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; ????//時鐘分割 ??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等待中斷更新中斷標志位
? ??TIM_ITConfig(TIM2, TIM_IT_CC1 |TIM_IT_CC2 , ENABLE); }
//================================================?? ?void Com5TxChar( vu8 i ) ?{ ??USART_SendData(UART5,i); //回發給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); //回發給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); //回發給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); //回發給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); //回發給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++; ?// 秒級硬件延時 if( Time20msCnt>=50 && T1sCnt ){ Time20msCnt=0; T1sCnt--; } if(T20msCnt){ ?//20ms單位延時 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; //串口設置恢復默認參數
???USART_InitStructure.USART_BaudRate = 115200; //波特率115200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //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; //打開Rx接收和Tx發送功能 ???//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); // 若接收數據寄存器滿,則產生中斷 ????//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
????// USART_ITConfig(UART5, USART_IT_TXE, ENABLE);
????USART_Cmd(UART5, ENABLE); //啟動串口? ????//USART_Cmd(USART1, ENABLE);?

//-----如下語句解決第1個字節無法正確發送出去的問題-----//? ????USART_ClearFlag(UART5, USART_FLAG_TC); // 清標志 ???//USART_ClearFlag(USART1, USART_FLAG_TC); } //************串口COM1~COM44配置*********************************
void USART_Configuration(void)
{ ???USART_InitTypeDef USART_InitStructure; //串口設置恢復默認參數
???USART_InitStructure.USART_BaudRate = 1200; //波特率1200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //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; //打開Rx接收和Tx發送功能 ???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);// 若接收數據寄存器滿,則產生中斷 ???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); //啟動串口 ???USART_Cmd(USART2, ENABLE); ???USART_Cmd(USART3, ENABLE); ???USART_Cmd(UART4, ENABLE);
??//-----如下語句解決第1個字節無法正確發送出去的問題-----//? ???USART_ClearFlag(USART1, USART_FLAG_TC);// 清標志 ???USART_ClearFlag(USART2, USART_FLAG_TC); ???USART_ClearFlag(USART3, USART_FLAG_TC); ???USART_ClearFlag(UART4 , USART_FLAG_TC); } //**********??串口中斷函數??******************** void UART5_IRQHandler(void) { ???uchar x,y,z; ???uint checksum1,checksum2; ???if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) //若接收數據寄存器滿 ??{ ????x=USART_ReceiveData(UART5); ???}? ??Com5TxChar(x); } //------------------------------------------------
void USART1_IRQHandler(void) { ??if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //若接收數據寄存器滿 ???{ ??????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) //若接收數據寄存器滿 ???{ ??????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) //若接收數據寄存器滿 ??{ ?????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) //若接收數據寄存器滿 ??{ ?????Com4RecDat[Com4RecCnt]=USART_ReceiveData(UART4);? ??}? ???Com4RecCnt++; ???Com4RecCnt%=C1_LEN; ???Com4TxChar(USART_ReceiveData(UART4)); } //*****************主函數************************ 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) 轉載

分類:?單片機、嵌入系統
// 5個串口均可工作,已經把定時器中斷、 串口中斷和配置函數寫在一個文件中 ??晶振 ?8Mhz?
#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 發送使能 #define ?COM1_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_1) // GPIOC->BSRR=0x02 //|=0x02 ?//USART1 禁止發送
#define ?COM2_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_2) // GPIOC->BSRR=0xfd //&=0xfd ?//USART2 發送使能 #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 發送使能 #define ?COM3_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_3) // GPIOC->BSRR=0x02 //|=0x02 ?//USART3 禁止發送
#define ?COM4_TX_EN ?GPIO_ResetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0xfd //&=0xfd ?//UART4 發送使能 #define ?COM4_RX_EN ?GPIO_SetBits(GPIOC,GPIO_Pin_4) // GPIOC->BSRR=0x02 //|=0x02 ?//UART4 禁止發送

//UART5 上行串口接收中斷數據定義 uchar ComSynFlag; ?????????//=YES同步建立,UART0內部私有 uchar ComReceiveCounter; ??//接收字節計數,UART0內部私有 uchar ComReceiveData[24]; ?//接收緩沖,UART0內部私有

GPIO_InitTypeDef GPIO_InitStructure; ErrorStatus HSEStartUpStatus; TIM_TimeBaseInitTypeDef ?TIM_TimeBaseStructure; TIM_OCInitTypeDef ?TIM_OCInitStructure;
u16 Status; //定時器累加
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 下行串口接收中斷數據定義 #define C1_LEN ???300 ?????//緩沖區長度 uint ?Com1RecCnt; ?????????//COM1接收字節計數 uchar Com1RecDat[C1_LEN]; ?//COM1接收緩沖 uchar Com1AnsDat[24]; uint ?Com1AnsCnt;
uint ?Com2RecCnt; ?????????//COM2接收字節計數 uchar Com2RecDat[C1_LEN]; ?//COM2接收緩沖 uchar Com2AnsDat[24]; uint ?Com2AnsCnt;?
uint ?Com3RecCnt; ?????????//COM3接收字節計數 uchar Com3RecDat[C1_LEN]; ?//COM3接收緩沖 uchar Com3AnsDat[24]; uint ?Com3AnsCnt;
uint ?Com4RecCnt; ?????????//COM4接收字節計數 uchar Com4RecDat[C1_LEN]; ?//COM4接收緩沖 uchar Com4AnsDat[24]; uint ?Com4AnsCnt;

uint ?Time20msCnt; ??//20ms定時器 uint ?T20msCnt; ?????//20ms定時器 uint ?T1sCnt; ???????//1s定時器

uchar RunCnt; ????//RUN LED閃光頻率參數 //=======================================================================
void RCC_Configuration() { ??ErrorStatus HSEStartUpStatus; //定義外部高速晶振啟動狀態枚舉變量 ??RCC_DeInit(); //復位RCC外部寄存器到默認值 ??RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振 ??HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速時鐘準備好
??if(HSEStartUpStatus==SUCCESS) ??{ //外部高速時鐘已經準備好 ????FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法,位置:RCC初始化子函數里面,時鐘起振之后 ????FLASH_SetLatency(FLASH_Latency_2); //FLASH時序延遲幾個周期,等待總線同步操作。推薦按照單片機系統運行頻率,0—24MHz時,取Latency=0;24—48MHz時,取Latency=1;48~72MHz時,取Latency=2。
????RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)==系統時鐘/1 ????RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(高速)(PCLK2)==系統時鐘/1? ????RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(低速)(PCLK1)==系統時鐘/2 //注:AHB主要負責外部存儲器時鐘。APB2負責AD,I/O,高級TIM,串口1。APB1負責DA,USB,SPI,I2C,CAN,串口2345,普通TIM。

????RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL時鐘==(外部高速晶體時鐘/1)* 9 ==72MHz ????RCC_PLLCmd(ENABLE); //使能PLL時鐘 ???while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL時鐘就緒 ???RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系統時鐘==PLL時鐘 ???while(RCC_GetSYSCLKSource()!=0x08); //等待系統時鐘源的啟動 }
//==============以下為開啟外設時鐘的操作============================// // RCC_AHBPeriphClockCmd (ABP2設備1 | ABP2設備2 , ENABLE); //啟動AHB設備 // RCC_APB2PeriphClockCmd(ABP2設備1 | ABP2設備2 , ENABLE); //啟動ABP2設備 // RCC_APB1PeriphClockCmd(ABP2設備1 | ABP2設備2 , ENABLE); //啟動ABP1設備
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); //打開APB2外設
????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) ????????//延時函數初始化 { ? ??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; //定義一個中斷結構體
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //設置中斷向量表的起始地址為0x08000000 ??NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //設置NVIC優先級分組,方式。 //注:一共16個優先級,分為搶占式和響應式。兩種優先級所占的數量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4, //分別代表搶占優先級有1、2、4、8、16個和響應優先級有16、8、4、2、1個。規定兩種優先級的數量后,所有的中斷級別必須在其中選擇, //搶占級別高的會打斷其他中斷優先執行,而響應級別高的會在其他中斷執行完優先執行。
??NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQChannel; //通道設置為串口5中斷 ??NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中斷響應優先級0 ??NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打開中斷 ??NVIC_Init(&NVIC_InitStructure); //初始化 ? ??//定時器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初始化結構體
??? //--------將UART5 的TX 配置為復用推挽輸出 AF_PP---------------------// ????GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //管腳位置定義,標號可以是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 配置為復用推挽輸出 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 配置為復用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOB, &GPIO_InitStructure);
//--------將UART4 的TX 配置為復用推挽輸出 AF_PP---------------------// ???GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; ???GPIO_Init(GPIOC, &GPIO_InitStructure);
//--------將UART5 的RX 配置為復用浮空輸入 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 配置為復用浮空輸入 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 配置為復用浮空輸入 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 配置為復用浮空輸入 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;//定時器初始化結構 ??//TIM_ICInitTypeDef TIM_ICInitStructure; ????????//通道輸入初始化結構 ??? ??? ???RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); ??TIM_TimeBaseStructure.TIM_Period = 0xffff; ????????? ??TIM_TimeBaseStructure.TIM_Prescaler = 499; ?????????//時鐘分頻 ??TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; ????//時鐘分割 ??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等待中斷更新中斷標志位
? ??TIM_ITConfig(TIM2, TIM_IT_CC1 |TIM_IT_CC2 , ENABLE); }
//================================================?? ?void Com5TxChar( vu8 i ) ?{ ??USART_SendData(UART5,i); //回發給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); //回發給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); //回發給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); //回發給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); //回發給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++; ?// 秒級硬件延時 if( Time20msCnt>=50 && T1sCnt ){ Time20msCnt=0; T1sCnt--; } if(T20msCnt){ ?//20ms單位延時 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; //串口設置恢復默認參數
???USART_InitStructure.USART_BaudRate = 115200; //波特率115200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //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; //打開Rx接收和Tx發送功能 ???//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); // 若接收數據寄存器滿,則產生中斷 ????//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
????// USART_ITConfig(UART5, USART_IT_TXE, ENABLE);
????USART_Cmd(UART5, ENABLE); //啟動串口? ????//USART_Cmd(USART1, ENABLE);?

//-----如下語句解決第1個字節無法正確發送出去的問題-----//? ????USART_ClearFlag(UART5, USART_FLAG_TC); // 清標志 ???//USART_ClearFlag(USART1, USART_FLAG_TC); } //************串口COM1~COM44配置*********************************
void USART_Configuration(void)
{ ???USART_InitTypeDef USART_InitStructure; //串口設置恢復默認參數
???USART_InitStructure.USART_BaudRate = 1200; //波特率1200 ???USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 ???USART_InitStructure.USART_StopBits = USART_StopBits_1; //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; //打開Rx接收和Tx發送功能 ???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);// 若接收數據寄存器滿,則產生中斷 ???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); //啟動串口 ???USART_Cmd(USART2, ENABLE); ???USART_Cmd(USART3, ENABLE); ???USART_Cmd(UART4, ENABLE);
??//-----如下語句解決第1個字節無法正確發送出去的問題-----//? ???USART_ClearFlag(USART1, USART_FLAG_TC);// 清標志 ???USART_ClearFlag(USART2, USART_FLAG_TC); ???USART_ClearFlag(USART3, USART_FLAG_TC); ???USART_ClearFlag(UART4 , USART_FLAG_TC); } //**********??串口中斷函數??******************** void UART5_IRQHandler(void) { ???uchar x,y,z; ???uint checksum1,checksum2; ???if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) //若接收數據寄存器滿 ??{ ????x=USART_ReceiveData(UART5); ???}? ??Com5TxChar(x); } //------------------------------------------------
void USART1_IRQHandler(void) { ??if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //若接收數據寄存器滿 ???{ ??????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) //若接收數據寄存器滿 ???{ ??????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) //若接收數據寄存器滿 ??{ ?????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) //若接收數據寄存器滿 ??{ ?????Com4RecDat[Com4RecCnt]=USART_ReceiveData(UART4);? ??}? ???Com4RecCnt++; ???Com4RecCnt%=C1_LEN; ???Com4TxChar(USART_ReceiveData(UART4)); } //*****************主函數************************ 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串口通信测试程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。