OpenEdv-开源电子网

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

STM32 103系列 外部中断问题。下载实验板无反应。main函数里面的复位LED灯都不亮 是不是时钟的问题???

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-24
在线时间
1 小时
发表于 2016-3-24 16:48:12 | 显示全部楼层 |阅读模式
#include <stm32f10x.h>
#include <stm32f10x_it.h>
#include <stm32f10x_conf.h>
#include <misc.h>
#include <Rcc.h>
#include <key.h>
#include <led.h>
#include <beep.h>
#include <usart.h>
#include <exti_gpio.h>
#include <delay.h>


#define LED_0 GPIO_Pin_5        //PB5
#define LED_1 GPIO_Pin_5    //PE5
#define BEEP GPIO_Pin_8
#define MCO GPIO_Pin_8

int main(void)
{       
        delay_init();                                                                        //延时初始化
        KEY_Init();                                                                       //按键初始化
        Led_Init_Configuration();                                                //初始化LED输出的GPIO
       
        //初始化系统时钟  串口中断         外部中断  中断优先级
        RCC_Init_Configuration();
        USART1_Init_Configuration(115200);
        EXTI_Interrupt_Init();                                                        //外部中断初始化函数

        while(1)
        {
                GPIO_SetBits(GPIOB,BEEP);
                delay_ms(100);
                GPIO_ResetBits(GPIOB,BEEP);
                delay_ms(100);
                GPIO_ResetBits(GPIOB,LED_0);
                delay_ms(100);
                GPIO_SetBits(GPIOB,LED_0);
                delay_ms(100);
                GPIO_ResetBits(GPIOE,LED_1);
                delay_ms(100);
        }

/*
        while(1)
        {
               
                        key=KEY_Scan(1);//按键键值送给key
               
                        #define KEY0_PRES         1        //KEY0按下
                        #define KEY1_PRES        2        //KEY1按下
                        #define KEY2_PRES        3        //KEY2按下
                        #define WKUP_PRES   4        //KEY_UP按下(即WK_UP/KEY_UP)
               
                if (key)
               
                {       
                        switch(key)
                        {
                                case KEY0_PRES :        GPIO_ResetBits(GPIOB,LED_0);break;
                                case KEY1_PRES :        GPIO_SetBits(GPIOB,LED_0);break;
                                case KEY2_PRES :        break;
                                case WKUP_PRES :        break;
                                default : break;
                        }
                }
                else delay_ms(10);
               
        }
*/
}



#include <exti_gpio.h>

/*******************************************************************************

* Function Name  : GPIO  EXTI  NVIC配置

* Description    :

* Function       :
                                        按下所接的按键 PC1 PC2 PC4 PA8 触发中断  
       
                                        中断服务函数中相应PB5 所接的LED灯状态改变
*******************************************************************************/

/*        GPIO        配置        */



void GPIO_Exti_Interrupt_Configuration(void)
{
       
        /***********************************************/
        //PE2 PE3 PE4 PA8 为按键中断 设置正输入模式
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //设置为上拉输入模式
        GPIO_Init(GPIOE,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
}


/*        EXTI        配置        */

void EXTI_Interrupt_Init_Configuration(void)
{
        EXTI_InitTypeDef EXTI_InitStructure;
       
        //清除中断标志位
        EXTI_ClearITPendingBit(EXTI_Line0);
        EXTI_ClearITPendingBit(EXTI_Line2);
        EXTI_ClearITPendingBit(EXTI_Line3);
        EXTI_ClearITPendingBit(EXTI_Line4);
       
       
        //设置 PE2 PE3 PE4 PA8
        //引脚作为触发外部中断线与引脚的 映射关系
        /***********************************************/
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);        //管脚0  
        EXTI_InitStructure.EXTI_Line = EXTI_Line0;                                        //线0
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //中断模式
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                //上升沿触发
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);//初始化 中断线
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
        EXTI_InitStructure.EXTI_Line =        EXTI_Line2 ;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
        EXTI_InitStructure.EXTI_Line =        EXTI_Line3 ;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
        EXTI_InitStructure.EXTI_Line =        EXTI_Line4 ;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);

}


/*         NVIC        配置         */

void NVIV_Init_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitSturcture;
        /*
        #define NVIC_VecTab_FLASH
                设置中断向量表的起始地址是RAM 还是FLASH       
        #ifdef NVIC_VectTab_RAM
        NVIC_SetVectorTable(NVIC_VectTab_RAM,0x00);
        #endif
        */
        NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x00);

       
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //设置分组1
       
        NVIC_InitSturcture.NVIC_IRQChannel = EXTI2_IRQn;        //外部中断通道2
        NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority =0x02;
        NVIC_InitSturcture.NVIC_IRQChannelSubPriority =0x03;
        NVIC_InitSturcture.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitSturcture);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                //设置分组1
        NVIC_InitSturcture.NVIC_IRQChannel = EXTI3_IRQn;        //外部中断通道3
        NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority =0x02;
        NVIC_InitSturcture.NVIC_IRQChannelSubPriority =0x02;
        NVIC_InitSturcture.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitSturcture);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                //设置分组1
        NVIC_InitSturcture.NVIC_IRQChannel = EXTI4_IRQn;        //外部中断通道4
        NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority =0x02;
        NVIC_InitSturcture.NVIC_IRQChannelSubPriority =0x01;
        NVIC_InitSturcture.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitSturcture);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                //设置分组1
        NVIC_InitSturcture.NVIC_IRQChannel = EXTI0_IRQn;        //外部中断通道0
        NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority =0x02;
        NVIC_InitSturcture.NVIC_IRQChannelSubPriority =0x00;
        NVIC_InitSturcture.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitSturcture);
       
}


void EXTI_Interrupt_Init(void)
{
        GPIO_Exti_Interrupt_Configuration();                                //初始化GPIO
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启复用时钟功能
        EXTI_Interrupt_Init_Configuration();                                //初始化IO口与中断线的映射
        NVIV_Init_Configuration();                                                        //配置中断分组 与使能
}


#include <Rcc.h>

/*******************************************************************************

* Function Name  : RCC_Configuration

* Description    : RCC配置(使用外部8MHz晶振)

*******************************************************************************/

void RCC_Init_Configuration(void)
{

        /*
        ErrorStatus HSEStartUpStatus;//定义变量//typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
       
        //将外设RCC寄存器重设为缺省值 //
        RCC_DeInit();

        //设置外部高速晶振(HSE)//

        RCC_HSEConfig(RCC_HSE_ON);   //RCC_HSE_ON——HSE晶振打开(ON) 配置时钟开启HSE外部高速时钟

        //等待HSE起振
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
       
        if(HSEStartUpStatus == SUCCESS)     //SUCCESS:HSE晶振稳定且就绪
        {
                //设置PLL时钟源及倍频系数
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//选择HSE为PLL时钟源并且倍频9倍  
               
                //设置AHB时钟(HCLK)
                RCC_HCLKConfig(RCC_SYSCLK_Div1);        //RCC_SYSCLK_Div1——AHB时钟 = 系统时钟

                // 设置高速APB2时钟(PCLK2)
                RCC_PCLK2Config(RCC_HCLK_Div1);     //RCC_HCLK_Div1——APB2时钟 = HCLK

                //设置低速APB1时钟(PCLK1)
                RCC_PCLK1Config(RCC_HCLK_Div2);     //RCC_HCLK_Div2——APB1时钟 = HCLK / 2

                //设置HSI为PA8 MCO 输出时钟(MCO)
                RCC_MCOConfig(RCC_MCO_HSI);
               
                //设置FLASH存储器延时时钟周期数
                FLASH_SetLatency(FLASH_Latency_2);  //FLASH_Latency_2  2延时周期

                //选择FLASH预取指缓存的模式
                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  // 预取指缓存使能

                //使能PLL
                RCC_PLLCmd(ENABLE);

                //检查指定的RCC标志位(PLL准备好标志)设置与否
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)   
                {

                }

                //设置系统时钟(SYSCLK)
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);        //设置PLL作为系统时钟

                // PLL返回用作系统时钟的时钟源
                while(RCC_GetSYSCLKSource() != 0x08)     //0x08:判读PLL是否作为系统时钟
       {

       }

     }
       

         //使能APB2外设时钟
         */
               
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                                                                RCC_APB2Periph_GPIOE | RCC_APB2Periph_USART1, ENABLE);        //GPIO A B E时钟使能
               
                RCC_ClockSecuritySystemCmd(ENABLE);       
}




//系统时钟  system_stm32f10x.h
#include "stm32f10x.h"

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/*#define SYSCLK_FREQ_HSE    HSE_VALUE */
/*#define SYSCLK_FREQ_24MHz  24000000 */
#else
/*#define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif


#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
/* #define DATA_IN_ExtSRAM */
#endif


/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x0 /*!< Vector Table base offset field.
                                  This value must be a multiple of 0x200. */





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-24
在线时间
1 小时
 楼主| 发表于 2016-3-24 16:49:39 | 显示全部楼层
//LED 灯管脚配置
#include <led.h>

void Led_Init_Configuration()
{
        //GPIO 输出配置
        GPIO_InitTypeDef GPIO_InitStructure;
        //PE5 PB5 设置为推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置为推挽输出
        GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB 5
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);
       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置为推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_Init(GPIOE,&GPIO_InitStructure);//初始化GPIOE 5
        GPIO_ResetBits(GPIOE,GPIO_Pin_5);

}
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-24
在线时间
1 小时
 楼主| 发表于 2016-3-24 16:51:10 | 显示全部楼层
照理说 进入主函数的话 LED灯至少会亮。 现在下载后 灯都不亮。测试原子的中断实验程序是ok的。  软件仿真的时候 单步进不去main函数。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-24
在线时间
1 小时
 楼主| 发表于 2016-3-24 17:07:44 | 显示全部楼层
后来 拷贝原子库函数版本里面的 system_stm32f10x.c 文件  也没有作用。 之前我的流水灯时正常的 说明时钟配置没有问题。在学习中断的时候  就有问题了。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 17:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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