7、串口

一、串口综述

1、通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。

它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。

2、使用多缓冲器配置的DMA方式,可以实现高速数据通信。

3、接口通过三个引脚与其他设备连接在一起。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。

RX:接收数据串行输入。通过采样技术来区别数据和噪音,从而恢复数据。

TX :发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。

在单线和智能卡模式里,此I/O 口被同时用于数据的发送和接收。

4、USART功能概述

线在发送或接收前应处于空闲状态 
      一个起始位 
      一个数据字(8或9位),最低有效位在前 
     1或2个的停止位,由此表明数据帧的结束

使用分数波特率发生器—— 12位整数和4位小数的表示方法。 
       一个状态寄存器(USART_SR) 
      数据寄存器(USART_DR) 
      一个波特率寄存器(USART_BRR),12位的整数和4位小数 
     一个智能卡模式下的保护时间寄存器(USART_GTPR)  
     IrDA_RDI: IrDA模式下的数据输入。 
     IrDA_TDO: IrDA模式下的数据输出。 
     nCTS:  清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送。   
     nRTS:  发送请求,若是低电平,表明USART准备好接收数据

5、异步串行通信以字符为单位,即一个字符一个字符地传送 。

6、串行通信的传送速率

传送速率用于说明数据传送的快慢。在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称之为波特率(band rate)。每秒传送一个格式位就是1波特。

1波特=1bps(位/秒)

7、UART配置模式(打差的是支持的)

二、RS232串口

1、串口初始化配置函数

2、串口中断状态查询函数USART_ GetITStatus

3、串口接收数据查询函数

4、串口数据发送函数

5、程序例程:

  1 /*************************************************************************************************************************************
  2 *
  3 *  文件名称:main.c
  4 *  文件功能:主函数文件
  5 *
  6 ***************************************************************************************************************************************/
  7
  8 #include "pbdata.h"//调用自定义公共函数库
  9
 10
 11 /*********************************************************************************
 12 *
 13 * 初始化操作
 14 *
 15 *********************************************************************************/
 16 void RCC_Configuration(void);//系统时钟初始化函数声明
 17 void GPIO_Configuration(void);//GPIO初始化函数声明
 18 void NVIC_Configuration(void);//中断优先级配置函数声明
 19 void USART_Configuration(void);//串口配置函数声明
 20
 21
 22 /********************************************************************************
 23 *
 24 *  函数名称:main(void)
 25 *  函数功能:主函数
 26 *  函数说明:不能用void定义主函数
 27 *
 28 ********************************************************************************/
 29 int main(void)//void不能void定义主函数
 30 {
 31
 32     RCC_Configuration();    //系统时钟初始化
 33
 34     GPIO_Configuration();//端口初始化
 35
 36     USART_Configuration();//串口配置
 37
 38     NVIC_Configuration();//中断优先级配置
 39
 40
 41
 42     while(1);
 43
 44 }
 45
 46
 47
 48
 49 /********************************************************************************
 50 *
 51 *  函数名称:RCC_Configuration(void)
 52 *  函数功能:系统时钟高初始化函数
 53 *
 54 ********************************************************************************/
 55     void RCC_Configuration(void)//系统时钟高初始化函数
 56   {
 57
 58     SystemInit();//系统初始化
 59     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//串口对应GPIO时钟使能
 60         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口时钟使能
 61         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//引脚复用
 62
 63     }
 64
 65
 66
 67 /*******************************************************************************
 68 *
 69 * 函数名称:GPIO_Configuration(void)
 70 * 函数功能:GPIO初始化函数
 71 *
 72 ********************************************************************************/
 73
 74     void GPIO_Configuration(void)//GPIO初始化函数
 75   {
 76
 77
 78 /*串口引脚配置*/
 79         GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量
 80
 81 /*输出引脚配置*/
 82         /*结构体变量赋值*/
 83       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;////引脚配置TX
 84       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
 85         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//发送要配置成复用推挽输出
 86         /*对应的GPIO初始化*/
 87       GPIO_Init(GPIOA,&GPIO_InitStructure);
 88
 89
 90 /*输入引脚配置*/
 91         /*结构体变量赋值*/
 92       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;////引脚配置RX
 93         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收引脚配置成浮空输入
 94         /*对应的GPIO初始化*/
 95       GPIO_Init(GPIOA,&GPIO_InitStructure);
 96
 97
 98   }
 99
100
101 /****************************************************************************
102 *
103 *  函数名称:NVIC_Configuration(void)
104 *  函数功能:配置中断优先级
105 *
106 ****************************************************************************/
107
108 void NVIC_Configuration(void)
109 {
110   NVIC_InitTypeDef NVIC_InitStructure; //定义一个优先级配置结构体变量
111
112   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//分组
113
114   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
115   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级
116   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
117   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
118
119   NVIC_Init(&NVIC_InitStructure);//初始化
120 }
121
122
123 /*********************************************************************************
124 *
125 *  函数名称:
126 *  函数功能:串口配置函数
127 *
128 *********************************************************************************/
129 void USART_Configuration(void)
130 {
131 /*定义串口配置结构体变量*/
132         USART_InitTypeDef USART_InitStructure;//定义一个串口配置结构体变量
133
134
135 /*结构体变量赋值*/
136     USART_InitStructure.USART_BaudRate = 9600;//波特率9600
137     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位宽,8位
138     USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1
139     USART_InitStructure.USART_Parity = USART_Parity_No;//不奇偶校验
140     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//流控禁止
141     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送使能
142
143
144 /*发送串口配置初始化*/
145     USART_Init(USART1, &USART_InitStructure);
146
147
148 /*打开串口接收中断*/
149       USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//当接收到数据时,会产生中断
150
151
152 /*打开串口*/
153     USART_Cmd(USART1,ENABLE);//串口使能,打开
154
155 /*清空中断标志位*/
156     USART_ClearFlag(USART1,USART_FLAG_TC);
157 }
158
159
160
161
162
163
164
165
166
167
168
169
170
171     

  1 /**
  2   ******************************************************************************
  3   * @file GPIO/IOToggle/stm32f10x_it.c
  4   * @author  MCD Application Team
  5   * @version  V3.0.0
  6   * @date  04/06/2009
  7   * @brief  Main Interrupt Service Routines.
  8   *         This file provides template for all exceptions handler and
  9   *         peripherals interrupt service routine.
 10   ******************************************************************************
 11   * @copy
 12   *
 13   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
 14   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
 15   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
 16   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
 17   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
 18   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
 19   *
 20   * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>
 21   */
 22
 23 /* Includes ------------------------------------------------------------------*/
 24 #include "stm32f10x_it.h"
 25 #include "stm32f10x_exti.h"
 26 #include "stm32f10x_rcc.h"
 27 #include "stm32f10x_tim.h"
 28 #include "misc.h"
 29 #include "pbdata.h"
 30
 31 void NMI_Handler(void)
 32 {
 33 }
 34
 35
 36
 37 /**
 38   * @brief  This function handles Hard Fault exception.
 39   * @param  None
 40   * @retval : None
 41   */
 42 void HardFault_Handler(void)
 43 {
 44   /* Go to infinite loop when Hard Fault exception occurs */
 45   while (1)
 46   {
 47   }
 48 }
 49
 50 /**
 51   * @brief  This function handles Memory Manage exception.
 52   * @param  None
 53   * @retval : None
 54   */
 55 void MemManage_Handler(void)
 56 {
 57   /* Go to infinite loop when Memory Manage exception occurs */
 58   while (1)
 59   {
 60   }
 61 }
 62
 63 /**
 64   * @brief  This function handles Bus Fault exception.
 65   * @param  None
 66   * @retval : None
 67   */
 68 void BusFault_Handler(void)
 69 {
 70   /* Go to infinite loop when Bus Fault exception occurs */
 71   while (1)
 72   {
 73   }
 74 }
 75
 76 /**
 77   * @brief  This function handles Usage Fault exception.
 78   * @param  None
 79   * @retval : None
 80   */
 81 void UsageFault_Handler(void)
 82 {
 83   /* Go to infinite loop when Usage Fault exception occurs */
 84   while (1)
 85   {
 86   }
 87 }
 88
 89 /**
 90   * @brief  This function handles SVCall exception.
 91   * @param  None
 92   * @retval : None
 93   */
 94 void SVC_Handler(void)
 95 {
 96 }
 97
 98 /**
 99   * @brief  This function handles Debug Monitor exception.
100   * @param  None
101   * @retval : None
102   */
103 void DebugMon_Handler(void)
104 {
105 }
106
107 /**
108   * @brief  This function handles PendSV_Handler exception.
109   * @param  None
110   * @retval : None
111   */
112 void PendSV_Handler(void)
113 {
114 }
115
116 /**
117   * @brief  This function handles SysTick Handler.
118   * @param  None
119   * @retval : None
120   */
121 void SysTick_Handler(void)
122 {
123 }
124
125
126
127 /****************************************************************************
128 *
129 * 函数名称:void TIM3_IRQHandler(void)
130 * 外部中断处理函数
131 *
132 ****************************************************************************/
133
134
135 void TIM3_IRQHandler(void)
136 {
137     TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
138
139     if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET)
140     {
141         if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)
142         {
143             //LED 熄灭
144            GPIO_SetBits(GPIOB,GPIO_Pin_5);
145         }
146         else
147         {
148            //LED 发光
149            GPIO_ResetBits(GPIOB,GPIO_Pin_5);
150         }
151     }
152
153 }
154
155
156
157
158 /****************************************************************************
159 *
160 * 函数名称:void EXTI9_5_IRQHandler(void)
161 * 外部中断处理函数
162 *
163 ****************************************************************************/
164 void EXTI9_5_IRQHandler(void)
165 {
166   if(EXTI_GetITStatus(EXTI_Line5)==SET)  //判断是否产生了中断
167   {
168        EXTI_ClearITPendingBit(EXTI_Line5);//中断清除
169
170       delay_ms(10);//延时消抖
171
172       if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET) //再次判断,消抖
173       {
174           if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)//如果LED是亮
175           {
176            GPIO_SetBits(GPIOB,GPIO_Pin_5);    //则熄灭
177           }
178           else
179           {
180               GPIO_ResetBits(GPIOB,GPIO_Pin_5);//如果是熄灭的,就亮
181           }
182       }
183   }
184 }
185
186
187
188
189
190
191
192
193
194 /****************************************************************************
195 * ?    ?úvoid EXTI1_IRQHandler(void)
196 * ?    ?úEXTI2???m??
197 * ????ú?
198 * ????ú?
199 * ?    ?ú
200 * ????ú?
201 ****************************************************************************/
202 void EXTI1_IRQHandler(void)
203 {
204
205 }
206
207 /****************************************************************************
208 * ?    ?úvoid EXTI2_IRQHandler(void)
209 * ?    ?úEXTI2???m??
210 * ????ú?
211 * ????ú?
212 * ?    ?ú
213 * ????ú?
214 ****************************************************************************/
215 void EXTI2_IRQHandler(void)
216 {
217
218 }
219
220 /****************************************************************************
221 *
222 * 函数名称:void EXTI3_IRQHandler(void)
223 * 函数功能:外部中断XTI3中断处理函数
224 *
225 ****************************************************************************/
226 void EXTI3_IRQHandler(void)
227 {
228
229
230 }
231
232
233 /****************************************************************************
234 *
235 * 函数名称:USART1_IRQHandler(void)
236 * 函数功能:串口中断1处理函数
237 *
238 ****************************************************************************/
239 void USART1_IRQHandler(void)
240 {
241
242      if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断是否发生了串口中断
243      {
244
245          USART_SendData(USART1,USART_ReceiveData(USART1));//从串口中读取数据,然后发送出去
246
247          while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成,判断标志位
248
249      }
250  }

 1 /*pbdata.h*/
 2 /***************************************************************************************************
 3 *
 4 * 文件名称:pbdata.h
 5 * 文件功能:自定义的函数和全局变量的声明头文件
 6 *
 7 ***************************************************************************************************/
 8
 9 #ifndef _pbdata_H
10 #define _pbdata_H
11
12
13
14
15
16 /********************************************************************
17 *
18 *  调用的头文件放在这里
19 *
20 ********************************************************************/
21 #include "stm32f10x.h"
22 #include "misc.h"
23 #include "stm32f10x_exti.h"
24 #include "stm32f10x_tim.h"
25 #include "stm32f10x_usart.h"
26
27
28
29 /********************************************************************
30 *
31 *  自定义全局变量声明
32 *
33 ********************************************************************/
34 extern u8 dt;
35
36
37
38
39
40 /********************************************************************
41 *
42 *  自定义全函数声明
43 *
44 ********************************************************************/
45 void delay(u32 nCount);
46 void delay_us(u32 nus);
47 void delay_ms(u16 nms);
48
49
50
51
52 #endif

 1 /****************************************************************************************************************
 2 *
 3 * 文件名称:pbdata.c
 4 * 文件功能:自定义函数或者全局变量的初始化
 5 *
 6 ****************************************************************************************************************/
 7
 8 /*头文件声明*/
 9 #include "pbdata.h"
10
11
12
13
14 /********************************************************************************************
15 *
16 * 自定义全局变量
17 *
18 ********************************************************************************************/
19 u8 dt=0;
20
21
22
23
24
25 /******************************************************************************************
26 *
27 * 自定义函数
28 *
29 ******************************************************************************************/
30
31
32
33 /**************************************************
34 *
35 *  函数名称:delay_us(u32 nus)
36 *  函数功能:微秒延时函数
37 *  输入参数:输入值为延时us
38 *
39 ***************************************************/
40 void delay_us(u32 nus)
41 {
42     u32 temp;
43     SysTick->LOAD = 9*nus;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9次
44     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
45     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
46
47     do
48     {
49           temp=SysTick->CTRL;//标志位,等到一直减到0
50          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
51
52     SysTick->CTRL=0x00; //关闭计数器
53     SysTick->VAL =0X00; //清空计数器
54 }
55
56
57
58
59
60
61
62 /***************************************************
63 *
64 * 函数名称:delay_ms(u16 nms)
65 * 函数功能:毫秒级延时
66 * 输入参数:输入值位延时ms
67 *
68 ****************************************************/
69 void delay_ms(u16 nms)
70 {
71     u32 temp;
72     SysTick->LOAD = 9000*nms;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9000次
73     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
74     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
75
76     do
77     {
78           temp=SysTick->CTRL;//标志位,等到一直减到0
79          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
80
81     SysTick->CTRL=0x00; //关闭计数器
82     SysTick->VAL =0X00; //清空计数器
83 }

6、工程下载:

http://download.csdn.net/detail/a1181803348/8745519

三、RS485

1、RS485和RS232不同的是,RS4785是半双工,RS232全双工。因此RS485每次只能接收或发送,通过控制位高低来控制,高发送,低接收。

2、RS485光耦隔离电路

3、程序例程:

  1 /*************************************************************************************************************************************
  2 *
  3 *  文件名称:main.c
  4 *  文件功能:主函数文件
  5 *
  6 ***************************************************************************************************************************************/
  7
  8 #include "pbdata.h"//调用自定义公共函数库
  9
 10
 11 /*********************************************************************************
 12 *
 13 * 初始化操作
 14 *
 15 *********************************************************************************/
 16 void RCC_Configuration(void);//系统时钟初始化函数声明
 17 void GPIO_Configuration(void);//GPIO初始化函数声明
 18 void NVIC_Configuration(void);//中断优先级配置函数声明
 19 void USART_Configuration(void);//串口配置函数声明
 20
 21
 22 /********************************************************************************
 23 *
 24 *  函数名称:main(void)
 25 *  函数功能:主函数
 26 *  函数说明:不能用void定义主函数
 27 *
 28 ********************************************************************************/
 29 int main(void)//void不能void定义主函数
 30 {
 31
 32     RCC_Configuration();    //系统时钟初始化
 33
 34     GPIO_Configuration();//端口初始化
 35
 36     USART_Configuration();//串口配置
 37
 38     NVIC_Configuration();//中断优先级配置
 39
 40     GPIO_ResetBits(GPIOE,GPIO_Pin_5);//指定端口设置低电平,接收数据时拉低,否则一开始就会拉高,不会接收
 41
 42
 43
 44     while(1);
 45
 46 }
 47
 48
 49
 50
 51 /********************************************************************************
 52 *
 53 *  函数名称:RCC_Configuration(void)
 54 *  函数功能:系统时钟高初始化函数
 55 *
 56 ********************************************************************************/
 57     void RCC_Configuration(void)//系统时钟高初始化函数
 58   {
 59
 60     SystemInit();//系统初始化
 61     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//串口对应GPIO时钟使能
 62         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//串口对应GPIO时钟使能,多了一个
 63         RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//串口时钟使能
 64         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//引脚复用
 65
 66     }
 67
 68
 69
 70 /*******************************************************************************
 71 *
 72 * 函数名称:GPIO_Configuration(void)
 73 * 函数功能:GPIO初始化函数
 74 *
 75 ********************************************************************************/
 76
 77     void GPIO_Configuration(void)//GPIO初始化函数
 78   {
 79
 80
 81 /*串口引脚配置*/
 82         GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量
 83
 84 /*输出引脚配置*/
 85         /*结构体变量赋值*/
 86       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置TX
 87       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
 88         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//发送要配置成推挽输出
 89         /*对应的GPIO初始化*/
 90       GPIO_Init(GPIOE,&GPIO_InitStructure);
 91
 92
 93 /*输出引脚配置*/
 94         /*结构体变量赋值*/
 95       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;////引脚配置TX
 96       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
 97         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//发送要配置成复用推挽输出
 98         /*对应的GPIO初始化*/
 99       GPIO_Init(GPIOA,&GPIO_InitStructure);
100
101
102 /*输入引脚配置*/
103         /*结构体变量赋值*/
104       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;////引脚配置RX
105         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收引脚配置成浮空输入
106         /*对应的GPIO初始化*/
107       GPIO_Init(GPIOA,&GPIO_InitStructure);
108
109
110   }
111
112
113 /****************************************************************************
114 *
115 *  函数名称:NVIC_Configuration(void)
116 *  函数功能:配置中断优先级
117 *
118 ****************************************************************************/
119
120 void NVIC_Configuration(void)
121 {
122   NVIC_InitTypeDef NVIC_InitStructure; //定义一个优先级配置结构体变量
123
124   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//分组
125
126   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
127   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级
128   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
129   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
130
131   NVIC_Init(&NVIC_InitStructure);//初始化
132 }
133
134
135 /*********************************************************************************
136 *
137 *  函数名称:
138 *  函数功能:串口配置函数
139 *
140 *********************************************************************************/
141 void USART_Configuration(void)
142 {
143 /*定义串口配置结构体变量*/
144         USART_InitTypeDef USART_InitStructure;//定义一个串口配置结构体变量
145
146
147 /*结构体变量赋值*/
148     USART_InitStructure.USART_BaudRate = 9600;//波特率9600
149     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位宽,8位
150     USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1
151     USART_InitStructure.USART_Parity = USART_Parity_No;//不奇偶校验
152     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//流控禁止
153     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送使能
154
155
156 /*发送串口配置初始化*/
157     USART_Init(USART2, &USART_InitStructure);
158
159
160 /*打开串口接收中断*/
161       USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//当接收到数据时,会产生中断
162
163
164 /*打开串口*/
165     USART_Cmd(USART2,ENABLE);//串口使能,打开
166
167 /*清空中断标志位*/
168     USART_ClearFlag(USART2,USART_FLAG_TC);
169 }
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205     

  1 /**
  2   ******************************************************************************
  3   * @file GPIO/IOToggle/stm32f10x_it.c
  4   * @author  MCD Application Team
  5   * @version  V3.0.0
  6   * @date  04/06/2009
  7   * @brief  Main Interrupt Service Routines.
  8   *         This file provides template for all exceptions handler and
  9   *         peripherals interrupt service routine.
 10   ******************************************************************************
 11   * @copy
 12   *
 13   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
 14   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
 15   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
 16   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
 17   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
 18   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
 19   *
 20   * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>
 21   */
 22
 23 /* Includes ------------------------------------------------------------------*/
 24 #include "stm32f10x_it.h"
 25 #include "stm32f10x_exti.h"
 26 #include "stm32f10x_rcc.h"
 27 #include "stm32f10x_tim.h"
 28 #include "misc.h"
 29 #include "pbdata.h"
 30
 31 void NMI_Handler(void)
 32 {
 33 }
 34
 35
 36
 37 /**
 38   * @brief  This function handles Hard Fault exception.
 39   * @param  None
 40   * @retval : None
 41   */
 42 void HardFault_Handler(void)
 43 {
 44   /* Go to infinite loop when Hard Fault exception occurs */
 45   while (1)
 46   {
 47   }
 48 }
 49
 50 /**
 51   * @brief  This function handles Memory Manage exception.
 52   * @param  None
 53   * @retval : None
 54   */
 55 void MemManage_Handler(void)
 56 {
 57   /* Go to infinite loop when Memory Manage exception occurs */
 58   while (1)
 59   {
 60   }
 61 }
 62
 63 /**
 64   * @brief  This function handles Bus Fault exception.
 65   * @param  None
 66   * @retval : None
 67   */
 68 void BusFault_Handler(void)
 69 {
 70   /* Go to infinite loop when Bus Fault exception occurs */
 71   while (1)
 72   {
 73   }
 74 }
 75
 76 /**
 77   * @brief  This function handles Usage Fault exception.
 78   * @param  None
 79   * @retval : None
 80   */
 81 void UsageFault_Handler(void)
 82 {
 83   /* Go to infinite loop when Usage Fault exception occurs */
 84   while (1)
 85   {
 86   }
 87 }
 88
 89 /**
 90   * @brief  This function handles SVCall exception.
 91   * @param  None
 92   * @retval : None
 93   */
 94 void SVC_Handler(void)
 95 {
 96 }
 97
 98 /**
 99   * @brief  This function handles Debug Monitor exception.
100   * @param  None
101   * @retval : None
102   */
103 void DebugMon_Handler(void)
104 {
105 }
106
107 /**
108   * @brief  This function handles PendSV_Handler exception.
109   * @param  None
110   * @retval : None
111   */
112 void PendSV_Handler(void)
113 {
114 }
115
116 /**
117   * @brief  This function handles SysTick Handler.
118   * @param  None
119   * @retval : None
120   */
121 void SysTick_Handler(void)
122 {
123 }
124
125
126
127 /****************************************************************************
128 *
129 * 函数名称:void TIM3_IRQHandler(void)
130 * 外部中断处理函数
131 *
132 ****************************************************************************/
133
134
135 void TIM3_IRQHandler(void)
136 {
137     TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
138
139     if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET)
140     {
141         if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)
142         {
143             //LED 熄灭
144            GPIO_SetBits(GPIOB,GPIO_Pin_5);
145         }
146         else
147         {
148            //LED 发光
149            GPIO_ResetBits(GPIOB,GPIO_Pin_5);
150         }
151     }
152
153 }
154
155
156
157
158 /****************************************************************************
159 *
160 * 函数名称:void EXTI9_5_IRQHandler(void)
161 * 外部中断处理函数
162 *
163 ****************************************************************************/
164 void EXTI9_5_IRQHandler(void)
165 {
166   if(EXTI_GetITStatus(EXTI_Line5)==SET)  //判断是否产生了中断
167   {
168        EXTI_ClearITPendingBit(EXTI_Line5);//中断清除
169
170       delay_ms(10);//延时消抖
171
172       if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET) //再次判断,消抖
173       {
174           if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)//如果LED是亮
175           {
176            GPIO_SetBits(GPIOB,GPIO_Pin_5);    //则熄灭
177           }
178           else
179           {
180               GPIO_ResetBits(GPIOB,GPIO_Pin_5);//如果是熄灭的,就亮
181           }
182       }
183   }
184 }
185
186
187
188
189
190
191
192
193
194 /****************************************************************************
195 * ?    ?úvoid EXTI1_IRQHandler(void)
196 * ?    ?úEXTI2???m??
197 * ????ú?
198 * ????ú?
199 * ?    ?ú
200 * ????ú?
201 ****************************************************************************/
202 void EXTI1_IRQHandler(void)
203 {
204
205 }
206
207 /****************************************************************************
208 * ?    ?úvoid EXTI2_IRQHandler(void)
209 * ?    ?úEXTI2???m??
210 * ????ú?
211 * ????ú?
212 * ?    ?ú
213 * ????ú?
214 ****************************************************************************/
215 void EXTI2_IRQHandler(void)
216 {
217
218 }
219
220 /****************************************************************************
221 *
222 * 函数名称:void EXTI3_IRQHandler(void)
223 * 函数功能:外部中断XTI3中断处理函数
224 *
225 ****************************************************************************/
226 void EXTI3_IRQHandler(void)
227 {
228
229
230 }
231
232
233 /****************************************************************************
234 *
235 * 函数名称:USART1_IRQHandler(void)
236 * 函数功能:串口中断1处理函数
237 *
238 ****************************************************************************/
239 void USART1_IRQHandler(void)
240 {
241
242      if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断是否发生了串口中断
243      {
244
245          USART_SendData(USART1,USART_ReceiveData(USART1));//从串口中读取数据,然后发送出去
246
247          while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成,判断标志位
248
249      }
250  }
251
252 /****************************************************************************
253 *
254 * 函数名称:USART2_IRQHandler(void)
255 * 函数功能:串口中断2处理函数
256 *
257 ****************************************************************************/
258 void USART2_IRQHandler(void)
259 {
260      u8 temp=0;
261
262      if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)//判断是否发生了串口中断
263      {
264          temp=USART_ReceiveData(USART2);//获取写入串口的数
265
266          GPIO_SetBits(GPIOE,GPIO_Pin_5);//指定端口设置为高电平,发送数据之前需要拉高
267
268          delay_ms(1);//延时等待稳定
269
270          USART_SendData(USART2,temp);//从串口中读取数据,然后发送出去
271
272          while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//等待发送完成,判断标志位
273
274          delay_ms(2);//延时等待稳定
275
276          GPIO_ResetBits(GPIOE,GPIO_Pin_5);//指定端口设置低电平,接收数据时拉低
277
278      }
279  }

 1 /****************************************************************************************************************
 2 *
 3 * 文件名称:pbdata.c
 4 * 文件功能:自定义函数或者全局变量的初始化
 5 *
 6 ****************************************************************************************************************/
 7
 8 /*头文件声明*/
 9 #include "pbdata.h"
10
11
12
13
14 /********************************************************************************************
15 *
16 * 自定义全局变量
17 *
18 ********************************************************************************************/
19 u8 dt=0;
20
21
22
23
24
25 /******************************************************************************************
26 *
27 * 自定义函数
28 *
29 ******************************************************************************************/
30
31
32
33 /**************************************************
34 *
35 *  函数名称:delay_us(u32 nus)
36 *  函数功能:微秒延时函数
37 *  输入参数:输入值为延时us
38 *
39 ***************************************************/
40 void delay_us(u32 nus)
41 {
42     u32 temp;
43     SysTick->LOAD = 9*nus;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9次
44     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
45     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
46
47     do
48     {
49           temp=SysTick->CTRL;//标志位,等到一直减到0
50          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
51
52     SysTick->CTRL=0x00; //关闭计数器
53     SysTick->VAL =0X00; //清空计数器
54 }
55
56
57
58
59
60
61
62 /***************************************************
63 *
64 * 函数名称:delay_ms(u16 nms)
65 * 函数功能:毫秒级延时
66 * 输入参数:输入值位延时ms
67 *
68 ****************************************************/
69 void delay_ms(u16 nms)
70 {
71     u32 temp;
72     SysTick->LOAD = 9000*nms;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9000次
73     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
74     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
75
76     do
77     {
78           temp=SysTick->CTRL;//标志位,等到一直减到0
79          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
80
81     SysTick->CTRL=0x00; //关闭计数器
82     SysTick->VAL =0X00; //清空计数器
83 }

 1 /*pbdata.h*/
 2 /***************************************************************************************************
 3 *
 4 * 文件名称:pbdata.h
 5 * 文件功能:自定义的函数和全局变量的声明头文件
 6 *
 7 ***************************************************************************************************/
 8
 9 #ifndef _pbdata_H
10 #define _pbdata_H
11
12
13
14
15
16 /********************************************************************
17 *
18 *  调用的头文件放在这里
19 *
20 ********************************************************************/
21 #include "stm32f10x.h"
22 #include "misc.h"
23 #include "stm32f10x_exti.h"
24 #include "stm32f10x_tim.h"
25 #include "stm32f10x_usart.h"
26
27
28
29 /********************************************************************
30 *
31 *  自定义全局变量声明
32 *
33 ********************************************************************/
34 extern u8 dt;
35
36
37
38
39
40 /********************************************************************
41 *
42 *  自定义全函数声明
43 *
44 ********************************************************************/
45 void delay(u32 nCount);
46 void delay_us(u32 nus);
47 void delay_ms(u16 nms);
48
49
50
51
52 #endif

4、工程下载:

http://download.csdn.net/detail/a1181803348/8745649

时间: 2024-09-29 16:43:16

7、串口的相关文章

Linux 控制台下串口的基本操作

显示串口波特率等信息: stty -F /dev/ttyTHS2 -a  #dev/ttyTHS2为选择的端口号 参数设置: stty -F /dev/ ttyTHS2 ispeed 115200 ospeed 115200 cs8 配置波特率115200数据8bit,一般情况下设置这两个参数就可以了,如果显示数据乱码,可能还需要设置其它参数,使用man查看stty其它设置选项. 发送串口数据: echo 123> /dev/ttyTHS2 读取串口数据: cat /dev/ttyTHS2 读取

Linux下串口编制【转】

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口

ubuntu下可用的串口调试工具--cutecom

今天在ubuntu下要用到串口发送16进制数据,百度了很多工具,觉得minicom和cutecom都不错,比较直观是cutecom,所以就介绍下cutecom. 安装: 输入 $ sudo apt-get install cutecom    便可安装 $ cutecom                                    便可执行 这是软件截图: Device:这里是串口名称,但有时识别的串口不能在这里选择,比如ttyUSB0,需要手动修改为 /dev/ttyUSB0 Bau

51单片机之串口通信(三)

51单片机之串口通信(三) 已有 47 次阅读2015-12-29 00:21 |个人分类:51单片机| 单片机, 通信 用串口实现发送和接收同时可操作: 电脑显示结果如图: 源程序: /*项目名称:串口发送接收实验项目内容:串口发送接收同时进行,计算机发送数据给单片机控制P0口,从而控制LED灯的亮灭,单片机发送数据到计算机,计算机显示出来时间:2015年12月23日项目负责人:YUAN*/#include <reg52.h>typedef unsigned char uChar8;type

【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动

SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    导出数据接口的作用 在数据集成系统项目中,要么是自已集成其他厂家的设备,要么是其他厂家集成自己家的设备,在没有统一的标准前提下,就会有各种集成数据的格式.为了满足此类的场景,为设备输出数据专门设计了接口,开发者可以继承该接口,设备在处理完数据后,会把数据自动传输到该接口,可以按规定的数据格式进行输出了. 1.2    接口功能说明 开发设备输出接口,主要考虑到在集成项目中,集成过程中或被集成

VELT-0.1.5开发: gdb串口调试内核时信息丢失的问题

快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 本文仅适用于vs2013 + velt-0.1.5 VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可

linux串口驱动分析——发送数据

一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数,找到使用的file_operations,即应用程序与tty架构的统一接口.步骤不再赘述. static const struct file_operations tty_fops = { .llseek = no_llseek, .read = tty_read, .write = tty_wr

通过串口接收带有标识符的数据方法

在做串口通信过程中,下位机向上位机发送的串口数据有时候需要带有指定的标识符,便于上位机根据标识符判断后续几位数据是做什么用的.也就是下位机和上位机约定数据帧的传输格式,便于在上位机将数据分离,当然这种数据帧格式可以自定义. 今天用arduino作为下位机,模拟数据通过自定义格式发送数据帧,利用串口将数据帧发送到android上位机,上位机用java代码实现数据提取,并在界面实时显示接收数据,虽然是模拟数据通过串口发送,但在实际项目开发中,原理相通. 以下是arduino代码,通过设定定时器,当接

Linux串口IO模式的一些心得

众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样. 通常I/O操作都是有阻塞与非阻塞的两种方式. 其中"超时"这个概念其实是阻塞中的一种处理手段,本质还是属于阻塞的I/O模式. 在Linux中串口的IO操作 本文将它分为三种状态: 阻塞状态 超时状态 非阻塞状态 这三种状态的转换组合有这么几种: 阻塞 --> 超时 阻塞 --> 非阻塞 超时 --> 阻塞 超时 --> 非阻塞 非阻塞 --> 阻塞 我们一个一个来分析 首先在一个串口的

温度传感器+I2C+串口+PC上位机(pyserial)例子

例子写的有点乱,主要是学习: 温度传感器DS18b20,E2PROM,I2C, 串口读写,PC上位机(pyserial)数据显示 SerialPort.py     PC串口上位机程序,可以设定上限报警温度 需要安装Python3以上,pyserial库,例子在Python3.4下写的. 上位机传给单片机上限报警温度后,单片机存入E2PROM, 单片机断电重启后,从E2PROM读取报警值. i2c.h             I2C总线读写和设定 lcd1602.h         lcd160