繼前貼http://www.zg4o1577.cn/bbs/dpj-213781-1.html,今天發布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 USART3_TIMEOUT_Setting 800 //(ms)
15
16 u8 USART3_RX_BUF[250];
17 u16 USART3_RX_CNT=0;
18 u16 USART3_RX_TIMEOUT=0; //接收狀態標記
19
20 void Timer1CountInitial(void);
21
22 void USART3_Init(u32 baud)
23 {
24 USART_InitTypeDef USART_InitStructure;
25 NVIC_InitTypeDef NVIC_InitStructure;
26 GPIO_InitTypeDef GPIO_InitStructure; //聲明一個結構體變量,用來初始化GPIO
27 //使能串口的RCC時鐘
28 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能UART3所在GPIOB的時鐘
29 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
30
31 //串口使用的GPIO口配置
32 // Configure USART3 Rx (PB.11) as input floating
33 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
34 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
35 GPIO_Init(GPIOB, &GPIO_InitStructure);
36
37 // Configure USART3 Tx (PB.10) as alternate function push-pull
38 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
39 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
40 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
41 GPIO_Init(GPIOB, &GPIO_InitStructure);
42
43 //配置串口
44 USART_InitStructure.USART_BaudRate = baud;
45 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
46 USART_InitStructure.USART_StopBits = USART_StopBits_1;
47 USART_InitStructure.USART_Parity = USART_Parity_No;
48 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
49 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
50
51
52 // Configure USART3
53 USART_Init(USART3, &USART_InitStructure);//配置串口3
54 // Enable USART3 Receive interrupts 使能串口接收中斷
55 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
56 // Enable the USART3
57 USART_Cmd(USART3, ENABLE);//使能串口3
58
59 //串口中斷配置
60 //Configure the NVIC Preemption Priority Bits
61 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
62
63 // Enable the USART3 Interrupt
64 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
65 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優先級3
66 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子優先級3
67 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
68 NVIC_Init(&NVIC_InitStructure);
69
70 }
71
72 void USART3_Sned_Char(u8 temp)
73 {
74 USART_SendData(USART3,(u8)temp);
75 while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
76
77 }
78
79 void USART3_Sned_Char_Buff(u8 buf[],u32 len)
80 {
81 u32 i;
82 for(i=0;i<len;i++)
83 USART3_Sned_Char(buf[ i]);
84
85 }
86
87 void main(void)
88 {
89 Timer1CountInitial();
90 Usart3_Init(9600);//串口1波特率設置為9600
91 while(1)
92 {
93 if(USART3_RX_TIMEOUT==USART3_TIMEOUT_Setting)
94 {
95 USART3_RX_TIMEOUT=0;
96 USART3_Sned_Char_Buff(USART3_RX_BUF,USART3_RX_CNT);//將接收到的數據發送出去
97 USART3_RX_CNT=0;
98 }
99
100 }
101 }
102 void USART3_IRQHandler(void) //串口3中斷服務程序
103 {
104 u8 Res;
105 if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
106 {
107 USART3_RX_TIMEOUT=0;
108 USART3_RX_BUF[USART3_RX_CNT++] = USART_ReceiveData(USART3); //讀取接收到的數據
109 }
110 //溢出-如果發生溢出需要先讀SR,再讀DR寄存器則可清除不斷入中斷的問題
111 if(USART_GetFlagStatus(USART3,USART_FLAG_ORE) == SET)
112 {
113 USART_ReceiveData(USART3);
114 USART_ClearFlag(USART3,USART_FLAG_ORE);
115 }
116 USART_ClearITPendingBit(USART3, USART_IT_RXNE);
117
118 }
119
120 //放到主函數的初始化中初始化
121 void Timer1CountInitial(void)
122 {
123 //定時=36000/72000x2=0.001s=1ms;
124 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
125 ///////////////////////////////////////////////////////////////
126 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
127
128 TIM_TimeBaseStructure.TIM_Period = 100-1;//自動重裝值(此時改為10ms)
129 TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;//時鐘預分頻
130 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計數
131 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //時鐘分頻1
132 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
133 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
134
135 TIM_ClearFlag(TIM1,TIM_FLAG_Update);
136 TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
137 TIM_Cmd(TIM1, ENABLE);
138 }
139 void TIM1_UP_IRQHandler(void)
140 {
141 //TIM_TimeBaseStructure.TIM_Period = 100-1;//自動重裝值(此時改為10ms)
142 if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
143 {
144 if(USART3_RX_TIMEOUT<USART3_TIMEOUT_Setting)
145 USART3_RX_TIMEOUT++;
146 }
147 TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
148 }
|