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>© 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>© 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