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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2428|回復: 0
收起左側

串口四的配置(初始化+中斷配置+中斷接收函數)

[復制鏈接]
ID:110875 發表于 2021-11-29 21:38 | 顯示全部樓層 |閱讀模式
今天發布STM32的串口3配置程序,話不多說。
1 /*===============================================================================  2 Copyright:  3 Version:  4 Author:      5 Date: 2017/11/3  6 Description:  7     函數功能是將接收固定長度的字符串,并將接收后的字符串通過串口發送出去  8     通過滴答定時器方式獲取數據  9 revise Description: 10 ===============================================================================*/
11 #include "stm32f10x_usart.h"
12 #include "stm32f10x.h"
13
14 #define USART4_TIMEOUT_Setting 800  //(ms)
15
16 u8 USART4_RX_BUF[250];  17 u16 USART4_RX_CNT=0; 18 u16 USART2_RX_STA=0;       //接收狀態標記
19
20 void Systick_delay_init(u8 SYSCLK); 21 u8 virtual_delay(u32 num,u8 unit); 22
23 //通用異步收發器UART4
24 void UART4_Init(u32 bound) 25 { 26     USART_InitTypeDef USART_InitStructure; 27     GPIO_InitTypeDef GPIO_InitStructure; 28
29     //used for USART3 full remap 30     //GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE);
31     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); 32     RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);//for UART4 33
34     //Configure RS485_TX_EN PIN
35     GPIO_InitStructure.GPIO_Pin = RS485_TX_EN_PIN;                 //PC9端口配置
36     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽輸出
37     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 38     GPIO_Init(RS485_TX_EN_PORT, &GPIO_InitStructure); 39
40     RS485_TX_EN=0;            //設置485默認為接收模式
41
42     /* Configure USART Tx as alternate function push-pull */
43     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 44     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 45     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 46     GPIO_Init(GPIOC, &GPIO_InitStructure); 47
48     /* Configure USART Rx as input floating */
49     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11; 50     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 51     GPIO_Init(GPIOC, &GPIO_InitStructure); 52
53
54     USART_InitStructure.USART_BaudRate = bound; 55     USART_InitStructure.USART_WordLength = USART_WordLength_8b; 56     USART_InitStructure.USART_StopBits = USART_StopBits_1; 57     USART_InitStructure.USART_Parity = USART_Parity_No ; 58     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 59     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 60
61     USART_Init(UART4, &USART_InitStructure); 62     //USART_Init(USART3, &USART_InitStructure);
63     /* Enable the USART */
64     USART_Cmd(UART4, ENABLE); 65     USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//開啟串口接受中斷
66     USART_ClearFlag(UART4,USART_FLAG_TC);     67 } 68 //USART1查詢接收到的數據 69 //buf:接收緩存首地址 70 //len:讀到的數據長度
71 void UART4_Receive_Data(u8 *buf) 72 { 73     u8 rxlen=21; 74     u8 i=0; 75     delay_ms(10);        //等待10ms,連續超過10ms沒有接收到一個數據,則認為接收結束
76     
77     RS485_RX_FLAG = 0; 78     if((UART4_RX_BUF[0]==0x01)&&(UART4_RX_BUF[1]==0x03)) 79     { 80         for(i=0;i<rxlen;i++) 81         { 82             buf[ i]=UART4_RX_BUF[ i];    [ i] 83             UART4_RX_BUF[ i] = 0; 84         }     85         RS485_RX_FLAG = 1; 86     } 87         UART4_RX_CNT=0;        //清零
88 } 89
90
91 //USART1發送len個字節. 92 //buf:發送區首地址 93 //len:發送的字節數(為了和本代碼的接收匹配,這里建議不要超過64個字節)
94 void UART4_Send_Data(u8 *buf,u16 len) 95 { 96     u16 t; 97     RS485_TX_EN=1;            //設置為發送模式
98     for(t=0;t<len;t++)        //循環發送數據
99     {           100         while(USART_GetFlagStatus(UART4,USART_FLAG_TC)==RESET); //循環發送,直到發送完畢   
101         USART_SendData(UART4,buf[t]); 102     }     103     while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET);        104     RS485_TX_EN=0;                //設置為接收模式   
105 }106
107 void main(void)108 {109     Systick_delay_init(72);110     Usart4_Init(9600);//串口1波特率設置為9600
111     while(1)112     {113         if(USART2_RX_STA)114         {115             if(virtual_delay(USART4_TIMEOUT_Setting,MS))//超過800ms空閑則可以讀取數據
116             {117                 UART4_Send_Data(UART4_RX_BUF,UART4_RX_CNT);118                 USART2_RX_STA=0;119                 UART4_RX_CNT=0;                120             }121            
122         }123         
124     }    125 }126 void UART4_IRQHandler(void)                    //UART4 Receive Interrupt
127 {128     u8 Res;129     
130     if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數據必須是0x0d 0x0a結尾)
131     {    132         Res =USART_ReceiveData(UART4);//(USART1->DR);    //讀取接收到的數據   
133         UART4_RX_BUF[UART4_RX_CNT&0XFF]=Res;        //回傳的數據存入數組,0X3F限制為64個數值
134             UART4_RX_CNT++;135         USART2_RX_STA=1;    136     }137     
138     if( USART_GetITStatus(UART4, USART_IT_TC) == SET )139     {140         USART_ClearFlag(UART4, USART_FLAG_TC);141     }    142     //溢出-如果發生溢出需要先讀SR,再讀DR寄存器則可清除不斷入中斷的問題
143     if(USART_GetFlagStatus(UART4,USART_FLAG_ORE) == SET)144     {145         USART_ReceiveData(UART4);146         USART_ClearFlag(UART4,USART_FLAG_ORE);147     }148 //    USART_ITConfig(UART4, USART_IT_RXNE, DISABLE);//臨時關閉接收中斷
149     USART_ClearFlag(UART4,USART_IT_RXNE); //一定要清除接收中斷
150     
151 } 152
153 //初始化延遲函數154 //SYSTICK的時鐘固定為HCLK時鐘的1/8155 //SYSCLK:系統時鐘
156 void Systick_delay_init(u8 SYSCLK)157 {158     SysTick->CTRL&=0xfffffffb;//bit2清空,選擇外部時鐘  HCLK/8159 //    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    //選擇外部時鐘  HCLK/8
160     fac_us=SYSCLK/8;            161     fac_ms=(u16)fac_us*1000;162 }163 /*===============================================================================164 Author:peter pan165 Date: 166 Description: 查詢式分時或叫做輪詢式(近似延時)。本函數是用于執行高效率場合的查詢延時,但是一個for or while 循環中只能用一次。167 revise Description:  168 @ num :    //分時查詢的周期計數值    169 @ unit :    //分時查詢的周期單位 170     @@ParaValue : 171         MS    //周期單位為MS毫秒級172         US    //周期單位為US微秒級173 @ virtual_delay_status :    //靜態變量174     @@ParaValue : 175         SET    //SYSTICK正在占用中,請勿用176         RESET  //SYSTICK空閑,可以使用177 @ReValue :178     with zero mean Time non-arrive ,one representative Time arrived ,you can do task;179 ##example             if(virtual_delay(1000,MS)) LedFlash();    //1000ms LED閃爍一下180 ===============================================================================*/
181 u8 virtual_delay(u32 num,u8 unit)182 {183     u32 temp;           184     if(virtual_delay_status==RESET)    //  SYSTICK空閑,可以使用
185       {186           if(unit==MS)187           {188                 SysTick->LOAD=(u32)num*Delay_SYSCLK*125;//時間加載(SysTick->LOAD為24bit)
189                 SysTick->VAL =0x00;           //清空計數器
190                 SysTick->CTRL=0x01 ;          //開始倒數  
191           }else if(unit==US) 192           {193                 SysTick->LOAD=num*Delay_SYSCLK/8; //時間加載               
194                 SysTick->VAL=0x00;        //清空計數器
195                 SysTick->CTRL=0x01 ;      //開始倒數     
196           }197           virtual_delay_status=SET;198           return 0;199         }200     else
201         {        //virtual_delay_status==SET SYSTICK被占用
202         
203             temp=SysTick->CTRL;204             if(!(temp&0x01&&!(temp&(1<<16))))//等待時間到達   
205             {206                 SysTick->CTRL=0x00;       //關閉計數器
207                 SysTick->VAL =0X00;       //清空計數器   
208                 virtual_delay_status=RESET;    209                 return 1;210             }else return 0;211         }212 }
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线 | 一二区成人影院电影网 | a级片在线 | 精品久久久久久国产 | 国产特级毛片 | 欧美性生活一区二区三区 | 福利视频一区二区三区 | 欧美精品二区三区 | 婷婷激情综合 | 国产综合av | 国产在线精品一区二区 | 在线 丝袜 欧美 日韩 制服 | 黄色一级大片在线观看 | 日本特黄a级高清免费大片 成年人黄色小视频 | 日韩免费福利视频 | 91精品国产日韩91久久久久久 | 91毛片在线观看 | 视频国产一区 | 国产农村妇女毛片精品久久麻豆 | 日本精品视频 | 99精品一区二区 | 精品成人免费视频 | 综合伊人 | 亚洲精品一区二三区不卡 | 成人黄色av网址 | 蜜桃av一区二区三区 | 欧美日韩在线播放 | 日韩精品 电影一区 亚洲 | 日韩免费1区二区电影 | 在线视频亚洲 | 看片91| 视频在线一区二区 | 亚洲国产成人精品女人 | 久在线视频播放免费视频 | www狠狠爱com | 国产精品视频久久久 | 成人免费在线电影 | 国产视频一二三区 | 国产成人99久久亚洲综合精品 | av片在线观看 | 欧美黑人一级爽快片淫片高清 |