stm32串口中断总结Word文件下载.docx
《stm32串口中断总结Word文件下载.docx》由会员分享,可在线阅读,更多相关《stm32串口中断总结Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
USART1
中断
*/
NVIC_InitStructure.NVIC_IRQChannel
=
USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority
0;
NVIC_InitStructure.NVIC_IRQChannelCmd
ENABLE;
NVIC_Init(&
NVIC_InitStructure);
}
●∙然后GPIO复用功能配置。
一般情况下我们使用原始的外设和GPIO端口引脚的映射关系,如果要改变其映射的话,请另外查看参考手册上关于GPIO重映射部分。
对于GPIO的复用,其引脚的输入与输出模式都有要求,在参考手册上有详细说明。
GPIO_Configuration(void)
GPIO_InitTypeDef
GPIO_InitStructure;
配置
Rx
作为浮空输入
GPIO_InitStructure.GPIO_Pin
GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode
GPIO_Mode_IN_FLOATING;
GPIO_Init(USARTy_GPIO,
&
GPIO_InitStructure);
Tx
作为推挽输出
GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed
GPIO_Speed_50MHz;
GPIO_Mode_AF_PP;
●∙串口初始化配置。
主要有串口基本参数配置(如波特率、数据位、工作方式等),串口中断使能,串口使能。
(1)
基本参数配置
USART_InitTypeDef
USART_InitStructure;
USART_InitStructure.USART_BaudRate
9600;
//波特率
USART_InitStructure.USART_WordLength
USART_WordLength_8b;
//数据长度
USART_InitStructure.USART_StopBits
USART_StopBits_1;
//停止位
USART_InitStructure.USART_Parity
USART_Parity_No;
//校验
USART_InitStructure.USART_HardwareFlowControl
=USART_HardwareFlowControl_None;
//硬件流控制无
USART_InitStructure.USART_Mode
USART_Mode_Rx
|
USART_Mode_Tx;
//发送与接受两种方式
USART_Init(USART1,
USART_InitStructure);
//用配置的参数惊喜串口初始化
(2)
串口中断使能
USART_ITConfig(USARTy,
USART_IT_RXNE,
ENABLE);
//使能接受中断,在接受移位
寄存器中有数据是产生
USART_IT_TXE,
//使能发送中断,在发送完数据
后产生。
一般情况下,如果与PC通信的话,我们只用接受中断即可。
(3)
串口使能
USART_Cmd(USART1,
//USART1使能
好了,经过以上不走之后呢,我们就可以进行数据的收发了。
3、发送数据
使用函数USART_SendData(USART1,
char
data),一次只能发送一个字符。
当然我们可以用如下函数发送字符串。
USART1_Puts(char
*
str)
{
while(*str)
USART_SendData(USART1,
*str++);
//发送一个字符
while(USART_GetFlagStatus(USART1,
USART_FLAG_TXE)
==
RESET);
//等待发送完毕
}
当然我们也可以循环发送字符串数组
for(i
TxBuf1
!
'
\0'
;
i++)
//
TxBuf1为定义好的字符串数组
USART_SendData(USART2
TxBuf1);
while(USART_GetFlagStatus(USART2,
USART_FLAG_TC)==RESET);
4、接收数据
由于我们使用的是接受中断,所以当有数据需要接收时,会执相应的中断函数。
此处我们USART1的中断函数在stm32f10x_it.c文件中。
找到函数void
USART1_IRQHandler(void),如果没有的话就自己加上吧,别忘了头文件中需要声明一下。
当然你也可以在其他文件中写下该中断函数。
当产生中断进入该函数之后,我们就可以进行自己的操作了。
USARTy_IRQHandler(void)
if(USART_GetITStatus(USARTy,
USART_IT_RXNE)
RESET)//如果寄存器中有数据
Read
one
byte
from
the
receive
data
register
RxBuffer1[RxCounter1++]
USART_ReceiveData(USART1);
/*************************************************************
USART_IT_TXE)
RESET)
USART_SendData(USARTy,
TxBuffer1[TxCounter1++]);
//这个地方那个之所以把这个写出来主要是想说发送中断和接受中断其实是共用一个
//中断函数的,到底是那个中断发生了呢,这就需要我们读取中断状态标志来识别了。
*****************************************************************/
别忘了在接受完数据进行别的操作之前为了防止数据被覆盖最好先禁止一下接受中断
禁止
接收中断
USART_ITConfig(USART1,
DISABLE);
发送中断
5、main函数
int
main(void)
//这个地方和特别,我们知道一般main函数是没有返回值的,但在STM32
//的编程中其返回类型为int。
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
USART_InitStructure.USART_HardwareFlowControl=
USART_HardwareFlowControl_None;
//USART_ITConfig(USART1,
while
(1)//等待中断
当然你也可以在main()中添加一些发送指令之类的东西。
以上容为个人总结,请注明出处。
若有错误,本人概不负任何责任。
STM32外部中断配
NVIC_Configuration函数实现配置嵌套向量中断中断优先级并使能中断。
其中的NVIC_PriorityGroupConfig函数配置中断优先级的组织方式,STM32的嵌套向量中断控制器可以配置16个可编程的优先等级,使用了4位表示中断优先级(2的4此方就是16),16个可编程的优先等级又可以分为主优先级和次优先级,例如参数NVIC_PriorityGroup_1表示1bit主优先级(pre-emptionpriority)3bits次优先级(subpriority)。
一、配置中断
1、分配中断向量表:
/*SettheVectorTablebaselocationat0x20000000*/
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
2、设置中断优先级:
//设置中断优先级
3、初始化外部中断:
/*允许EXTI4中断*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQChannel;
//中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=PreemptionPriorityValue;
//占先优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
//响应(次级)优先级NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//通道中断使能
//初始化中断
注意:
如果我们配置的外部针脚为PA4,或PB4,或PC4,PD4等,那么采用的外部中断也必须是EXTI4,同样,如果外部中断针脚是PA1,PB1,PC1,PD1那么中断就要用EXTI1,其他类推。
二、配置GPIO针脚作为外部中断的触发事件
1、选择IO针脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
注意,如果的针脚是端口的4号针脚,配置的中断一定是EXTI4
2、配置针脚为输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
3、初始化针脚
GPIO_Init(GPIOD,&
3配置EXTI线,使中断线和IO针脚线连接上
1、将EXTI线连接到IO端口上
将EXTI线4连接到端口GPIOD的第4个针脚上
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4);
如果配置的针脚是4号,那么参数必须是GPIO_PinSource4
如果配置的针脚是3号,那么参数必须是GPIO_PinSource3
2、配置中断边沿
/*配置EXTI线4上出现下降沿,则产生中断*/
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
注意:
如果配置的4号针脚,那么EXTI_Line4是必须的
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
//下降沿触发
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
//中断线使能
EXTI_Init(&
EXTI_InitStructure);
EXTI_GenerateSWInterrupt(EXTI_Line4);
//EXTI_Line4中断允许
到此中断配置完成,可以写中断处理函数。
举例:
配置函数
/*************************************************************************
*函数名
NVIC_Configration
*描述
配置各个中断寄存器
****************************************************************************/
voidNVIC_Configration(void)
NVIC_InitTypeDefNVIC_InitStructure;
//#ifdefVECT_TAB_RAM
/*SettheVectorTablebaselocationat0x20000000*/
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
//#else/*VECT_TAB_FLASH*/
/*SettheVectorTablebaselocationat0x08000000*/
//NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
//#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/*允许EXTI4中断*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=PreemptionPriorityValue;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&
/*允许EXTI9中断*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
/*配置SysTick处理优先级:
优先级以及子优先级*/
/************************************************************************
配置TIM2针脚
************************************************************************/
voidGPIO_Configuration(void){
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&
/*配置GPIOD的第一个管角为浮动输入*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD,&
/*配置GPIOB的第9个管脚为浮动输入*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOB,&
/**************************************************************
*函数
SysTick_Configuration
设置SysTick
***************************************************************/
voidSysTick_Configuration(void)
/*配置HCLK时钟做为SysTick时钟源*/
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
//系统时钟8分频72MHz
NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick,8,2);
/*SysTickInterrupteach1000HzwithHCLKequalto72MHz*/
SysTick_SetReload(9000);
//中断周期1ms
/*EnabletheSysTickInterrupt*/
SysTick_ITConfig(ENABLE);
//打开中断
SysTick_CounterCmd(SysTick_Counter_Enable);
SysTick_CounterCmd(SysTick_Counter_Clear);
/******************************************************************************
EXTI_Configuration
配置EXTI线
*******************************************************************