stm32嵌入式系统led闪烁程序疑问
#include"stm32f10x_lib.h"//对stm32地址映射GPIO_InitTypeDefGPIO_InitStructure;//定义结构体ErrorS...
#include "stm32f10x_lib.h"//对stm32地址映射
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体
ErrorStatus HSEStartUpStatus;
/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void Delay(vu32 nCount);
int main(void)
{
#ifdef DEBUG
//如果定义了debug
debug();
//就执行
#endif
//否则跳出
RCC_Configuration(); //stm32配置系统时钟配置函数
NVIC_Configuration(); //中断NVIC配置函数
//使能APB2总线外设时钟
,就是打开APB2总线上相应的GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //这个不清楚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // 选择所有脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置成推挽式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出模式下 I/O输出速度50M HZ
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA口,在这里调用了结构体的所有成员
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB口
while (1)
{
GPIO_Write(GPIOB, 0xffff); //写一个字数据到PB口
Delay(0x8FFFFF); // 延时
GPIO_Write(GPIOB, 0x0000); //写一个字数据到PB口
Delay(0x8FFFFF); // 延时
}
}
void RCC_Configuration(void)
{
//复位RCC外部设备寄存器到默认值
RCC_DeInit();
//打开外部高速晶振,这些在手册都有
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速时钟准备好
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
{
//开启FLASH的预取功能
,为啥要启动这个,我也不清楚
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//FLASH延迟2个周期
FLASH_SetLatency(FLASH_Latency_2);
//配置AHB(HCLK)时钟=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//配置APB2(PCLK2)钟=AHB时钟
RCC_PCLK2Config(RCC_HCLK_Div1);
//配置APB1(PCLK1)钟=AHB 1/2时钟
RCC_PCLK1Config(RCC_HCLK_Div2);
//配置PLL时钟 == 外部高速晶体时钟*9 PLLCLK = 8MHz *9 = 72 MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能PLL时钟
RCC_PLLCmd(ENABLE);
//等待PLL时钟就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//配置系统时钟 = PLL时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//检查PLL时钟是否作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
//为啥要这样写,其实我也不清楚,只能等高手解答
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
#ifdef DEBUG
//为啥这里又来了一个函数?
void assert_failed(u8* file, u32 line)
{
while (1)
{
}
}
#endif 展开
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体
ErrorStatus HSEStartUpStatus;
/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void Delay(vu32 nCount);
int main(void)
{
#ifdef DEBUG
//如果定义了debug
debug();
//就执行
#endif
//否则跳出
RCC_Configuration(); //stm32配置系统时钟配置函数
NVIC_Configuration(); //中断NVIC配置函数
//使能APB2总线外设时钟
,就是打开APB2总线上相应的GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //这个不清楚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // 选择所有脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置成推挽式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出模式下 I/O输出速度50M HZ
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA口,在这里调用了结构体的所有成员
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB口
while (1)
{
GPIO_Write(GPIOB, 0xffff); //写一个字数据到PB口
Delay(0x8FFFFF); // 延时
GPIO_Write(GPIOB, 0x0000); //写一个字数据到PB口
Delay(0x8FFFFF); // 延时
}
}
void RCC_Configuration(void)
{
//复位RCC外部设备寄存器到默认值
RCC_DeInit();
//打开外部高速晶振,这些在手册都有
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速时钟准备好
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
{
//开启FLASH的预取功能
,为啥要启动这个,我也不清楚
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//FLASH延迟2个周期
FLASH_SetLatency(FLASH_Latency_2);
//配置AHB(HCLK)时钟=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//配置APB2(PCLK2)钟=AHB时钟
RCC_PCLK2Config(RCC_HCLK_Div1);
//配置APB1(PCLK1)钟=AHB 1/2时钟
RCC_PCLK1Config(RCC_HCLK_Div2);
//配置PLL时钟 == 外部高速晶体时钟*9 PLLCLK = 8MHz *9 = 72 MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能PLL时钟
RCC_PLLCmd(ENABLE);
//等待PLL时钟就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//配置系统时钟 = PLL时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//检查PLL时钟是否作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
//为啥要这样写,其实我也不清楚,只能等高手解答
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
#ifdef DEBUG
//为啥这里又来了一个函数?
void assert_failed(u8* file, u32 line)
{
while (1)
{
}
}
#endif 展开
1个回答
展开全部
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
//为啥要这样写,其实我也不清楚,只能等高手解答
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
----是表示中断矢量表放在RAM还是FLASH 区。
//为啥这里又来了一个函数?
void assert_failed(u8* file, u32 line)
{
while (1)
{
}
----这是个断言函数,用来检查函数变量合法性的。对程序本身无实质影响。
{
#ifdef VECT_TAB_RAM
//为啥要这样写,其实我也不清楚,只能等高手解答
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
----是表示中断矢量表放在RAM还是FLASH 区。
//为啥这里又来了一个函数?
void assert_failed(u8* file, u32 line)
{
while (1)
{
}
----这是个断言函数,用来检查函数变量合法性的。对程序本身无实质影响。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询