STM32学习第二天之“点灯大师”



前面说了一些stm32的基本知识,今天就开始学习函数了。是不是很快,没错就是那么快。


学习32的第一个项目,肯定离不开点灯。没错,我们的第二天学习也是从点灯开始。


要想点灯,首先要学习寄存器。


每组IO端口包括以下几个寄存器资源
两个32位寄存器:一个32位配置低寄存器(GPIOx_CRL)
一个32位配置高寄存器(GPIOx_CRH)()




两个16位寄存器:
一个16位输入数据寄存器(GPIOx_IDR)(高16位保留,低16位只读) ***********************低16位对应每组端口的每一个******************
一个16位输出数据寄存器(GPIOx_ODR)(高16位保留,低16位可读可写) ***********************低16位对应每组端口的每一个******************
一个32位置位/复位寄存器 (GPIOx_BSRR) ***********控制ODR,写1或者清零
一个16位复位寄存器 (GPIOx_BRR) *********某个位复位
一个32位锁定寄存器 (GPIOx_LCKR) *********锁定某个寄存器。


以上就是一些常见的寄存器了,通常第一天的开始都是使用寄存器进行编程。所以我们也不例外


此处以点亮红灯作为例子。本人使用的开发板红灯是连接在PC8上,且输入低电平有效。


寄存器点灯大师


头文件


#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"




//红灯的宏定义
#define LED_R_ON()  do {GPIOC->BRR |= 1 << 8;} while(0)
#define LED_R_OFF() do {GPIOC->BSRR |= 1 << 8;} while(0)
//绿灯的宏定义
#define LED_G_ON() do {GPIOC->BRR |= 1 << 7;} while(0)
#define LED_G_OFF() do {GPIOC->BSRR |= 1 << 7;} while(0)
//蓝灯的宏定义
#define LED_B_ON() do {GPIOC->BRR |= 1 << 6;} while(0)
#define LED_B_OFF() do {GPIOC->BSRR |= 1 << 6;} while(0)


void led_Init(void);




#endif




.C文件


#include "led.h"

void led_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIOC->CRH &= ~0xF;  
	
	GPIOC->CRH |= 0x3;    
	
	
	GPIOC->CRL &= ~(0xFF << 24);
	GPIOC->CRL |= 0x33 << 24;



}










main函数


#include "stm32f10x.h"
#include "led.h"


/************************
函数:延时函数
功能:不精确延时
*************************/
void delay(uint32_t count)
{
  int i;
  while (count--) {
	for (i = 0; i < 1000; i++) {}
  }
}





int main(void)
{
	led_Init();
	  while (1)
	  {
	LED_R_ON();
	delay(3000);
	LED_R_OFF();
	delay(1000);
	  
	LED_G_ON();
	delay(3000);
	LED_G_OFF();
	delay(1000);
	
	LED_B_ON();
	delay(3000);
	LED_B_OFF();
	delay(1000);
		}
		  
}













最后也是成功点亮了




不得不说,寄存器开发对于我这样的新手难度确实是很大,所以我并不打算一直使用寄存器开发。


下面老师还介绍了一种比较高效而且十分好用的方式,库函数开发


.h文件


#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"
void LED_Init(void);

#define LED_R_ON() do {GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET);} while(0)  // 写指定 IO 口
#define LED_R_OFF() do {GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET);} while(0)  // 写指定 IO 口

#define LED_G_ON() do {GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET);} while(0)  // 写指定 IO 口
#define LED_G_OFF() do {GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET);} while(0)  // 写指定 IO 口

#define LED_B_ON() do {GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_RESET);} while(0)  // 写指定 IO 口
#define LED_B_OFF() do {GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET);} while(0)  // 写指定 IO 口

#endif



.C文件


#include  "led.h"

/****************
函数功能:LED初始化
************/
void LED_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init(GPIOC,&GPIO_InitStructure);

}



main函数



#include "stm32f10x.h"
#include "led.h"

void delay(uint32_t count)
{
  int i;
  while (count--) {
	for (i = 0; i < 1000; i++) {}
  }
}


int main(void)
{
	LED_Init();
	
	
  while (1)
  {
		LED_R_ON();
		delay(5000);
		LED_R_OFF();
		delay(5000);
		LED_G_ON();
		delay(5000);
		LED_G_OFF();
		delay(5000);
		LED_B_ON();
		delay(5000);
		LED_B_OFF();
		delay(5000);
		
  }
}



做到这里就基本完成了,用老师的话来说就是点灯大师~!

展开阅读全文

页面更新:2024-04-16

标签:大师   寄存器   红灯   端口   函数   两个   老师   功能   文件   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top