STM32点亮第一个LED

还有第二个,并轮换。

准备入门STM32,于是拿出了买到手至少2年的洋桃M1板子,STM32F103C8T6

配置有3个LED,3个按钮,RS232,RS485,CAN,有JTAG,有RTC电池,IO口引出

对于我这新手都算不上的,足够丰富。

当初拿到手,拿例程看了看,下载Hex试了试,然后就放起来落灰了。

上边代码是按照固件库方式建立的工程,里边的main.c,没有洋桃的led,rcc,sys等库文件,因为我都给整一起了, 得看。

延时程序照搬过来的,LED_Init函数按照源代码做了修改,因为有些变量我直接用了STM32固件库的,比如GPIO_Pin_0 ,GPIO_Pin_1,GPIOB,GPIO_Mode_Out_PP,GPIO_Speed_50MHz。

GPIO_InitTypeDef 结构体是预定义的。

结合《STM32F103固件函数库用户手册(中文).pdf》里的GPIO部分和RCC部分,对比代码,立刻就明白了。

#define AHB_INPUT  72  //请按RCC中设置的AHB时钟频率填写到这里(单位MHz)

#include "stm32f10x.h"

void LED_Init(void); //LED初始化函数声明
void RCC_Configuration(void); //RCC时钟类的设置
void delay_init(void);
void delay_s(u16 s);
void delay_ms(u16 nms);
void delay_us(u32 nus);

int  main(){
	RCC_Configuration(); //时钟设置
	LED_Init(); //LED初始化
	while(1)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_0);
		delay_s(1);
		GPIO_ResetBits(GPIOB,GPIO_Pin_0);
		delay_s(1);
				GPIO_SetBits(GPIOB,GPIO_Pin_1);
		delay_s(1);
		GPIO_ResetBits(GPIOB,GPIO_Pin_1);
		delay_s(1);
	}   
}

void LED_Init(void){
	//配置结构体	
	GPIO_InitTypeDef led_init;
	led_init.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1;      //GPIOC13引脚
	led_init.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出	
	led_init.GPIO_Speed = GPIO_Speed_50MHz; //10MHz
	//对成员进行初始化
	GPIO_Init(GPIOB, &led_init);
	GPIO_ResetBits(GPIOB,GPIO_Pin_0 | GPIO_Pin_1); //LED灯都为低电平(0) 初始为关灯
}

void RCC_Configuration(void){ //RCC时钟的设置  
	ErrorStatus HSEStartUpStatus;   
	RCC_DeInit();              /* RCC system reset(for debug purpose) RCC寄存器恢复初始化值*/   
	RCC_HSEConfig(RCC_HSE_ON); /* Enable HSE 使能外部高速晶振*/   
	HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Wait till HSE is ready 等待外部高速晶振使能完成*/   
	if(HSEStartUpStatus == SUCCESS){   
		/*设置PLL时钟源及倍频系数*/   
		RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //RCC_PLLMul_x(枚举2~16)是倍频值。当HSE=8MHZ,RCC_PLLMul_9时PLLCLK=72MHZ   
		/*设置AHB时钟(HCLK)*/   
		RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB时钟 = 系统时钟(SYSCLK) = 72MHZ(外部晶振8HMZ)   
		/*注意此处的设置,如果使用SYSTICK做延时程序,此时SYSTICK(Cortex System timer)=HCLK/8=9MHZ*/   
		RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速AHB时钟(PCLK1),RCC_HCLK_Div2——APB1时钟 = HCLK/2 = 36MHZ(外部晶振8HMZ)   
		RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟(PCLK2),RCC_HCLK_Div1——APB2时钟 = HCLK = 72MHZ(外部晶振8HMZ)   
		/*注:AHB主要负责外部存储器时钟。APB2负责AD,I/O,高级TIM,串口1。APB1负责DA,USB,SPI,I2C,CAN,串口2,3,4,5,普通TIM */  
		FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器延时时钟周期数   
		/*FLASH时序延迟几个周期,等待总线同步操作。   
		推荐按照单片机系统运行频率:
		0—24MHz时,取Latency_0;   
		24—48MHz时,取Latency_1;   
		48~72MHz时,取Latency_2*/   
		FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //选择FLASH预取指缓存的模式,预取指缓存使能   
		RCC_PLLCmd(ENABLE);	//使能PLL
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL输出稳定   
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择SYSCLK时钟源为PLL
		while(RCC_GetSYSCLKSource() != 0x08); //等待PLL成为SYSCLK时钟源   
	}  
	/*开始使能程序中需要使用的外设时钟*/   
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |   
		RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE); //APB2外设时钟使能(开USART1,GPIOA B C D E)     
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //启动重映射功能时钟(在使用与JTAG接口冲突的GPIO时需要开启AFIO)
}

void delay_us(u32 uS){ //nS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)	
  SysTick->LOAD=AHB_INPUT*uS;      //重装计数初值(当主频是72MHz,72次为1微秒)
   SysTick->CTRL=0x00000005;//时钟源HCLK,打开定时器
   while(!(SysTick->CTRL&0x00010000)); //等待计数到0
   SysTick->CTRL=0x00000004;//关闭定时器
}

void delay_ms(u16 ms){ //mS毫秒级延时程序(参考值即是延时数,最大值65535)	 		  	  
	while( ms-- != 0){
		delay_us(1000);	//调用1000微秒的延时
	}
}
 
void delay_s(u16 s){ //S秒级延时程序(参考值即是延时数,最大值65535)	 		  	  
	while( s-- != 0){
		delay_ms(1000);	//调用1000毫秒的延时
	}
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的STM32点亮第一个LED灯的程序: 1. 首先,需要在STM32的开发环境中创建一个工程,并将工程名设置为“LED_Blink”。 2. 然后,需要在工程中添加一个源文件,命名为“main.c”。 3. 在“main.c”文件中,需要包含以下头文件: ``` #include "stm32f10x.h" ``` 4. 在“main.c”文件中,需要定义一个函数来初始化GPIO端口,以便控制LED灯的亮灭。以下是初始化GPIO端口的函数: ``` void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } ``` 5. 在“main.c”文件中,需要定义一个函数来控制LED灯的亮灭。以下是控制LED灯的亮灭的函数: ``` void LED_Blink(void) { while (1) { GPIO_SetBits(GPIOC, GPIO_Pin_13); Delay(1000000); GPIO_ResetBits(GPIOC, GPIO_Pin_13); Delay(1000000); } } ``` 6. 在“main.c”文件中,需要定义一个函数来实现延时。以下是实现延时的函数: ``` void Delay(__IO uint32_t nCount) { while(nCount--) { } } ``` 7. 最后,在“main.c”文件中,需要定义一个主函数,并在主函数中调用以上三个函数。以下是主函数的代码: ``` int main(void) { GPIO_Init(); LED_Blink(); } ``` 以上就是一个简单的STM32点亮第一个LED灯的程序。需要注意的是,针脚号和其他硬件配置可能会因不同的开发板而有所不同,需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值