//通過(guò)判斷接收連續(xù)2個(gè)字符之間的時(shí)間差不大于10ms來(lái)決定是不是一次連續(xù)的數(shù)據(jù). //如果2個(gè)字符接收間隔超過(guò)10ms,則認(rèn)為不是1次連續(xù)數(shù)據(jù).也就是超過(guò)10ms沒(méi)有接收到 //任何數(shù)據(jù),則表示此次接收完畢. //接收到的數(shù)據(jù)狀態(tài) //[15]:0,沒(méi)有接收到數(shù)據(jù);1,接收到了一批數(shù)據(jù). //[14:0]:接收到的數(shù)據(jù)長(zhǎng)度 vu16 USART3_RX_STA=0; 一,。uart3.c中的函數(shù) 1. 初始化串口3 //初始化IO 串口3 //pclk1:PCLK1時(shí)鐘頻率(Mhz) //bound:波特率 void usart3_init(u32 bound) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB時(shí)鐘 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3時(shí)鐘使能 USART_DeInit(USART3); //復(fù)位串口3 //USART3_TX PB10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10 //USART3_RX PB11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11 USART_InitStructure.USART_BaudRate = bound;//波特率一般設(shè)置為9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個(gè)停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//無(wú)奇偶校驗(yàn)位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無(wú)硬件 數(shù)據(jù)流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式 USART_Init(USART3, &USART_InitStructure); //初始化串口3 USART_Cmd(USART3, ENABLE); //使能串口 //使能接收中斷 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開(kāi)啟中斷 //設(shè)置中斷優(yōu)先級(jí) NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//搶占優(yōu)先級(jí)3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優(yōu)先級(jí)3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器 //////////////////////////////////////////////////////////////////////////////////////////////////////// //定時(shí)器7定為10ms中斷,檢測(cè)如果10ms內(nèi)接收到的數(shù)據(jù)為同一個(gè)數(shù)據(jù)包中的數(shù)據(jù),,如果超過(guò)10ms 就算這次接收完成,。 TIM7_Int_Init(1000-1,7200-1); //10ms中斷 USART3_RX_STA=0; //清零 TIM_Cmd(TIM7,DISABLE); //關(guān)閉定時(shí)器7 } 2.串口3中斷函數(shù) void USART3_IRQHandler(void) { u8 res; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到數(shù)據(jù) { res =USART_ReceiveData(USART3); if((USART3_RX_STA&(1<<15))==0)//接收完的一批數(shù)據(jù),還沒(méi)有被處理,則不再接收其他數(shù)據(jù) { if(USART3_RX_STA //還可以接收數(shù)據(jù) { TIM_SetCounter(TIM7,0); //計(jì)數(shù)器清空,,定時(shí)器7開(kāi)始下一次定時(shí) if(USART3_RX_STA==0) //使能定時(shí)器7的中斷 { TIM_Cmd(TIM7,ENABLE);//使能定時(shí)器7 } USART3_RX_BUF[USART3_RX_STA++]=res; //記錄接收到的值 }else { USART3_RX_STA|=1<<15; //強(qiáng)制標(biāo)記接收完成 } } } } 3. 串口2的printf函數(shù) //串口3,printf 函數(shù) //確保一次發(fā)送數(shù)據(jù)不超過(guò)USART3_MAX_SEND_LEN字節(jié) void u3_printf(char* fmt,...) { u16 i,j; va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); va_end(ap); i=strlen((const char*)USART3_TX_BUF); //此次發(fā)送數(shù)據(jù)的長(zhǎng)度 for(j=0;j //循環(huán)發(fā)送數(shù)據(jù) { while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循環(huán)發(fā)送,直到發(fā)送完畢 USART_SendData(USART3,USART3_TX_BUF[j]); } } 4.串口3printf函數(shù)的引用 u3_printf("%s",p); //發(fā)送該數(shù)據(jù)到WIFI模塊 u3_printf("%s\r\n",cmd); //發(fā)送命令 二。timer.c中定時(shí)器7的設(shè)置 1. 初始化 //通用定時(shí)器7中斷初始化 //這里時(shí)鐘選擇為APB1的2倍,,而APB1為42M //arr:自動(dòng)重裝值,。 //psc:時(shí)鐘預(yù)分頻數(shù) //定時(shí)器溢出時(shí)間計(jì)算方法:Tout=((arr+1)*(psc+1))/Ft us. //Ft=定時(shí)器工作頻率,單位:Mhz //通用定時(shí)器中斷初始化 //這里始終選擇為APB1的2倍,而APB1為36M //arr:自動(dòng)重裝值,。 //psc:時(shí)鐘預(yù)分頻數(shù) void TIM7_Int_Init(u16 arr,u16 psc) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);//TIM7時(shí)鐘使能 //定時(shí)器TIM7初始化 TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的 值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來(lái)作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式 TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位 TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE ); //使能指定的TIM7中斷,允許更新中斷 TIM_Cmd(TIM7,ENABLE);//開(kāi)啟定時(shí)器7 NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//搶占優(yōu)先級(jí)0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子優(yōu)先級(jí)2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器 } 二,。定時(shí)器7的中斷函數(shù) //定時(shí)器7中斷服務(wù)程序 void TIM7_IRQHandler(void) { if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)//是更新中斷 { USART3_RX_STA|=1<<15; //標(biāo)記接收完成 TIM_ClearITPendingBit(TIM7, TIM_IT_Update ); //清除TIM7更新中斷標(biāo)志 TIM_Cmd(TIM7, DISABLE); //關(guān)閉TIM7 } } 分享些資料便于后期的學(xué)習(xí)參考 (stm32串口應(yīng)用) |
|
來(lái)自: 人生如戲ds3xoc > 《文件夾1》