首页 > 其他分享 >STM32开发手册(1)

STM32开发手册(1)

时间:2024-07-17 23:26:24浏览次数:9  
标签:Delay 0000 Pin void 手册 STM32 开发 GPIO GPIOA

前言:

        不说废话只讲有用的。

        如果你是完全在此之前没有这方面的基础的话。可以先从学习c语言(指针,结构体)等部分先进行一个初步了解以后再开始学习,这样会更好接受。

        对于学习顺序的话,我是先上手的32,然后Arduino,最后是开始进行Linux的开发。51的话没有很仔细的研究。虽然有人说先学51然后开始学习32会轻松一些。但我感觉这个因人而异。

        本章开始包括以后的内容都会采用寄存器的方式在keil上运行。但个人感觉在对stm32有一定了解以后,可以多去尝试库函数的书写方式,以及使用eclipse来编译。会发现更加方便。

1.背景:

        STM32系列微控制器的核心是ARM Cortex处理器,具有高性能、高代码密度的Thumb指令集,以及高效的中断处理机制。例如,Cortex-M0主要用于低功耗和混合信号处理,Cortex-M3则在性能和能耗之间实现了良好平衡,而Cortex-M7则专注于高性能控制运算领域

        对于新手学习建议,通常建议从STM32F0或STM32F103(属于F1系列)开始入手,因为它们的学习资源丰富,开发板和社区支持较好,同时也足以应对大多数入门级别的项目需求。

2.流水灯的实现:

        接下来我们在keil上实现对于stm32最基础功能的实现,流水灯功能的实现。这里还是使用的寄存器的方法来完成

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 
int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000
		Delay_ms(100);
	}
}

3.button的使用:

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}

void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

void LED1_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}

void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void LED2_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyNum = 1;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	
	return KeyNum;
}
#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 
uint8_t KeyNum;

int main(void)
{
	LED_Init();
	Key_Init();
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			LED1_Turn();
		}
		if (KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}

4.总结:

        这只是一个开始,对于开发板进行熟悉!开发板对于学习而言效果更加好,清晰。等熟练以后可以尝试stm32的核心板的使用。相信你在stm32的学习过程中会得到无线的喜悦和满足。(对于stm32的初体验,我会持续更新。如果感兴趣的话可以关注留言评论。你的支持是我最大的动力)

标签:Delay,0000,Pin,void,手册,STM32,开发,GPIO,GPIOA
From: https://blog.csdn.net/m0_74962389/article/details/140508092

相关文章

  • 【头歌】HBase开发: Java API 管理表 答案
    专栏已收集头歌大数据所有答案第一关JavaAPI获取表的列表:packagestep1; importjava.util.ArrayList;importjava.util.List; importorg.apache.hadoop.conf.*;importorg.apache.hadoop.hbase.*;importorg.apache.hadoop.hbase.client.*;importorg.apache.......
  • 【头歌】Hadoop开发环境搭建 答案
    第二关要在第一关的基础上配置,要过就两关一起,不然浪费时间第1关:配置开发环境-JavaJDK的配置任务描述本关任务:配置JavaJDK。编程要求根据上述步骤,配置好Hadoop开发环境,点击评测即可。提示:如果出现文件解压大小限制的情况,可以使用ulimit-f1000000命令来解除......
  • stm32F407SPI-RC522-NFC卡-移植
    目录stm32F407SPI-RC522-NFC卡-移植-简易版nfc卡的原理RC522读卡器的原理应用场景移植步骤好用的代码完整代码stm32F407SPI-RC522-NFC卡-移植-简易版学习spi,移植nfc卡的原理卡内有芯片,0区存卡的id原来要两重密码才能修改卡中数据RC522读卡器的原理应用场景移植步骤问淘......
  • Android开发 - 视图布局属性解析
    LinearLayout:主要以水平或垂直方式来排列界面中的控件。并将控件排列到一条直线上。在线性布局中,如果水平排列,垂直方向上只能放一个控件,如果垂直排列,水平方向上也只能放一个控件RelativeLayout:称作相对布局,非常常用的一种布局。和LinearLayout的排列规则不同,RelativeLayout显......
  • 【STM32】RTT-Studio中HAL库开发教程四:DAC+DMA输出波形
    文章目录一、DAC介绍二、HAL库配置初始化三、RTT中初始化四、测试验证一、DAC介绍1.DAC作用DAC(Digital-to-AnalogConverter),即为数字/模拟转换模块,又称D/A转换器;作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与ADC相反。即为输出波形和输出固定电压......
  • android开发基于Android10分析请求Zygote执行Fork一个新的应用程序的过程
    android开发基于Android10分析请求Zygote执行Fork一个新的应用程序的过程```ActivityTaskManagerService.activityPausedActivityStack.activityPausedLockedRootActivityContainer.resumeFocusedStacksTopActivitiesActivityStackSupervisor.startSpecificActivityLocked......
  • 2024-07-17 搭建一个node+express服务器,并把静态资源部署到该服务器(本地开发)
    前言:请确保你已安装了node,没有你得先装这个。步骤一://创建文件夹mkdirexpress-node//创建完了进入该文件夹cdexpress-node//初始化npminit-y//安装expressnpmiexpress前提工作都准备好后,在express-node文件夹里新建文件server.js,作为启动服务器的入口文件......
  • idea开发工具配置git,连接到gitee远程仓库
    1.打开idea,Settings里找到如下位置,正常idea会自动找到git,test测试,显示版本号说明正常 2.创建本地Git仓库,默认就是当前项目路径,不要修改,直接创建 3.创建后自动识别出待提交的文件,输入说明,提交,提交后让输入git名称和邮箱,设置并提交,提交成功。我这个项目是前后端都放一起了......
  • iOS开发基础127-深入探讨KVO
    一、基础KVO(Key-ValueObserving,键值观察)是Cocoa提供的一种机制,它允许我们观察属性的变化并做出响应。这种机制非常强大,广泛应用于各种编程场景,如数据绑定、状态变化监控等。在深入了解KVO之前,我们先从KVO的基本概念开始,然后逐步探讨其深层次应用和一些使用实践的注意事项......
  • 网站协作开发指南
    协作开发指南开发环境的配置环境是Eclipse,JDK21,Git,Maven。以上软件下载官网最新版本即可。通过Git拉取分支到本地,创建本地的一个分支(git的使用后面有写),按照自己的分工进行开发。开发完毕后push自己的分支,合并到master分支中。Git拉取的时候整个项目就会下载下来了,把下......