本帖最后由 IdeaMing 于 2019-1-3 17:48 编辑
STM32F030外部中断的使用前言: 今天把之前的一个坑填上,在”STM32F030C8配置NRF24L01”一文中,最后一句“另外一篇详细讲外部中断的配置”,挖了个坑,有小伙伴QQ联系我怎么找不到另一篇。自己才想起来。好了,紧接那篇文章补上本篇。为了加快各位研发人员的开发进度,避免浪费大量的时间在硬件平台上,写出个人代码调试的经验。个人水平有限,如有错误,还请指正mr.li.ming@qq.com。
提示:使用的内部RC时钟,最大速度48MHz。
第一步:初始化端口
头文件中的相关定义 - 头文件中的相关定义
- /** @addtogroup BOARD_LOW_LEVEL_INTRRUPT
- * @{
- */
- #define RF_IRQ_CLK RCC_AHBPeriph_GPIOB //IRQ主机数据输入
- #define RF_IRQ_PORT GPIOB
- #define RF_IRQ_PIN (GPIO_Pin_0)
- #define RF_EXTI_LINE EXTI_Line0
- #define RF_EXTI_IRQn EXTI0_1_IRQn
- #define RF_EXTI_PIN_SOURCE EXTI_PinSource0
- #define RF_EXTI_PORT_SOURCE EXTI_PortSourceGPIOB
- /**
- * @}
- */
复制代码- /*******************************************************************************
- * @brief 初始化端口
- * @param None
- * @retval None
- ****************************************************************Author:Liming**/
- void NRF24L01_EXTI_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- GPIO_InitStructure.GPIO_Pin = RF_IRQ_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
- GPIO_Init(RF_IRQ_PORT,&GPIO_InitStructure); // IRQ中断输入脚
-
- GPIO_SetBits(RF_IRQ_PORT,RF_IRQ_PIN);
-
- EXTI_ClearITPendingBit(RF_EXTI_LINE);
- SYSCFG_EXTILineConfig(RF_EXTI_PORT_SOURCE,RF_EXTI_PIN_SOURCE);
-
- EXTI_InitStructure.EXTI_Line = RF_EXTI_LINE;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = RF_EXTI_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
复制代码
第二步:修改中断入口函数
- /*******************************************************************************
- * @brief 中断入口函数
- * @param None
- * @retval None
- ****************************************************************Author:Liming**/
- void EXTI0_1_IRQHandler(void)
- {
- if(EXTI_GetITStatus(RF_EXTI_LINE) != RESET)
- {
- EXTI_ClearITPendingBit(RF_EXTI_LINE);// Clear the EXTI line pending bit
- EXTI0_Process();
- }
- }
复制代码
第三步:中断处理函数
- //24L01发送接收数据宽度定义
- #define TX_ADR_WIDTH 3 //3字节的地址宽度
- #define RX_ADR_WIDTH 3 //3字节的地址宽度
- #define TX_PLOAD_WIDTH 32 //32字节的用户数据宽度
- #define RX_PLOAD_WIDTH 32 //32字节的用户数据宽度
- typedef enum
- {
- NRF_STATUS_IDLE = 0X30,
- NRF_STATUS_RX = 0X41, // A
- NRF_STATUS_RXOK = 0X42, // B
- NRF_STATUS_TXMODE = 0X60, // a
- NRF_STATUS_TX = 0X61, // b
- NRF_STATUS_TXOK = 0X62, // c
- NRF_STATUS_TXERROR = 0X63 // d
- }NRF_Status_Typedef;
- NRF_Status_Typedef NRF_STATUS = NRF_STATUS_IDLE; // 初始状态
- unsigned char NRF_RxBuff[RX_PLOAD_WIDTH];
- /*******************************************************************************
- * @brief 中断处理函数
- * @param None
- * @retval None
- ****************************************************************Author:Liming**/
- void EXTI0_Process(void)
- {
- unsigned char status;
- status = NRF24L01_Read_Reg(STATUS);
- RF_CE_LOW;
- NRF24L01_Write_Reg(SPI_WRITE_REG+STATUS,status);
- RF_CE_HIGH;
- switch(status&0x70)//判断是哪个中断
- {
- case 0x40:
- RF_CE_LOW;
- NRF24L01_Read_Buf(RD_RX_PLOAD,NRF_RxBuff,RX_PLOAD_WIDTH);//读取数据
- NRF24L01_Write_Reg(FLUSH_RX,0x00);//清除RX FIFO寄存器
- runtime = NRF_RxBuff[25]<<8|NRF_RxBuff[26];
- DispValAlignCenter(6,runtime);
- NRF_STATUS = NRF_STATUS_RXOK;
- RF_CE_HIGH;
- break;
- case 0x30:
- case 0x20: NRF_STATUS = NRF_STATUS_TXOK;break;
- case 0x10: NRF_STATUS = NRF_STATUS_TXERROR;break;
- default:break;
- }
- }
复制代码
希望对各位看官有所帮助,并能触类旁通,其它的引脚中断也能熟练使用。或许当时也是因为中断的配置一旦用了之后就觉得很简单了吧,今天补上,希望对您的工作学习有所帮助。
附上PDF文档:
STM32F030外部中断的使用.pdf
(445.96 KB, 下载次数: 143)
|