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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32F103系列 TIM1~TIM8庫函數初始化代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:882327 發表于 2021-2-2 16:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近在做一個工程要用到多個串口同時通訊的,就參考了正點原子的串口通訊例程,發現例程是USART1 串口1的,后面我想改成USART2 串口2的,上網找了資料,要不是不靠譜,要不就是要積分下載。所以后面自己寫了一個可用程序來和大家分享!廢話不多說!貼代碼!本博文正文.c文件
    #include "usart2.h"
    void USART2_Init(u32 My_BaudRate)
    {
            GPIO_InitTypeDef GPIO_InitStrue;
            USART_InitTypeDef USART_InitStrue;
            NVIC_InitTypeDef NVIC_InitStrue;
            // 外設使能時鐘
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
            USART_DeInit(USART2);  //復位串口2 -> 可以沒有
            // 初始化 串口對應IO口  TX-PA2  RX-PA3
            GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
            GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;
            GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
            GPIO_Init(GPIOA,&GPIO_InitStrue);
            GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
            GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;
      GPIO_Init(GPIOA,&GPIO_InitStrue);
            // 初始化 串口模式狀態
            USART_InitStrue.USART_BaudRate=My_BaudRate; // 波特率
            USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; // 硬件流控制
            USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; // 發送 接收 模式都使用
            USART_InitStrue.USART_Parity=USART_Parity_No; // 沒有奇偶校驗
            USART_InitStrue.USART_StopBits=USART_StopBits_1; // 一位停止位
            USART_InitStrue.USART_WordLength=USART_WordLength_8b; // 每次發送數據寬度為8位
            USART_Init(USART2,&USART_InitStrue);
            USART_Cmd(USART2,ENABLE);//使能串口
            USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//開啟接收中斷
            // 初始化 中斷優先級
            NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;
            NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
            NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
            NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
            NVIC_Init(&NVIC_InitStrue);
    }
    void USART2_IRQHandler(void) // 串口2中斷服務函數
    {
            u8 res;
            if(USART_GetITStatus(USART2,USART_IT_RXNE)) // 中斷標志
    {
         res= USART_ReceiveData(USART2);  // 串口2 接收
         USART_SendData(USART2,res);   // 串口2 發送
      }
    }
.h文件
    #ifndef __USART2_H
    #define __USART2_H
    #include "stdio.h"      
    #include "sys.h"
    void USART2_Init(u32 My_BaudRate);
    #endif


小伙伴們更新啦!特供串口3代碼,親測可用!順便解決小伙伴提出的接收字符變接收字符串實例。.c文件
    #include "delay.h"
    #include "usart3.h"
    #include "stdarg.h"                  
    #include "stdio.h"                  
    #include "string.h"         
    #include "usart.h"
    #include "stdlib.h"
    //串口接收緩存區        
    u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];                                 //接收緩沖,最大USART3_MAX_RECV_LEN個字節.
    u8  USART3_TX_BUF[USART3_MAX_SEND_LEN];                         //發送緩沖,最大USART3_MAX_SEND_LEN字節
    //通過判斷接收連續2個字符之間的時間差不大于10ms來決定是不是一次連續的數據.
    //如果2個字符接收間隔超過10ms,則認為不是1次連續數據.也就是超過10ms沒有接收到
    //任何數據,則表示此次接收完畢.
    //接收到的數據狀態
    //[15]:0,沒有接收到數據;1,接收到了一批數據.
    //[14:0]:接收到的數據長度
    vu16 USART3_RX_STA=0;         
    void USART3_IRQHandler(void)
    {
            u8 Res;            
            if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到數據
            {         
                    Res =USART_ReceiveData(USART3);         
                    if((USART3_RX_STA&0x8000)==0)//接收完的一批數據,還沒有被處理,則不再接收其他數據
                    {
                        if((USART3_RX_STA&0X7FFF)<USART3_MAX_RECV_LEN)        //還可以接收數據
                                    {
                                            if(Res!='!')
                                            {
                                                    USART3_RX_BUF[USART3_RX_STA++]=Res;        //記錄接收到的值
    //                                                printf("%c\r\n",Res);
                                            }      
              else
                                            {
                                                    USART3_RX_STA|=0x8000;        //則信息接收完成了
                                            }                                       
                                    }
                                    else
                                    {
                                            USART3_RX_STA|=0x8000;        //則信息接收完成了
                                    }
                    }
                    USART3_RX_Data();
            }                                                                                                                           
    }   
    //初始化IO 串口3
    //pclk1:PCLK1時鐘頻率(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時鐘
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3時鐘使能
            USART_DeInit(USART3);  //復位串口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;        //復用推挽輸出
      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;//波特率一般設置為9600;
            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(USART3, &USART_InitStructure); //初始化串口        3
            USART_Cmd(USART3, ENABLE);                    //使能串口
            //使能接收中斷
      USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啟中斷   
            //設置中斷優先級
            NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//搶占優先級3
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子優先級3
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
            NVIC_Init(&NVIC_InitStructure);        //根據指定的參數初始化VIC寄存器
            USART3_RX_STA=0;                //清零
    }
    //串口3,printf 函數
    //確保一次發送數據不超過USART3_MAX_SEND_LEN字節
    void u3_printf(char* fmt,...) //...表示可變參數(多個可變參數組成一個列表,后面有專門的指針指向他),不限定個數和類型
    {  
            u16 i,j;
            va_list ap; //初始化指向可變參數列表的指針
            va_start(ap,fmt); //將第一個可變參數的地址付給ap,即ap指向可變參數列表的開始
            vsprintf((char*)USART3_TX_BUF,fmt,ap); //將參數fmt、ap指向的可變參數一起轉換成格式化字符串,放(char*)USART3_TX_BUF數組中,其作用同sprintf(),只是參數類型不同
            va_end(ap);
            i=strlen((const char*)USART3_TX_BUF);                //此次發送數據的長度
            for(j=0;j<i;j++)                                                        //循環發送數據
            {
              while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循環發送,直到發送完畢   
                    USART_SendData(USART3,USART3_TX_BUF[j]);  //把格式化字符串從開發板串口送出去
            }
    }
    void USART3_RX_Data()
    {
            u8 len=0;
            if(USART3_RX_STA&0x8000)
                    {                                          
                            len=USART3_RX_STA&0X7FFF;//得到此次接收到的數據長度
                            USART3_RX_BUF[len]=0;                 //加入結束符
                            if(len>USART3_MAX_RECV_LEN-2)
                            {
                                    len=USART3_MAX_RECV_LEN-1;
                                    USART3_RX_BUF[len]=0;                 //加入結束符
                            }
                            USART3_RX_BUF[USART3_MAX_RECV_LEN-1]=0x01;
    //                        u3_printf("%s\r\n",USART3_RX_BUF);
                            USART3_RX_STA=0;
                    }
    }


.h文件
    #ifndef __USART3_H
    #define __USART3_H         
    #include "sys.h"  
    #define USART3_MAX_RECV_LEN                60                                        //最大接收緩存字節數
    #define USART3_MAX_SEND_LEN                600                                        //最大發送緩存字節數
    #define USART3_RX_EN                         1                                        //0,不接收;1,接收.
    extern u8  USART3_RX_BUF[USART3_MAX_RECV_LEN];                 //接收緩沖,最大USART3_MAX_RECV_LEN字節
    extern u8  USART3_TX_BUF[USART3_MAX_SEND_LEN];                 //發送緩沖,最大USART3_MAX_SEND_LEN字節
    extern vu16 USART3_RX_STA;                                                   //接收數據狀態
    void usart3_init(u32 bound);                                //串口2初始化
    void u3_printf(char* fmt,...);
    void USART3_RX_Data(void);
    #endif

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品99久久久久久久久久久久 | 国产女人叫床高潮大片免费 | 国产女人与拘做受免费视频 | 国产色网 | 午夜资源 | 国产精品久久久久久久免费大片 | 亚洲精品中文字幕在线观看 | 久久久99国产精品免费 | 一区二区三区日本 | 欧美在线视频一区二区 | 久久久久综合 | www.操.com | 成人在线精品视频 | 欧美精品久久久久久久久久 | 久久精品久久精品久久精品 | 国产日韩视频在线 | 欧美一区二区在线播放 | 久久久久国产精品人 | 国产精品久久久久久久久久免费看 | 成人免费精品 | 黄a在线观看 | 亚洲欧美日韩中文字幕一区二区三区 | 欧美寡妇偷汉性猛交 | 日韩免费一区二区 | 亚洲国产精品99久久久久久久久 | 伊人网91 | 久久高清国产视频 | 狠狠干网站 | 九九热九九 | 在线观看中文字幕 | 毛片a级毛片免费播放100 | 一区二区成人 | 亚洲最大成人综合 | av免费网址 | 伊人伊成久久人综合网站 | 亚洲经典一区 | 欧美中文字幕一区二区三区亚洲 | 在线中文字幕第一页 | 国产精品美女久久久久aⅴ国产馆 | 亚洲精品在线视频 | 欧美一级在线观看 |