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

標題: STM32串口配置(串口二的配置=初始化+中斷配置+中斷接收函數) [打印本頁]

作者: 13118302007    時間: 2021-11-1 21:49
標題: STM32串口配置(串口二的配置=初始化+中斷配置+中斷接收函數)
繼上貼http://m.zg4o1577.cn/bbs/dpj-213781-1.html,今天發布STM32的串口2配置程序,話不多說。

1 /*===============================================================================
  2 Copyright:
  3 Version:
  4 Author:   
  5 Date: 2021/11/1
  6 Description:
  7     函數功能是將接收固定長度的字符串,并將接收后的字符串通過串口發送出去
  8 revise Description:
  9 ===============================================================================*/
10 #include "stm32f10x_usart.h"
11 #include "stm32f10x.h"
12 #include "stm32f10x_iwdg.h"
13
14
15 u8 USART2_RX_BUF[250];
16 u8 USART2_RX_CNT=0;
17 u16 USART2_RX_STA=0;       //接收狀態標記   
18
19 void Usart2_Init(u32 bound)
20 {  
21     GPIO_InitTypeDef GPIO_InitStructure;
22     USART_InitTypeDef USART_InitStructure;
23     NVIC_InitTypeDef NVIC_InitStructure;
24     //|RCC_APB2Periph_AFIO
25     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA時鐘
26     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時鐘
27
28     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    //PA2
29     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //復用推挽
30     GPIO_Init(GPIOA, &GPIO_InitStructure);
31
32     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
33     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
34     GPIO_Init(GPIOA, &GPIO_InitStructure);  
35
36     RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//復位串口2
37     RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止復位
38
39     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級   0-3;
40     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中斷
41     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占優先級2級
42     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優先級2級
43     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
44     NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
45
46     USART_InitStructure.USART_BaudRate = bound;//波特率設置
47     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位數據長度
48     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
49     USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校驗位
50     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
51     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收發模式
52
53     USART_Init(USART2, &USART_InitStructure); ; //初始化串口
54     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//開啟中斷
55     USART_Cmd(USART2, ENABLE);                    //使能串口
56
57 }
58 /**
59 * USART2發送len個字節.
60 * buf:發送區首地址
61 * len:發送的字節數(為了和本代碼的接收匹配,這里建議不要超過64個字節)
62 **/
63 void USART2_Send_Data(u8 *buf,u16 len)
64 {
65     u16 t;
66       for(t=0;t<len;t++)        //循環發送數據
67     {           
68         while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);      
69         USART_SendData(USART2,buf[t]);
70     }     
71     while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);         
72 }
73 /**
74 * 這也是一個接收函數,可以用,也可以用下面main函數的方法調用
75 * USART2查詢接收到的數據
76 * buf:接收緩存首地址
77 * len:讀到的數據長度
78 **/
79 void USART2_Receive_Data(u8 *buf)
80 {
81     u8 rxlen=USART2_RX_CNT;
82     u8 i=0;
83     delay_ms(10);        //等待10ms,連續超過10ms沒有接收到一個數據,則認為接收結束
84     while(rxlen!=USART2_RX_CNT)
85     {
86         rxlen=USART2_RX_CNT;
87         delay_ms(10);
88     }
89         for(i=0;i<(USART2_RX_CNT);i++)
90         {
91             buf[ i] = USART2_RX_BUF[ i];   
92             USART2_RX_BUF[ i] = 0;
93         }        
94         USART2_RX_CNT=0;        //清零
95     
96 }
97
98 void main(void)
99 {
100     Usart2_Init(9600);//串口1波特率設置為9600
101     while(1)
102     {
103         if(USART2_RX_STA)//數據接收完成
104         {
105             USART2_RX_STA=0;            
106             //將接收到的數據發送出去
107             USART2_Send_Data(USART2_RX_BUF,USART2_RX_CNT);//通過串口1將接收到的固定長度字符發送出去   
108             USART2_RX_CNT=0;//指針復位
109         }
110     }   
111 }
112
113
114 void USART2_IRQHandler(void)
115 {
116     u8 res;        
117      if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到數據
118     {         
119         res =USART_ReceiveData(USART2);     //讀取接收到的數據        
120         if(USART2_RX_STA==0)
121         {
122             USART2_RX_BUF[USART2_RX_CNT] = res;        //記錄接收到的值   
123             //當數據結尾收到0xA0和0xA1代表數據接收完成,是一串完整的數據
124             if(USART2_RX_BUF[USART2_RX_CNT-1]==0xA0&&USART2_RX_BUF[USART2_RX_CNT]==0xA1)
125                 USART2_RX_STA=1;//表示接收數據結束
126             USART2_RX_CNT++;                        //接收數據增加1
127         }
128         }
129     }  
130     //溢出-如果發生溢出需要先讀SR,再讀DR寄存器則可清除不斷入中斷的問題
131     if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET)
132     {
133         USART_ReceiveData(USART2);
134         USART_ClearFlag(USART2,USART_FLAG_ORE);
135     }
136      USART_ClearFlag(UART2,USART_IT_RXNE); //一定要清除接收中斷   
137 }





歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 三级网站在线播放 | 三级黄色片网站 | 精品一区在线播放 | 在线观看黄网 | aaa亚洲 | 精品国产欧美一区二区三区成人 | 中文在线免费观看 | 国产草草影院 | 伊人久久在线 | 亚洲精品在线视频观看 | 日韩欧美一级片 | 日韩一区二区中文字幕 | 欧美一级做性受免费大片免费 | 日韩欧美自拍 | 色天天综合 | 欧美精品二区三区四区免费看视频 | 欧美性生交 | 91成人在线| 国产成人免费视频 | av超碰在线| 成人在线视频免费观看 | 婷婷在线播放 | 国产精品视频久久 | 欧美91视频 | 欧美成人精品一区 | 欧美一区二区三区在线视频 | 欧美一区二区三区免费 | 成人综合婷婷国产精品久久 | 成年网站在线观看 | 手机看片欧美 | 黄色一级视频网站 | 天天操夜夜骑 | 一级片免费播放 | 日本亚洲精品 | 国产精品成人国产乱一区 | 在线观看欧美日韩 | 国产三级在线免费观看 | 午夜视频一区二区 | 婷婷久久五月天 | h片免费看 | 日韩中文一区 |