基于STM32F407寄存器开发点灯

点灯点灯点到流水灯
效果图:
1寄存器
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。
在计算机领域中,寄存器是cpu内部的元件,包括通用寄存器、专用寄存器和控制寄存器。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
举一个例子,在殿上,寄存器比如太监,cpu比如皇帝,内存比如大臣,传送文件,你细品,再细品....
stm32内部的所有寄存器都有唯一的地址
寄存器地址 = 寄存器基地址+偏移地址(偏移量)
比如说查找gpio f端口模式寄存器的地址,首先通过 《stm32f4xx中文参考手册》(可在本公众号后台点击->笔记->技术秘籍大全获取) 找到gpiof的边界地址:0x4002 1400,然后再查找gpio端口模式寄存器 的偏移地址:0x00,最后就得到gpio f端口模式寄存器的地址0x0x40021400+0x00,其他寄存器也是如此。
2时钟树分析
时钟源:晶振、rc振荡器
晶振:自身产生时钟信号,为各种微处理芯片作时钟参考,晶振相当于这些微处理芯片的心脏,没有晶振,这些微处理芯片将无法工作。
rc振荡器:适用于低频振荡,一般用于产生1hz~1mhz的低频信号。因为对于rc振荡电路来说,增大电阻r即可降低振荡频率,而增大电阻是无需增加成本的
时钟源用于产生方波时钟脉冲信号
时钟频率是一秒产生方波的计量单位
时钟频率(主频):1ghz=1000mhz=1000 000khz=1000 000 000hz
1hz:1s产生一个方波,1mhz:1s产生1000 000 方波
1、stm32时钟源
lsi rc 32khz 低速内部振荡时钟源
lse osc 32.768khz 低速外部晶振时钟源
16mhz hsi rc 高速内部振荡时钟源
4-26mhz hse osc 高速外部晶振时钟源(本次笔记使用的是晶振8hz)
2、stm32f407主要的时钟总线频率
fclk,hclk,pclk都称为系统时钟,但区别如下,
fclk,提供给cpu内核的时钟信号,cpu的主频就是指这个信号;
hclk,提供给高速总线ahb的时钟信号;
pclk,提供给低速总线apb的时钟信号;
sysclk(cpu 主频) 168mhz
hclk 168mhz
ahb(ahb1 ahb2) 168mhz
apb1 42mhz
apb2 84mhz
3gpio输出开发
gpio:(general-purpose input/output)通用型之输入输出的简称
stm32f407zet6板子:
一共有7组io(abcdef)每组io口有16个引脚,外加2个ph0和ph1(这两个引脚用于连接晶振)一共有114个io引脚
每组通用i/o端口包括10个寄存器:
4个32位配置寄存器(gpiox_moder、gpiox_otyper、gpiox_ospeedr 和 gpiox_pupdr)。
2 个32位数据寄存器(gpiox_idr 和 gpiox_odr)。
1 个32位置位/复位寄存器 (gpiox_bsrr)、
1 个32位锁定寄存器(gpiox_lckr)
2 个32位复用功能选择寄存器(gpiox_afrh 和gpiox_afrl)。
gpio工作方式:
4种输入模式
浮空输入(没有上下拉电阻)
上拉输入(有上拉电阻)
下拉输入(有下拉电阻)
模拟输入(模拟信号)
4种输出模式
开漏输出(带上拉或者下拉)
开漏复用功能(带上拉或者下拉)
推挽式输出(带上拉或者下拉)
推挽式复用功能(带上拉或者下拉)
4种最大输出速度
2mhz
25mhz
50mhz
100mhz
补充:
开漏只能输出0,输出要靠外部上拉电阻才输出1(如iic)
推挽式可输出1及输出0
上拉电阻和下拉电阻有什么用?
提高驱动能力:
例如,用单片机输出高电平,但由于后续电路的影响,输出的高电平不高,就是达不到vcc,影响电路工作。所以要接上拉电阻。下拉电阻情况相反,让单片机引脚输出低电平,结果由于后续电路影响输出的低电平达不到gnd,所以接个下拉电阻。
在单片机引脚电平不定的时候,让后面有一个稳定的电平:
例如上面接下拉电阻的情况下,在单片机刚上电的时候,电平是不定的,还有就是如果你连接的单片机在上电以后,单片机引脚是输入引脚而不是输出引脚,那这时候的单片机电平也是不定的,r18的作用就是如果前面的单片机引脚电平不定的话,强制让电平保持在低电平。
4led灯寄存器
(1)理解led灯原理图
led0连接在pf9引脚
pf9输出vcc(1),灯灭
pf9输出gnd(0),灯亮
引脚电平变化是通过芯片内部(代码来改变),作为输出
引脚电平变化是通过芯片外部(按键、传感器....),作为输入
(2)配置好各个寄存器的地址(上面有提到如何寻找地址)
#define rcc_ahb1enr *((volatile unsigned int *)(0x40023800+0x30)) //值强制转化为地址,通过*解引访问地址空间的值#define gpiof_moder *((volatile unsigned int *)(0x40021400+0x00)) //值强制转化为地址,通过*解引访问地址空间的值#define gpiof_otyper *((volatile unsigned int *)(0x40021400+0x04)) //值强制转化为地址,通过*解引访问地址空间的值#define gpiof_ospeedr *((volatile unsigned int *)(0x40021400+0x08)) //值强制转化为地址,通过*解引访问地址空间的值#define gpiof_pupdr *((volatile unsigned int *)(0x40021400+0x0c)) //值强制转化为地址,通过*解引访问地址空间的值#define gpiof_bsrr *((volatile unsigned int *)(0x40021400+0x18)) //值强制转化为地址,通过*解引访问地址空间的值(3)配置好外设使能寄存器,打开gpiof组时钟,也叫做使能f组时钟(stm32当中外设的时钟不打开,降低功耗)
//使能gpio f组时钟,rcc_ahb1enr|= (0x01<<5);
(4)配置好gpio9组的寄存器
把gpiof9引脚设置为输出模式输出推挽上拉速度
设置gpiof9引脚对应的是18、19位 ,然后为输出模式:01,其他寄存器也类似,如图下所示
void led_init(void){ //使能gpio f组时钟, rcc_ahb1enr |= (0x01<<5); //设置为输出模式 gpiof_moder &= ~(0x01<<19); //19位置0 gpiof_moder |= (0x01<<18); //18位置1 //输出推挽 gpiof_otyper &= ~(0x01<<9); //9位置0 //快速 gpiof_ospeedr |= (0x01<<19); //19位置1 gpiof_ospeedr &= ~(0x01<<18); //18位置0 //上拉 gpiof_pupdr &= ~(0x01<<19); //19位置0 gpiof_pupdr |= (0x01<<18); //18位置1 }点灯来了......
通过手册查找用来点灯的寄存器,就是这个gpiox_bsrr寄存器
在25位 ,置1,灯会亮
在9位 ,置1,灯会灭
main.c
#include stm32f4xx.h#include led.h#define count 100//粗延时void delayms(int n){ int i, j; for(i=0; i成功点亮一盏灯,至于流水灯,设置好一些灯,然后用延时控制灯的亮与灭
接下来的笔记是库函数开发,按键中断等等......

中控智慧首个集抓拍比对报警于一体的人脸枪机,实现人脸识别功能
INA240优势国产替代推荐—类比CSA240
软通动力专业数字技术助力133届广交会
基于TI AWR2944和TDA4VM的汽车级安全OS
关于英特尔夸克处理器性能介绍和应用
基于STM32F407寄存器开发点灯
帝瓦雷Devialet Dione重新定义“看电影”
Xilinx发布面向全可编程SoC和MPSoC的SDSoC开发环境
5G和云正在成为迈向智能时代的关键引擎
昕诺飞宣布已完成上海外滩万国历史建筑群核心区的灯光改造工程
谷东AR前瞻技术助力南方电网打造高效电力运维管理模式
为什么大家会在5G身上投入如此大的热情和期望
欧姆龙以太网通讯模块设置连接MCGS步骤
浅谈热电偶晶圆测温系统
全球芯片代工台积电居首
还有几种新显示技术较OLED和量子点也各有优点
四方光电在线粒子计数器在洁净室的创新应用
农残快速检测仪可有效检测出农残安全的问题
物联网的黄金时代已经来临,2018年物联网是绽放还是陨落?
LM4910用于双声道放大器的典型电路