本文以USART1为例,叙述串口中断的编程过程。
1、先来讲述一下在应用串口中断时涉及到的一些库文件。
首先对于STM32外设库文件的应用编程,misc.c和stm32f10x_rcc.c是肯定要添加到。
接下来就是我们要用到的相关外设了。
毫无疑问,串口文件stm32f10x_usart.c是必须的。
串口通信是对通用GPIO端口引脚的功能复用,所以还需要stm32f10x_gpio.c文件。
另外,因为有中断的产生,所以中断文件stm32f10x_it.c也是必要的,当然这个文件一般和main.c 放在一个文件夹下(一般习惯为User文件夹),因为我们的中断响应函数是要在里面自己编写的。
当然还有其他的基本必须文件如系统配置文件等在这地方就不说了,这个是创建一个工程应该知道的。
2、初始化对于串口通信的初始化,不仅仅只是对串口的初始化(这个地方是比较烦人的,不像别的芯片那样简洁明了)。
●∙首先时钟使能配置。
STM32内部的时钟有很多,感兴趣的自己看看参考手册。
此处以USART1为例说明。
有USART1时钟、GPIOA时钟、GPIO复用(AFIO)时钟。
由于此处USART1和GPIOA、AFIO均在APB2上,所以可以一次配置完成。
如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1 ,ENABLE);●∙其次中断配置。
主要有优先级组设定、USART1中断使能、该中断的优先级,中断初始化。
程序如下:void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//选择分组方式0/* 使能 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的复用,其引脚的输入与输出模式都有要求,在参考手册上有详细说明。
void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/* 配置 USART1 Rx 作为浮空输入 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);/* 配置 USART1 Tx 作为推挽输出 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);}串口初始化配置。
主要有串口基本参数配置(如波特率、数据位、工作方式等),串口中断使能,串口使能。
(1) 基本参数配置USART_InitTypeDef USART_InitStructure;USART_ART_BaudRate = 9600;//波特率USART_ART_WordLength = USART_WordLength_8b;//数据长度USART_ART_StopBits = USART_StopBits_1;//停止位USART_ART_Parity = USART_Parity_No;//校验USART_ART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制无USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送与接受两种方式USART_Init(USART1, &USART_InitStructure);//用配置的参数惊喜串口初始化(2) 串口中断使能USART_ITConfig(USARTy, USART_IT_RXNE, ENABLE);//使能接受中断,在接受移位寄存器中有数据是产生USART_ITConfig(USARTy, USART_IT_TXE, ENABLE);//使能发送中断,在发送完数据后产生。
一般情况下,如果与PC通信的话,我们只用接受中断即可。
(3) 串口使能USART_Cmd(USART1, ENABLE);//USART1使能好了,经过以上不走之后呢,我们就可以进行数据的收发了。
3、发送数据使用函数USART_SendData(USART1, char data),一次只能发送一个字符。
当然我们可以用如下函数发送字符串。
void USART1_Puts(char * str){while(*str){USART_SendData(USART1, *str++); //发送一个字符while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完毕}}当然我们也可以循环发送字符串数组for(i = 0; 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),如果没有的话就自己加上吧,别忘了头文件中需要声明一下。
当然你也可以在其他文件中写下该中断函数。
当产生中断进入该函数之后,我们就可以进行自己的操作了。
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);}/*************************************************************if(USART_GetITStatus(USARTy, USART_IT_TXE) != RESET){USART_SendData(USARTy, TxBuffer1[TxCounter1++]);}//这个地方那个之所以把这个写出来主要是想说发送中断和接受中断其实是共用一个//中断函数的,到底是那个中断发生了呢,这就需要我们读取中断状态标志来识别了。
*****************************************************************/}别忘了在接受完数据进行别的操作之前为了防止数据被覆盖最好先禁止一下接受中断/* 禁止 USART1接收中断 */USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);/* 禁止 USART1发送中断 */USART_ITConfig(USART1, USART_IT_TXE, DISABLE);5、main函数int main(void)//这个地方和特别,我们知道一般main函数是没有返回值的,但在STM32//的编程中其返回类型为int。
{RCC_Configuration();NVIC_Configuration();GPIO_Configuration();USART_ART_BaudRate = 9600;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No;USART_ART_HardwareFlowControl= USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);USART_Cmd(USART1, ENABLE);while (1)//等待中断{}}当然你也可以在main()中添加一些发送指令之类的东西。
以上内容为个人总结,转载请注明出处。
若有错误,本人概不负任何责任。
STM32 外部中断配NVIC_Configuration 函数实现配置嵌套向量中断中断优先级并使能中断。
其中的NVIC_PriorityGroupConfig 函数配置中断优先级的组织方式,STM32 的嵌套向量中断控制器可以配置16 个可编程的优先等级,使用了4 位表示中断优先级(2 的 4 此方就是16),16 个可编程的优先等级又可以分为主优先级和次优先级,例如参数NVIC_PriorityGroup_1表示1bit 主优先级(pre-emption priority)3 bits 次优先级(subpriority )。
一、配置中断1、分配中断向量表:/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);2、设置中断优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级3、初始化外部中断:/*允许EXTI4中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; //中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= PreemptionPriorityValue; //占先优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应(次级)优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能NVIC_Init(&NVIC_InitStructure); //初始化中断注意:如果我们配置的外部针脚为PA4,或PB4,或PC4,PD4等,那么采用的外部中断也必须是EXTI4,同样,如果外部中断针脚是PA1,PB1,PC1,PD1 那么中断就要用EXTI1,其他类推。