IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F407 芯片的学习 day03 工程模块建立的新的办法,和使用寄存器 来点亮LED 灯 , 蜂鸣器, key 按键 -> 正文阅读

[嵌入式]STM32F407 芯片的学习 day03 工程模块建立的新的办法,和使用寄存器 来点亮LED 灯 , 蜂鸣器, key 按键

????1.新建一个文件夹。



?? ?2.新建一个工程- new project - 定位到文件夹中 -命名。



?? ?3.选择芯片。



?? ?4.选择 :
?? ??? ?CMSIS 标准 - core勾选
?? ??? ?DEVICE - startup 勾选
?? ??? ?标准库 - ? ??

????????????????GPIO勾选
?? ??? ??? ??? ?framework勾选
?? ??? ??? ??? ?RCC勾选
?? ??? ??? ??? ?//或者点击resolve解决这个问题。
?? ??? ??? ??? ?//五个勾就算完成任务。

core

startup

图片:

?GPIO勾选
? framework勾选
RCC勾选


?? ?5.点击三个方块 - 新建文件夹,组织文件结构(改变工程文件夹的名字? (可以不操作))


?
?? ?6.新建文件c文件并且添加进工程当中。
?? ??? ?//右键 - add new items to this group

? ? ? ? 1.新建.c 文件 保存

? ? ? ? 2.然后添加到文件夹里面就可以(直接左边的项目栏 里面的? 文件夹? 右键, 添加,就行了)



?? ?7.新编写一个主函数并且编译。



?? ?8.进到stm32f4xx.h中的109行的宏添加到 options for target c/c++中;
?? ??? ?//再编译一下就没有错误了。


?9.使用寄存器 来点亮LED 灯 , 蜂鸣器, key 按键

寄存器的地址? ? ?RCC??基地址;0x40023800

时钟地址

?? ?1配置时钟:找到AHB1总线的寄存器位?? ?//找到各种功能所对应的寄存器位
?? ?RCC ?的地址? ? (初始化,LED 的引脚GPIOE? ?让他使能!!)
????基地址 + 偏移地址;?? ?0x4002 3800 + 0x30

使这个地址的数值等于:0x10

	unsigned int * PECLK =(unsigned int *)(0x40023800 + 0x30);//寄存器的位置
	*PECLK = 0X10;//寄存器的赋值

?10.配置引脚:模式:输出模式 ?输出类型 ?速度 ?电阻 引脚输出的电平? :也要找到寄存器位
?? ?基地址+偏移地址; //查手册:存储器映射? ??0x40021000 + 0x00 :?

配置引脚:

1.我们要找的引脚是? GPIOE? ?(地址 :? 0x40021000)

?2.然后找到GPIO 配置引脚的部分:

?

GIOPE 引脚输出设置的地址? (基本地址 + 偏移量 )

地址:?0x40021000? ?+? 0x00

赋值的大小:??(1<<2*8 ?| 1 << 2 * 9 | 1 << 2*10);

或者为0x1a0000

代码:

unsigned int * PEMODE = (void*)(0x40021000 + 0x00);//GPIO 的地址
*PEMODE = (1<<2*8  | 1 << 2 * 9 | 1 << 2*10);//设置为GPIOE  8 9 10 这些引脚为输出引脚


输出类型? :? ?(也可以不设置? ?因为默认状态是? 推挽输出)?

?

?地址 (基地址? + 偏移地址)=? ? GPIOE? ?(地址 :? 0x40021000)+ (偏移地址? 0x04)

赋值的大小:0x000

代码:

unsigned int * PEMODE_leixing = (void*)(0x40021000 + 0x04);//设置引脚的输出类型
*PEMODE_leixing=0x000;//设置输出类型 为推挽输出

?速度:? (假如设置引脚的速度为低速? 也可以不要设置,因为它默认是 低速)

?

地址 (基地址? + 偏移地址)=? ? GPIOE? ?(地址 :? 0x40021000)+ (偏移地址? 0x08)

赋值的大小:0x30000

代码:

unsigned int * PESPEED = (void*)(0x40021000 + 0x08);//设置引脚 的速度
*PESPEED =0x10000;//引脚8 为 中速  9  10  为低速

?电阻:? ? ?(LED? 亮? 一般配置 上拉电阻)

地址 (基地址? + 偏移地址)=? ? GPIOE? ?(地址 :? 0x40021000)+ (偏移地址? 0x0c)

赋值的大小:0x150000

代码:

unsigned int * PEMODE_dianzu = (void*)(0x40021000 + 0x0c);//设置引脚的电阻
*PEMODE_dianzu=0x150000;//引脚8 为 中速  9  10 为上拉电阻

引脚输出的电平 :(LED 灯亮? 为输出低电平)

地址 (基地址? + 偏移地址)=? ? GPIOE? ?(地址 :? 0x40021000)+ (偏移地址? 0x14)

赋值的大小:0x0 (0)

代码:

unsigned int *PEdata = (void*)(0x40021000 + 0x14);//设置引脚的输出的电平
	*PEdata = 0;//设置引脚都输出低电平


LED 亮的? ?总的代码:

#include "stm32f4xx.h"
//.寄存器方法配置GPIO接口功能:1点亮一个灯-打开蜂鸣器-按键检测
int main()
{
		//GPIOE-8 9 10 ; //
	unsigned int * PECLK =(unsigned int *)(0x40023800 + 0x30);
	unsigned int * PEMODE = (void*)(0x40021000 + 0x00);//设置引脚为 输出模式 或者输入模式
	unsigned int * PEMODE_leixing = (void*)(0x40021000 + 0x04);//设置引脚的输出类型
	unsigned int * PEMODE_dianzu = (void*)(0x40021000 + 0x0c);//设置引脚的电阻
	unsigned int * PESPEED = (void*)(0x40021000 + 0x08);//设置引脚 的速度
	unsigned int *PEdata = (void*)(0x40021000 + 0x14);//设置引脚的输出的电平
	//1配置时钟:找到AHB1总线的寄存器位	//找到各种功能所对应的寄存器位
	//RCC  的地址 
	//基地址 + 偏移地址;	0x4002 3800 + 0x30
	// 0000 0000 0000 0000 0000 0000 0001 0000 = 0x10;	
	*PECLK = 0X10;//设置时钟
	
	
	//2.配置引脚:模式:输出模式  输出类型  速度  电阻 引脚  :也要找到寄存器位
	//基地址+偏移地址;//查手册:存储器映射
	//0x40021000 + 0x00 : 
	
	
	// 0000 0000 0000 0001 0000 0000 0000 0000  = 0x10000;
	//*PEMODE = 0X10000;
	*PEMODE = (1<<2*8  | 1 << 2 * 9 | 1 << 2*10);//设置引脚 8  9  10 引脚为输出模式
	*PEMODE_leixing=0x000;//设置输出类型 为推挽输出
	*PESPEED =0x10000;//引脚8 为 中速  9  10  为低速
	*PEMODE_dianzu=0x150000;//引脚8 为 中速  9  10 为上拉电阻

	//3.操作引脚:输出低电平   //也要找到寄存器位
	//数据寄存器;
	//0x40021000 + 0x14
	
	*PEdata = 0;//设置引脚都输出低电平

	//防止程序跑飞
	while(1);
}



11.使用寄存器 使 蜂鸣器 响 或者关闭!

1.首先配置时钟:

?寄存器的地址? ? ?RCC??基地址;0x40023800

时钟地址

?? ?1配置时钟:找到AHB1总线的寄存器位?? ?//找到各种功能所对应的寄存器位
?? ?RCC ?的地址? ? (初始化,LED 的引脚GPIOE? ?让他使能!!)
????基地址 + 偏移地址;?? ?0x4002 3800 + 0x30

使这个地址的数值等于:0x02

	unsigned int * PECLK =(unsigned int *)(0x40023800 + 0x30);//寄存器的位置
	*PECLK = 0X02;//寄存器的赋值

?1.设置引脚的输出模式? (蜂鸣器的引脚是? ?GPIOB? ?10)

我们要找的引脚是? GPIOB? (地址 :? 0x40020400)?

?2.然后找到GPIO 配置引脚的部分:

?

GIOPB?引脚输出设置的地址? (基本地址 + 偏移量 )

地址:0x40020400? ?+? 0x00

赋值的大小:??

或者为0x100000

代码:

unsigned int * BEEP_PEMODE = (void*)(0x40020400 + 0x00);//设置引脚为 输出模式 或者输入模式
	*BEEP_PEMODE=0x100000;//设置引脚为 GPIOB  10 输出模式

输出类型? :? ?(也可以不设置? ?因为默认状态是? 推挽输出)?

?

?地址 (基地址? + 偏移地址)=? ? GPIOB? (地址 :? 0x40020400)+ (偏移地址? 0x04)

赋值的大小:0x000

代码:

unsigned int * BEEP_PEMODE_leixing = (void*)(0x40020400 + 0x04);//设置引脚的输出类型
*BEEP_PEMODE_leixing=0x000000;//设置输出类型 为推挽输出

?速度:? (假如设置引脚的速度为低速? 也可以不要设置,因为它默认是 低速)

?

地址 (基地址? + 偏移地址)=? ? GPIOB? ?(地址 :? 0x40020400)+ (偏移地址? 0x08)

赋值的大小:0x00000

代码:

	unsigned int * BEEP_PESPEED = (void*)(0x40020400 + 0x08);//设置引脚 的速度
*BEEP_PESPEED=0x0000;//设置引脚 的速度 GPIOB 10 为低速

?电阻:? ? ?(? 蜂鸣器? 一般配置 上拉电阻)

地址 (基地址? + 偏移地址)=? ?? GPIOB? ?(地址 :? 0x40020400)+ (偏移地址? 0x0c)

赋值的大小:0x100000

代码:

	unsigned int * BEEP_PEMODE_dianzu = (void*)(0x40020400 + 0x0c);//设置引脚的电阻
*BEEP_PEMODE_dianzu=0x100000;//引脚  10 为上拉电阻

引脚输出的电平 :(?蜂鸣器响? 为输出高电平)

地址 (基地址? + 偏移地址)=? ? GPIOB? ?(地址 :? 0x40020400)+ (偏移地址? 0x14)

赋值的大小:0x400?

代码:

unsigned int * BEEP_PEdata = (void*)(0x40020400 + 0x14);//设置引脚的输出的电平
*BEEP_PEdata =0x400;//开启蜂鸣器
				//*BEEP_PEdata =0x0000;//关闭蜂鸣器

蜂鸣器的所有代码:

unsigned int * BEEP_PECLK =(unsigned int *)(0x40023800 + 0x30);//配置时钟
				unsigned int * BEEP_PEMODE = (void*)(0x40020400 + 0x00);//设置引脚为 输出模式 或者输入模式
				unsigned int * BEEP_PEMODE_leixing = (void*)(0x40020400 + 0x04);//设置引脚的输出类型
				unsigned int * BEEP_PEMODE_dianzu = (void*)(0x40020400 + 0x0c);//设置引脚的电阻
				unsigned int * BEEP_PESPEED = (void*)(0x40020400 + 0x08);//设置引脚 的速度
				unsigned int * BEEP_PEdata = (void*)(0x40020400 + 0x14);//设置引脚的输出的电平
	
				*BEEP_PECLK= 0X02;//设置时钟
				*BEEP_PEMODE=0x100000;//设置引脚为 GPIOB  10 输出模式
				*BEEP_PEMODE_leixing=0x000000;//设置输出类型 为推挽输出
				*BEEP_PEMODE_dianzu=0x100000;//引脚  10 为上拉电阻
				*BEEP_PESPEED=0x0000;//设置引脚 的速度 GPIOB 10 为低速
				*BEEP_PEdata =0x400;//开启蜂鸣器
				//*BEEP_PEdata =0x0000;//关闭蜂鸣器


12.KEY 模块的代码:

//1.时钟   //配置好 PE 和 PB时钟
		AHB1 = 0x12; 
	
		//2.1配置灯   //输出模式 灯的其他部分用默认值
		unsigned int *PEMODELED = (void*)(0x40021000 + 0x00);
		*PEMODELED = (1<<8*2 | 1<<9*2 | 1<<10*2); 
	
		//2.2:配置按键
		*PEMODELED |= 0x000;//位或有添加位的功能;//0000 1000 | 0100 0000 = 0100 1000
		//2.3:配置蜂鸣器
		unsigned int *PBMODEBEEP = (void*)(0x40020400 +0x00 );
		*PBMODEBEEP = 1<<10*2;
		//2.4:给按键配置一个上拉电阻
		unsigned int *PEKEYUPDER = (void*)(0x40021000 + 0X0C);
		*PEKEYUPDER = 1 << 5*2 ;
	
		
		//3.操作部分  三个关灯操作
		unsigned int *PEDATALED = (void*)(0x40021000 + 0x14);
		*PEDATALED =(1<<8 | 1<<9 | 1<<10);
		//3.1蜂鸣器数据寄存器
		unsigned int *PBBEEPDATA =(void*)( 0x40020400 + 0x14);
		

		//4.按键的输入数据寄存器准备好
		unsigned int *PEKEYINPUT = (void*)(0x40021000 + 0X10);
		
		while(1)
		{	
			//
			if(!(*PEKEYINPUT & 0x20))//假如按下第二个按键
			{
					*PEDATALED = 0x00;//LED 灯 低电平
					*PBBEEPDATA = (1 <<10);//BEEP  响
			}
			if(!(*PEKEYINPUT & 0x40))//假如按下第三个按键
			{
					*PEDATALED =(1<<8 | 1<<9 | 1<<10);//关闭LED 灯
			}
		
		}




附加的知识:


  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:07:48  更:2022-09-30 01:08:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:39:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码