本帖最后由 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)
2019-1-3 17:39 上傳
點擊文件名下載附件
|