久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
串口四的配置(初始化+中斷配置+中斷接收函數)
[打印本頁]
作者:
13118302007
時間:
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 }
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美精品一区在线
|
久久午夜精品
|
国产精品国产三级国产aⅴ浪潮
|
亚洲人成网站777色婷婷
|
99热这里都是精品
|
日韩一二区
|
亚洲一区二区三区桃乃木香奈
|
欧美精品在线一区
|
91精品国产92
|
91视频在线观看免费
|
日韩成人在线免费视频
|
亚洲三级在线
|
午夜电影一区二区
|
性一交一乱一透一a级
|
亚洲欧美日韩久久
|
日韩av一区二区在线
|
一区二区免费高清视频
|
在线成人免费视频
|
久久久久国产一区二区三区四区
|
91成人精品视频
|
国产日韩欧美91
|
久久久精品网站
|
亚洲成人精品
|
精品一区二区三区四区在线
|
亚洲国产精品久久久久
|
欧美日韩久久久
|
亚洲精品久久久久中文字幕欢迎你
|
亚洲乱码一区二区三区在线观看
|
日韩精品一区二区三区
|
羞羞视频网页
|
欧美久久视频
|
国产不卡在线观看
|
亚洲狠狠
|
国产黄色网址在线观看
|
国产成人免费视频网站高清观看视频
|
亚洲综合色婷婷
|
欧美性大战久久久久久久蜜臀
|
国产做爰
|
国产在线精品一区
|
犬夜叉在线观看
|
97超级碰碰
|