//所运用的是STM32F103C8共有48个管脚,共有两组GPIO,为GPIOA和GPIOB,每组有从0到15共16个引脚
//留意对STM32F103C8的操作和对库函数的运用,在运用时,要时间参阅《STM32F10xxx运用手册》和《STM32的函数阐明》这两个文档
#include“stm32f10x_lib.h”
GPIO_InitTypeDefGPIO_InitStructure;//界说GPIO装备的结构体变量包含GPIO引脚,引脚速度,引脚形式
ErrorStatusHSEStartUpStatus;//枚举类型,过错状况变量界说存储外部高速时钟HSE状况
voidRCC_Configuration(void);//RCC装备函数RCC:复位和时钟操控
voidNVIC_Configuration(void);//NVIC装备函数NVIC:嵌套向量中止操控器
voidDelay(vu32nCount);
intmain(void)
{
#ifdefDEBUG
debug();
#endif
RCC_Configuration();//体系时钟装备函数
NVIC_Configuration();//NVIC装备函数
//使能APB2总线外设时钟APB1,APB2两条衔接总线的外设。具有多个预分频器用于装备AHB的频率,高速APB(APB2)和低速APB(APB1)
//区域。AHB和高速APB的最高频率为72MHz,低速APB的最高频率为36MHz
//APB2是的I/O脚可达18MHz的回转速度
//AHB到APB(1,2)桥,该桥用来衔接一切的APB设备
//两个AHB/APB桥在AHB和两个APB总线之间供给彻底同步当地衔接。APB1被约束在36MHz,APB2作业在全速状况(依据设备的不同
//能够到达72MHz)
//有些外设衔接到APB1上,有些外设衔接到APB2上,详细的状况参看运用手册。
//所以在外设运用前,要先调用函数使能相应总线的时钟
//通用输入/输出GPIO备用输入/输出AFIO
//IO端口存放器有必要以32位字的办法拜访,不允许以半字或许字节的办法拜访
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//使能相应的外设的时钟
//这儿使能GPIOA,GPIOB和备用IO(AFIO)的时钟
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//封闭调试端口从头映射运用仿真器调试时,不能用此语
//下面是GPIO的设置,留意办法
//装备相应的IO。留意装备IO功用时,运用的是GPIO装备的结构体。前面现已界说了GPIO的结构体变量
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//挑选一切脚#defineGPIO_Pin_All((u16)0xFFFF)
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//装备成推挽式输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出形式下I/O输出速度50MHZ
GPIO_Init(GPIOA,&GPIO_InitStructure);//用界说的结构体初始化PA口
GPIO_Init(GPIOB,&GPIO_InitStructure);//用界说的结构体初始化PB口
while(1)
{
GPIO_Write(GPIOB,(u16)~GPIO_ReadOutputData(GPIOB));//写一个字数据到PB口写入的数据是当时GPIOB读取的值然后取反
//就相当于把GPIOB的值取反
Delay(0x8FFFFF);//延时
GPIO_Write(GPIOB,(u16)~GPIO_ReadOutputData(GPIOB));//写一个字数据到PB口把GPIOB的值取反
Delay(0x8FFFFF);//延时
}
}
//复位和时钟设置函数留意装备的办法
voidRCC_Configuration(void)
{
//复位RCC外部设备存放器到默认值
RCC_DeInit();//将外设RCC存放器重设为缺省值
//翻开外部高速晶振
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振HSERCC_HSE_ON:翻开HSE晶振,RCC_HSE_OFF:封闭HSE晶振
//RCC_HSE_Bypass:HSE晶振被外部时钟旁路
//等候外部高速时钟准备好
HSEStartUpStatus=RCC_WaitForHSEStartUp();//等候HSE起振,回来过错状况。前面现已界说了ErrorStatus枚举类型的变量
//HSEStartUpStatus,SUCCESS:HSE晶振安稳且安排妥当,ERROR:HSE晶振未安排妥当
if(HSEStartUpStatus==SUCCESS)//外部高速时钟现已准备好
{
//敞开FLASH的预取功用
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能或失能预取指缓存,FLASH_PrefetchBuffer_Enable:预取指缓存使能
//FLASH_PrefetchBuffer_Disable:预取指缓存失能
//FLASH推迟2个周期
FLASH_SetLatency(FLASH_Latency_2);//设置FLASH存储器代码延时时钟周期数,能够设置FLASH_Latency_0:0延时周期,
//FLASH_Latency_1:1延时周期,FLASH_Latency_2:2延时周期
//装备AHB(HCLK)时钟=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟是体系时钟SYSCLK的多少分频,这儿设为1分频,还能够指定2,4,8,16,64,128,256,512
//分频
//装备APB2(PCLK2)钟=AHB时钟
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟APB2是AHB的多少分频,这儿设为1分频,还能够指定为2,4,8,16分频
//装备APB1(PCLK1)钟=AHB1/2时钟
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟APB1是AHB的多少分频,这儿设为2分频,还能够指定为1,2,4,8,16分频
//装备PLL时钟==外部高速晶体时钟*9PLLCLK=8MHz*9=72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//设置PLL时钟及倍频系数第一个参数设置PLL的输入时钟源
//能够有RCC_PLLSource_HSI_Div2:HSI时钟频率除以2,RCC_PLLSource_HSE_Div1:HSE时钟频率,RCC_PLLSource_HSE_Div2:
//HSE时钟频率除以2
//第二个参数设置PLL的倍频系数,能够是2~16倍频,这儿设为9倍频
//正告:有必要正确设置软件,使PLL输出时钟频率不超越72MHz
//使能PLL时钟
RCC_PLLCmd(ENABLE);//使能或失能PLL,参数能够取ENABLE或DISABLE,假如PLL被用于体系时钟,那么它不能被失能
//等候PLL时钟安排妥当
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//查看指定的RCC标志位设置与否,输入参数为待查看的RCC标志位
//其取值状况详见《STM32的函数阐明(中文)》P211.回来值为RCC_FLAG的新状况,SET或RESET
{
}
//装备体系时钟=PLL时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置体系时钟SYSCLK,输入参数用于指定用作体系时钟的时钟源
//能够为:RCC_SYSCLKSource_HSI:挑选HSI作为体系时钟,RCC_SYSCLKSource_HSE:挑选HSE作为体系时钟,RCC_SYSCLKSource_PLLCLK
//挑选PLL作为体系时钟
//查看PLL时钟是否作为体系时钟
while(RCC_GetSYSCLKSource()!=0x08)//函数RCC_GetSYSCLKSource()回来用作体系时钟的时钟源。
//回来值能够是:0x00:HSI作为体系时钟,0x04:HSE作为体系时钟,0x08:PLL作为体系时钟
{
}
}
}
//嵌套向量中止操控器装备函数
voidNVIC_Configuration(void)
{
#ifdefVECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);//设置向量表的方位和偏移,第一个参数指定向量表的方位在RAM仍是在
//程序存储器flash中,取值能够是NVIC_VectTab_RAM:向量表坐落RAM,NVIC_VectTab_FLASH:向量表坐落FLASH。第二个参数为
//向量表基地址的偏移量,关于FLASH,该参数值有必要高于0x08000100,关于RAM,有必要高于0x100.它一起有必要是256(64*4)的整数倍
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
}
voidDelay(vu32nCount)
{
for(;nCount!=0;nCount–);
}
#ifdefDEBUG
//assert_failed编写于文件main.c或其他用户C文件中
voidassert_failed(u8*file,u32line)
{
while(1)
{
}
}
#endif
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/256331.html