新闻中心

EEPW首页>嵌入式系统>设计应用> STM32学习笔记——测试闪灯程序

STM32学习笔记——测试闪灯程序

作者: 时间:2016-11-28 来源:网络 收藏
//所使用的是STM32F103C8共有48个管脚,共有两组GPIO,为GPIOA和GPIOB,每组有从0到15共16个引脚

//注意对STM32F103C8的操作和对库函数的使用,在使用时,要时刻参考《STM32F10xxx使用手册》和《STM32的函数说明》这两个文档

本文引用地址://m.amcfsurvey.com/article/201611/322894.htm

#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



评论


技术专区

关闭