你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103ZET6 外部中断问题

[复制链接]
Jacky-351372 提问时间:2012-5-16 17:25 /
最近一直在搞外部中断,可是就是不进入中断程序中,我用单步调试工具,系统接受到了按键的触发,Break后就看见程序一直在HardFault_Handler里面,求大侠指导!!
收藏 评论8 发布时间:2012-5-16 17:25

举报

8个回答
sacq12 回答时间:2012-5-16 19:41:30

RE:STM32F103ZET6 外部中断问题

问题不够具体.问题可能出在软硬衔接部分,某个寄存器.
Jacky-351372 回答时间:2012-5-16 19:52:53

回复:STM32F103ZET6 外部中断问题

回复第 2 楼 于2012-05-16 19:41:30发表:
问题不够具体.问题可能出在软硬衔接部分,某个寄存器. 

单步调试到按键触发的时候,出现如图1的情形,
然后Break下,Disassembly中出现了图二的情形,
最后不管怎么运行,都是在这个HardFault_Handler中。
我用的开发环境是IAR,不知道是程序出的问题还是什么???跪求帮助~~
 
 
1.jpg
2.jpg
zengwh 回答时间:2012-5-16 20:15:08

RE:STM32F103ZET6 外部中断问题

你有没有注册中断函数。可能是这个原因吧 你把工程文件上传来看看
Jacky-351372 回答时间:2012-5-16 20:50:36

回复:STM32F103ZET6 外部中断问题

回复第 4 楼 于2012-05-16 20:15:08发表:
你有没有注册中断函数。可能是这个原因吧 你把工程文件上传来看看 

怎么注册中断函数啊?不懂啊~~
我把整个工程文件传上来,你帮我看看,哪边设置的不行~~谢谢!!

外部中断.rar

下载

671.69 KB, 下载次数: 12

废鱼 回答时间:2012-5-17 09:35:49

RE:STM32F103ZET6 外部中断问题

HardFault_Handler,这个说明你的程序有错误,导致进入这个错误中断。检查一下,是不是有野指针的操作?
Jacky-351372 回答时间:2012-5-17 11:59:10

回复:STM32F103ZET6 外部中断问题

回复第 6 楼 于2012-05-17 09:35:49发表:
HardFault_Handler,这个说明你的程序有错误,导致进入这个错误中断。检查一下,是不是有野指针的操作? 

我用的是IAR编译器
按键是PA8,LED1接PF8,LED2接PF9,正常的程序是LED1和LED2交替闪烁,无限循环;LED3接PF6,LED4接PF7,进入中断服务程序时LED3,LED4交替闪烁10次
可当我下载完程序时,直接运行,按键按下时,没有反应,然后Break了下,发现指针停在了HardFault_handler上面了~~
我的程序如下:
main.c

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"
#include "stm32_eval.h"
#include
/* Private function prototypes -----------------------------------------------*/
//void RCC_Configuration(void); //时钟配置
void NVIC_Configuration(void);//中断向量表和优先级设定
void GPIO_Configuartion(void);//端口模式配置
void Exti_Configuartion(void);//外部中断模式配置
/* Private functions ---------------------------------------------------------*/
static void Delay_ARMJISHU(__IO uint32_t nCount)
{
  for (; nCount != 0; nCount--);
}
/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
 // RCC_Configuration();   //配置时钟
  NVIC_Configuration();
  GPIO_Configuartion();
  Exti_Configuartion();
  while (1)
  {
          Delay_ARMJISHU(0xffff);
        GPIO_ResetBits(GPIOF, GPIO_Pin_8 );//点亮led
    GPIO_SetBits(GPIOF, GPIO_Pin_9);//熄灭led
        Delay_ARMJISHU(0xffff);//Dealy_Systick(1000);
        GPIO_ResetBits(GPIOF, GPIO_Pin_9 );//点亮led
    GPIO_SetBits(GPIOF, GPIO_Pin_8);//熄灭led
  }
}
/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures Vector Table base location.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
            NVIC_InitTypeDef         NVIC_InitStructure;
     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
         //中断向量存储在FlASh区
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//选择中断优先级分组1
         NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;//外部中断
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
         NVIC_Init(&NVIC_InitStructure);
}
void GPIO_Configuartion(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  //LED控制端口
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);//打开用到的gpiod时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7|GPIO_Pin_8 | GPIO_Pin_9;//选择要配置的端口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置为推免输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//转换速度
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化gpio
  GPIO_ResetBits(GPIOF, GPIO_Pin_8 | GPIO_Pin_9);        //先复位
  //中断控制端口
  //RCC->APB2ENR |=0x09;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开用到的gpioa时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//选择要配置的端口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置为上拉输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//转换速度
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化gpio
}
/*******************************************************************************
* Function Name  : Exti_Configuration
* Description    : 配置外部事件,
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void Exti_Configuartion(void)
{
        EXTI_InitTypeDef        EXTI_InitStructure;
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource8);
//将PB6配置为EXTI Line6
        EXTI_InitStructure.EXTI_Line=EXTI_Line8;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        //EXTI_GenerateSWInterrupt(EXTI_Line8);
}
 
中断程序啊:stm32f10x_it.c
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
static void Delay_ARMJISHU(__IO uint32_t nCount)
{
  for (; nCount != 0; nCount--);
}
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"

void EXTI9_5_IRQHandler(void)
{
        int i;
        if(EXTI_GetITStatus(EXTI_Line8)!=RESET)
        {
                for(i=0;i
Jacky-351372 回答时间:2012-5-17 15:40:22

RE:STM32F103ZET6 外部中断问题

终于搞定了!!
原来是启动文件李米娜少添加了一个启动文件startup_stm32f10x_hd.s(我的是STM32F103ZET6的芯片),不同的芯片要根据Flash的大小来选择不同的启动文件!
这个是很重要的文件,里面包含了中断向量表驱动以及各个中断处理的函数(怪不着直接在stm32f10x_it.c中直接添加对应的中断处理子程序)。

谢谢以上几位大侠的指导!!
zengwh 回答时间:2012-5-17 17:05:32

回复:STM32F103ZET6 外部中断问题

回复第 8 楼 于2012-05-17 15:40:22发表:
终于搞定了!!
原来是启动文件李米娜少添加了一个启动文件startup_stm32f10x_hd.s(我的是STM32F103ZET6的芯片),不同的芯片要根据Flash的大小来选择不同的启动文件!
这个是很重要的文件,里面包含了中断向量表驱动以及各个中断处理的函数(怪不着直接在stm32f10x_it.c中直接添加对应的中断处理子程序)。

谢谢以上几位大侠的指导!! 

哈哈 解决就好。恭喜楼主

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版