OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3065|回复: 2

F4中斷服務函數內部是否可以調用函數指針?

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-9-24
在线时间
6 小时
发表于 2019-4-28 12:10:32 | 显示全部楼层 |阅读模式
1金钱
目的:嘗試設計一個簡單的中斷服務程序,該程序在其中使用一個函數指針,以便可以從main()函數中可以依需求調用不同函數以下為程式內容
/**********************************/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "timer.h"


void (*isr)(void) ;//聲明一個函數指針變量

void Fun(void){
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
}//預計調用的函數



void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{   
    if(htim==(&TIM3_Handler))
    {
                        isr();//調用函數指針
    }
}
//中斷服務函數之內容



int main(void)
{
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED
    KEY_Init();                     //初始化按键
    delay_ms(500);
       
          TIM3_Init(5000-1,9000-1);       //定时器3初始化,定时器时钟为90M,分频系数为9000-1,
                                         //所以定时器3的频率为90M/9000=10K,自动重装载为5000-1,那么定时器周期就是500ms
          
          isr=Fun;//預計調用的函數賦值給isr指針
          while(1)
          {

         }
               
}

/**************************************
目前問題:
若在中斷服務函數中直接調用Fun()。程式可運行
在main函數當中調用指針函數isr()也可運行
然而在中斷服務函數裡面調用isr()卻無運作
是否中斷服務函數調用指針函數有其他限制?
懇請各位先進提點




最佳答案

查看完整内容[请看2#楼]

执行函数前判断指针函数是否为NULL
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-4-28 12:10:33 | 显示全部楼层
执行函数前判断指针函数是否为NULL
一分耕耘一分收获。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-9-24
在线时间
6 小时
 楼主| 发表于 2019-4-28 13:16:47 | 显示全部楼层
yklstudent 发表于 2019-4-28 12:44
执行函数前判断指针函数是否为NULL

感謝先進,經過以下修改,程序可運行了:

/*****************************************************************/
void (* volatile isr)(void)=NULL;//指針變量聲明時先賦值NULL

/******************************************************************/  
if(htim==(&TIM3_Handler))
    {
         if(isr != NULL)//先判別函數指針是否為NULL
     {
        isr();
     }
                       
    }

/***********************************************************/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 13:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表