久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1909|回復: 0
打印 上一主題 下一主題
收起左側

stm32串口空閑中斷,接收一幀數據中斷一次

[復制鏈接]
跳轉到指定樓層
樓主
ID:302293 發表于 2022-6-30 14:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "usart.h"//毫秒級的延時extern u8 rx_done;
extern u8 buf[9];
u8 i;
void init(){GPIO_Config();
NVIC_Configuration();
USART1_Config();
USART2_Config();
}void Reive_data(){buf[0]=rx_buff[0];
buf[1]=rx_buff[1];
buf[2]=rx_buff[2];
buf[3]=rx_buff[3];
buf[4]=rx_buff[4];
buf[5]=rx_buff[6];
buf[6]=rx_buff[6];
buf[7]=rx_buff[7];
buf[8]=rx_buff[8];
}int main()  { init();
   while(1)         {         Reive_data();
          if(rx_done==1)          {                        rx_done=0;
                                for(i=0;
i<9;
i++)                          {                                                                USART_SendData(USART1,buf[ i]);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
                                                                 }                                  }  }}#ifndef __USART_H#define __USART_H#include "stm32f10x.h"uint8_t rx_buff[9];
//接收緩存uint8_t rx_done =0;
//接收完成標志uint8_t rx_cnt=0;
//接收數據長度u8 buf[9];
void delay_ms(u16 nms){u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL=0X00;
//清空計數器SysTick->CTRL=0X01;
//使能,減到零是無動作,采用外部時鐘源do{temp=SysTick->CTRL;
//讀取當前倒計數值}while((temp&0x01)&&(!(temp&(1<<16))));
//等待時間到達SysTick->CTRL=0x00;
//關閉計數器SysTick->VAL =0X00;
//清空計數器}void GPIO_Config(void)  { GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
/*使能SWD 禁用JTAG*/        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_Write(GPIOB,x);
2//        ReadValue = GPIO_ReadOutputData(GPIOB);
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}void TIM3_PWM_Init(u16 arr,u16 psc){          GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        //使能定時器3時鐘//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);
//使能GPIO外設和AFIO復用功能模塊時鐘使能        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
// 不開AFIO也可以    //設置該引腳為復用輸出功能,輸出TIM2 CH3的PWM脈沖波形        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
//TIM_CH1(通道1就是PA6)        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  //復用推挽輸出。這句好關鍵啊。。。。        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
   //初始化TIM2        TIM_TimeBaseStructure.TIM_Period = arr;
   //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值        TIM_TimeBaseStructure.TIM_Prescaler =psc;
//設置用來作為TIMx時鐘頻率除數的預分頻值         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
//設置時鐘分割:TDTS = Tck_tim        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  //TIM向上計數模式        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
                 //初始化TIM2 Channel3 PWM模式                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
//選擇定時器模式:TIM脈沖寬度調制模式2 必須是2          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//比較輸出使能,使能PWM輸出到端口。//        TIM_OCInitStructure.TIM_Pulse=127;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
//輸出極性:TIM輸出比較極性        TIM_OC2Init(TIM3, &TIM_OCInitStructure);
//使能通道1        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  //使能TIM2在CCR2上的預裝載寄存器         TIM_ARRPreloadConfig(TIM3, ENABLE);
                //使能TIMx在ARR上的預裝載寄存器        TIM_Cmd(TIM3, ENABLE);
  //使能TIM3總開關}   void steerl(u8 d){   if(d==0){TIM_SetCompare2(TIM3,1500);
}//輸出PWM舵機轉0度  舵機松開    if(d==1){TIM_SetCompare2(TIM3,7500);
}//輸出PWM舵機轉180度 舵機夾取}  static void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//嵌套向量中斷控制器組選擇NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
//配置USART為中斷源NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
//搶斷優先級NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
//子優先級NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//使能中斷NVIC_Init(&NVIC_InitStructure);
//初始化配置NVIC}void USART1_Config(void){GPIO_InitTypeDef  GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//使能串口GPIO的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//使能串口外設的時鐘GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
//將USART1?Tx的GPIO配置為推挽復用模式GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
//將USART1?Rx的GPIO配置為浮空輸入模式GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=115200;
//配置波特率115200USART_InitStructure.USART_WordLength=USART_WordLength_8b;
//配置數據字長8bitUSART_InitStructure.USART_StopBits=USART_StopBits_1;
//配置停止位1bitUSART_InitStructure.USART_Parity=USART_Parity_No;
//校驗位無USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
//硬件流控制無USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
//同時收發模式USART_Init(USART1,&USART_InitStructure);
//完成串口的初始化配置NVIC_Configuration();
//串口中斷優先級配置USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//使能串口接收中斷USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
//空閑中斷使能USART_Cmd(USART1,ENABLE);
//使能串口}void USART2_Config(void){  //GPIO端口設置  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        //使能USART2,GPIOB時鐘//USART2_TX   GPIOB10.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        //復用推挽輸出          GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化PB10                     //USART12_RX          GPIOB.11初始化          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//浮空輸入          GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化PB11    //Usart2 NVIC 配置        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;
//搶占優先級0        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
                //子優先級3        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                        //IRQ通道使能        NVIC_Init(&NVIC_InitStructure);
        //根據指定的參數初始化VIC寄存器     //USART 初始化設置         USART_InitStructure.USART_BaudRate = 115200;
//串口波特率        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//字長為8位數據格式        USART_InitStructure.USART_StopBits = USART_StopBits_1;
//一個停止位        USART_InitStructure.USART_Parity = USART_Parity_No;
//無奇偶校驗位        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//無硬件數據流控制        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        //收發模式           USART_Init(USART2, &USART_InitStructure);
//初始化串口2          // USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
//開啟串口2接受中斷          USART_Cmd(USART2, ENABLE);
                    //使能串口2                 }
                    
void USART1_IRQHandler(void){  uint8_t temp;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收到一個字節,進入一次接收中斷 { USART_ClearITPendingBit(USART1,USART_IT_RXNE);
//清除接收中斷標志                  rx_buff[rx_cnt++]=USART_ReceiveData(USART1);
//將接收的數據存入rx_buff中                 // if(rx_cnt>=9) rx_cnt=0;
//每包數據不能超過接收buff的總長度       }if(USART_GetITStatus(USART1,USART_IT_IDLE)!=RESET)//接收完數據后進入空閑中斷{USART_ClearITPendingBit(USART1,USART_IT_IDLE);
//這條語句是無效的temp=USART1->SR;
//先讀SR,再讀DR才能完成idle中斷的清零,否則會一直進入中斷。temp=USART1->DR;
rx_done =1;
//檢測到空閑狀態,置位接收完成位if(rx_done==1) GPIO_SetBits(GPIOC,GPIO_Pin_13);
else{GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}rx_cnt=0;
}}#endif
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷五月色综合香五月 | 欧美精选一区二区 | 国产精品久久久久久久久久久免费看 | 国产成人在线播放 | 一区二区三区不卡视频 | 亚洲成人一区二区 | 日韩日韩日韩日韩日韩日韩日韩 | 国产精品亚洲成在人线 | 不卡一区| 日韩欧美在线一区 | 国产96色在线 | 亚洲一区二区三区免费在线观看 | 亚洲精品第一国产综合野 | 国产精品久久久久久久久久久久久久 | 日韩欧美在线视频 | 999热精品| 亚洲欧美国产精品久久 | 中文字幕一区二区三区在线观看 | 亚洲aⅴ | 黄网站免费观看 | 成年人的视频免费观看 | 欧美一区二区三区在线 | 国产欧美精品一区二区色综合 | 欧美视频三级 | 久久亚洲国产 | 久久久精品黄色 | 狠狠色综合久久婷婷 | 久久99蜜桃综合影院免费观看 | 国产成人免费观看 | 日韩一区二区在线视频 | 成人免费看片又大又黄 | 99精品电影 | 成人在线一区二区三区 | 又爽又黄axxx片免费观看 | 欧美精品福利视频 | 亚洲欧洲日韩 | 欧美精品1区2区3区 免费黄篇 | 久久y| 色黄网站 | 96国产精品久久久久aⅴ四区 | 91玖玖|