STM32中的NVIC_Configuration要加什么头文件? 10
我自己编辑的NVIC_Configuration和EXTI_PE5_Config函数,编译后显示如下错误:main.c(30):warning:#223-D:functi...
我自己编辑的NVIC_Configuration和EXTI_PE5_Config函数,编译后显示如下错误:main.c(30): warning: #223-D: function "EXTI_PE5_Config" declared implicitlyexti.c(27): error: #20: identifier "NVIC_InitTypeDef" is undefinedexti.c(30): warning: #223-D: function "NVIC_PriorityGroupConfig" declared implicitlyexti.c(30): error: #20: identifier "NVIC_PriorityGroup_1" is undefinedexti.c(33): error: #20: identifier "EXTI9_5_IRQn" is undefinedexti.c(36): error: #20: identifier "ENABLE" is undefinedexti.c(37): warning: #223-D: function "NVIC_Init" declared implicitlyexti.c(49): error: #20: identifier "GPIO_InitTypeDef" is undefinedexti.c(50): error: #20: identifier "EXTI_InitTypeDef" is undefinedexti.c(53): warning: #223-D: function "RCC_APB2PeriphClockCmd" declared implicitlyexti.c(53): error: #20: identifier "RCC_APB2Periph_GPIOE" is undefinedexti.c(53): error: #20: identifier "RCC_APB2Periph_AFIO" is undefinedexti.c(53): error: #20: identifier "ENABLE" is undefinedexti.c(59): error: #20: identifier "GPIO_Pin_5" is undefinedexti.c(60): error: #20: identifier "GPIO_Mode_IPD" is undefinedexti.c(61): warning: #223-D: function "GPIO_Init" declared implicitlyexti.c(61): error: #20: identifier "GPIOE" is undefinedexti.c(64): warning: #223-D: function "GPIO_EXTILineConfig" declared implicitlyexti.c(64): error: #20: identifier "GPIO_PortSourceGPIOE" is undefinedexti.c(64): error: #20: identifier "GPIO_PinSource5" is undefined求解释!!
展开
7个回答
展开全部
我也比如一下
比如说按键中断
1.要使能时钟和相关GPIO口(按键口)
2.使能中断嵌套程序NVIC,里面的关键是中断类型(在本例子中就是外部中断啦,所有的中断都要使能NVIC,否则不能中断),如果就一个中断,优先级可忽略
3.使能外部中断EXTI,其实就是按键中断了
4.主程序中一般是循环啦
举个例子,最简单的
mian()
{
RCC_config();
GPIO_config();
NVIC_config();
EXTI_Config();
while(1);
}
5.中断函数程序中,注意这个是在另一个文件下stm32f10x_it.c,而上面的所有步骤都是在main.c文件中的
编写中断程序
void EXTI9_5_IRQHandler(void)
{
delay(); //延时函数
}
因为我用的是第8道,所以函数名是
EXTI9_5_IRQHandler
6.开始运行程序啦,从上往下走,配置完了时钟,GPIO,NVIC,EXTI后就进入while(1)死循环中,这时候当你按下按键后,会产生一个电平的变换1变0或0变1,对应的GPIO口接受到这个变换后就会发生中断,进入中断函数
EXTI9_5_IRQHandler,中断函数中是个延时函数,等延时完就会结束中断函数返回主函数啦。
贴一个我写的小例子,就是按键中断的。主函数中为点亮灯,中断函数为熄灭灯
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"
void RCC_Configuration(void) //时钟配置函数
{
ErrorStatus HSEStartUpStatus;
//使能外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部晶振稳定
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//如果外部晶振启动成功,则进行下一步操作
if(HSEStartUpStatus==SUCCESS)
{
//设置HCLK(AHB时钟)=SYSCLK 将系统时钟进行分频后,作为AHB总线时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//PCLK1(APB1) = HCLK/2 将HCLK时钟2分频后给低速外部总线
RCC_PCLK1Config(RCC_HCLK_Div2);
//PCLK2(APB2) = HCLK HCLK时钟配置给高速外部总线
RCC_PCLK2Config(RCC_HCLK_Div1);
//外部高速时钟HSE 4倍频
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
//启动PLL
RCC_PLLCmd(ENABLE);
//等待PLL稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//系统时钟SYSCLK来自PLL输出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//切换时钟后等待系统时钟稳定
while(RCC_GetSYSCLKSource()!=0x08);
}
// RCC system reset(for debug purpose) 下面这些都是外设总线上所挂的外部设备时钟的配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
}
extern void Delay(int cnt) //延时函数
{
int i,j;
for (i=0;i<cnt;i++)
{ for (j=0;j<1000;j++)
{
}
}
}
void GPIO_Configuration(void) //GPIO配置函数
{
//GPIO_DeInit(GPIOA);
GPIO_InitTypeDef GPIO_InitStructure;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
// 管脚选择
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
// 清除 EXTI线路挂起位
EXTI_ClearITPendingBit(EXTI_Line8|EXTI_Line9);
//
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Line = EXTI_Line8;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 注意名称是“_IRQn”,不是“_IRQChannel”
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
EXTI_Config();
NVIC_Config();
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}
}
IT中的函数
void Delay();
void EXTI9_5_IRQHandler(void)
{
if ( EXTI_GetITStatus(EXTI_Line8) != RESET )
{
EXTI_ClearITPendingBit(EXTI_Line8);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
//Delay(100);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0);
}
if ( EXTI_GetITStatus(EXTI_Line9) != RESET )
{
EXTI_ClearITPendingBit(EXTI_Line9);
//Delay(1000);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0);
}
}
比如说按键中断
1.要使能时钟和相关GPIO口(按键口)
2.使能中断嵌套程序NVIC,里面的关键是中断类型(在本例子中就是外部中断啦,所有的中断都要使能NVIC,否则不能中断),如果就一个中断,优先级可忽略
3.使能外部中断EXTI,其实就是按键中断了
4.主程序中一般是循环啦
举个例子,最简单的
mian()
{
RCC_config();
GPIO_config();
NVIC_config();
EXTI_Config();
while(1);
}
5.中断函数程序中,注意这个是在另一个文件下stm32f10x_it.c,而上面的所有步骤都是在main.c文件中的
编写中断程序
void EXTI9_5_IRQHandler(void)
{
delay(); //延时函数
}
因为我用的是第8道,所以函数名是
EXTI9_5_IRQHandler
6.开始运行程序啦,从上往下走,配置完了时钟,GPIO,NVIC,EXTI后就进入while(1)死循环中,这时候当你按下按键后,会产生一个电平的变换1变0或0变1,对应的GPIO口接受到这个变换后就会发生中断,进入中断函数
EXTI9_5_IRQHandler,中断函数中是个延时函数,等延时完就会结束中断函数返回主函数啦。
贴一个我写的小例子,就是按键中断的。主函数中为点亮灯,中断函数为熄灭灯
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"
void RCC_Configuration(void) //时钟配置函数
{
ErrorStatus HSEStartUpStatus;
//使能外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部晶振稳定
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//如果外部晶振启动成功,则进行下一步操作
if(HSEStartUpStatus==SUCCESS)
{
//设置HCLK(AHB时钟)=SYSCLK 将系统时钟进行分频后,作为AHB总线时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//PCLK1(APB1) = HCLK/2 将HCLK时钟2分频后给低速外部总线
RCC_PCLK1Config(RCC_HCLK_Div2);
//PCLK2(APB2) = HCLK HCLK时钟配置给高速外部总线
RCC_PCLK2Config(RCC_HCLK_Div1);
//外部高速时钟HSE 4倍频
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
//启动PLL
RCC_PLLCmd(ENABLE);
//等待PLL稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//系统时钟SYSCLK来自PLL输出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//切换时钟后等待系统时钟稳定
while(RCC_GetSYSCLKSource()!=0x08);
}
// RCC system reset(for debug purpose) 下面这些都是外设总线上所挂的外部设备时钟的配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
}
extern void Delay(int cnt) //延时函数
{
int i,j;
for (i=0;i<cnt;i++)
{ for (j=0;j<1000;j++)
{
}
}
}
void GPIO_Configuration(void) //GPIO配置函数
{
//GPIO_DeInit(GPIOA);
GPIO_InitTypeDef GPIO_InitStructure;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
// 管脚选择
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
// 清除 EXTI线路挂起位
EXTI_ClearITPendingBit(EXTI_Line8|EXTI_Line9);
//
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Line = EXTI_Line8;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 注意名称是“_IRQn”,不是“_IRQChannel”
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
EXTI_Config();
NVIC_Config();
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}
}
IT中的函数
void Delay();
void EXTI9_5_IRQHandler(void)
{
if ( EXTI_GetITStatus(EXTI_Line8) != RESET )
{
EXTI_ClearITPendingBit(EXTI_Line8);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
//Delay(100);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0);
}
if ( EXTI_GetITStatus(EXTI_Line9) != RESET )
{
EXTI_ClearITPendingBit(EXTI_Line9);
//Delay(1000);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0);
}
}
展开全部
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我之前也遇到过这种问题,最后发现时在自己写的一个xxx.h中没有写#include “stm32f10x.h”.之后加了这行之后,就没报错了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
stm32f10x_conf.h
然后在stm32f10x_conf.h 继续选择你需要的外设。
然后在stm32f10x_conf.h 继续选择你需要的外设。
追问
我添加过需要的头文件
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include "misc.h"
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询