stm32-点亮led,流水灯

       主要使用的是103和407系列的32  

 不知不觉转眼大二也过了一半了,总是想说要开始学32,学32,却一直没有正真的系统的去开始学32。到了寒假,有了许多可以自己调配的时间, 学了一个多礼拜,大致学到了定时器,输出pwm左右,也实战了一下。之前没学32之前一直以为用32做东西不算什么本事,以为只是调用调用库,哪有51更加底层,更加清楚。学了之后才发现,果断被打脸了。51虽说经典,但是32确实强大。  用32写程序不只是调用库那么简单,要了解32各个函数成员的意义,每个模式的作用........(当然也可以直接copy例程的一个一个的代码块,可以不理解直接用函数接口,但是不建议这样,因为这样永远不能直接做东西) 。

 其实之所以难上手是因为32内部的中断,定时器,寄存器相较于51多了太多太多,所以为了管理这些东西,会有很多的接口,   很多的定义,很多的设置和模式需要自己去判断...... 想想第一次用j-link烧程序的时候都是历经挫折

 本菜鸟接下来来说一下点亮led和流水灯的一些关键点:1. 32不同于51端口不需要进行任何配置就可以用,32因为功能较51强大很多正是体现在这些东西,32初始化需要调用xxx_gpio.h里

的GPIO_InitTypeDef,这是一个结构体,内部的成员有如图:


可以看到里面3个成员,如果是stm32f407的,这里面的 GPIO_Mode还要细分成几个模式

2.GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct),初始化函数,把配置好的端口通过这个函数送入里面初始化,IO口就初始化好了

一言不合上代码:

 

#include "stm32f10x.h"

	
#define	digitalHi(p,i)			{p->BSRR=i;}			//设置为高电平		
#define digitalLo(p,i)			{p->BRR=i;}				//输出低电平
#define digitalToggle(p,i)		{p->ODR ^=i;}			//输出反转状态


void LED_GPIO_Config()
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;

/*开启GPIOB和GPIOF的外设时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
	
/*选择要控制的GPIOB引脚*/															   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	
	
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

/*设置引脚速率为50MHz */   
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

/*调用库函数,初始化GPIOA1*/
GPIO_Init(GPIOA, &GPIO_InitStructure);

/*选择要控制的GPIOB引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;	

/*调用库函数,初始化GPIOA2*/
GPIO_Init(GPIOA, &GPIO_InitStructure);

/*选择要控制的GPIOB引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

/*调用库函数,初始化GPIOA3*/
GPIO_Init(GPIOA, &GPIO_InitStructure);

/*关闭3个led*/
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
}

void Delay(__IO uint32_t nCount)	 //简单的延时函数
{
	for(; nCount != 0; nCount--);
}	
int main(void)
{
	LED_GPIO_Config();
	while(1)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
		Delay(0x0FFFFF);
	    GPIO_SetBits(GPIOA, GPIO_Pin_1);
		
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
		Delay(0x0FFFFF);
	    GPIO_SetBits(GPIOA, GPIO_Pin_2);
		
		GPIO_ResetBits(GPIOA, GPIO_Pin_3);
		Delay(0x0FFFFF);
	    GPIO_SetBits(GPIOA, GPIO_Pin_3);
		
	}
 }



猜你喜欢

转载自blog.csdn.net/mcuwangzai/article/details/79255128