一、 stm32时钟分析寄存器 :寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成
在计算机领域,寄存器是cpu内部的元件,包括通用寄存器、专用寄存器和 控制寄存器 。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
控制寄存器 :相当一排可通过0/1进行设置外设功能的开关,程序中通过地址查找到对应的寄存器,所以说控制寄存器的地址是唯一。
芯片时钟:芯片工作时,是需要脉冲,脉冲相当于给芯片起振,可保证芯片的正常工作,类似于人,心脏正常跳动,人体生命特征才能正常。
1hz:一秒产生1个脉冲
频率换算单位:
1ghz = 1000mhz = 1000 000khz = 1000 000 000hz
stm32时钟源
时钟源是可以产生器件。
lsirc 32khz32 khz低速内部rc (lsi rc)
lseosc 32.168khz 32.768 khz低速外部晶振(lse晶振)
16mhz hsi rc 16mhz高速内部rc (lsi rc)
4-26mhz hse osc 4-26mhz高速外部晶振(hse 晶振)粤嵌开发板外部晶振为8mhz
注意:外部晶振产生的脉冲是精准, rc振荡时钟产生的脉冲是不精准
stm32主要总线时钟频率
sysclk168mhz
hclk 168mhz
ahb1/ahb2 168mhz
apb1 42mhz
apb2 84mhz
al解释:
在stm32微控制器中,有一些关键的概念需要了解:
sysclk(system clock):是微控制器系统中的主时钟源,它驱动着整个系统,包括cpu、外设等。sysclk的频率决定了整个系统的工作速度。hclk(ahb bus clock):是系统的主总线时钟,它连接了cpu、内存、外设等,用于数据传输和控制信号。ahb1/ahb2(advanced high-performance bus):是高性能总线,用于连接内存和一些高性能外设,如dma控制器、gpio控制器等。ahb1和ahb2是两个不同的总线,它们可以拥有不同的配置和频率。apb1(advanced peripheral bus 1):是高级外设总线,用于连接一些低速外设,如定时器、串口通信等。apb1总线上的外设可以以较低的频率工作。apb2(advanced peripheral bus 2):是高级外设总线,用于连接一些高速外设,如gpio、spi、i2c等。apb2总线上的外设可以以较高的频率工作。二、 gpio分析1、gpiogpio: gpio(英语:general-purpose input/output),通用型之输入输出的简称。
gpio分组
stm32f407zet6(芯片型号)
- 一共有7组io口(pa pb pc pd pe pf pg)- 每组io口有16个io引脚- 一共16x7=112个io引脚外加2个ph0和ph1
一共114个io口引脚(i:input o:output)
原理图上gpio连接与功能说明
每组(pa pb pc pd pe pf pg)通用 i/o 端口包括:
•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工作方式(寄存器设置gpio工作方式)
n4种输入模式
q浮空输入(没有上下拉电阻)
q上拉输入(有上拉电阻)
q下拉输入(有下拉电阻)
q模拟输入
n4种输出模式
q开漏输出(带上拉或者下拉)
q开漏复用功能(带上拉或者下拉)
q推挽式输出(带上拉或者下拉)
q推挽是复用功能(带上拉或者下拉)
n4种最大输出速度
q2mhz
q25mhz
q50mhz
q100mhz
注意点:
开漏输出只能输出0(低电平),若想出输出1(高电平),需要外部接上拉电阻(类似到51单片机p0组)。
推挽式输出可输出0(低电平)或者1(高电平),这是常用模式
2、寄存器地址查找寄存器地址 = 寄存组基地址+偏移地址
寄存器查看
三、 led灯开发1、理解led灯原理图
led0连接在pf9
pf9输出低电平(0),灯亮;pf9输出高电平(1),灯灭;
2、打开gpiof组时钟
//将第5位置1 使能gpiof组时钟rcc_ahb1enr |= (0x01< <5);3、设置pf9灯为输出模式 输出推挽 上拉 速度(50mhz)
4、通过gpiof_bsrr控制led灯亮与灭
led举例-1
一、led.h
#ifndef __led_h#define __led_h#include stm32f4xx.h#define rcc_ahb1enr (*((unsigned int *)(0x40023800+0x30))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_moder (*((unsigned int *)(0x40021400+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_otyper (*((unsigned int *)(0x40021400+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_ospeedr (*((unsigned int *)(0x40021400+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_pupdr (*((unsigned int *)(0x40021400+0x0c))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_odr (*((unsigned int *)(0x40021400+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_bsrr (*((unsigned int *)(0x40021400+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值void led_init(void);#endif二、led.c
#include led.h/*********************************引脚说明:led0 -- pf9**********************************/void led_init(void){ //将第5位置1 使能gpiof组时钟 rcc_ahb1enr |= (0x01< <5); //设置gpiof9为输出模式 gpiof_moder &= ~(0x01< <19); //19位清0 gpiof_moder |= (0x01< <18); //18位置1 //设置gpiof9为输出推挽 gpiof_otyper &= ~(0x01< <9); //9位清0 //设置gpiof9为上拉 gpiof_pupdr &= ~(0x01< <19); //19位清0 gpiof_pupdr |= (0x01< <18); //18位置1 //设置gpiof9输出速度50mhz gpiof_ospeedr |= (0x01< <19); //19位置1 gpiof_ospeedr &= ~(0x01< <18); //18位清0}三、main.c
#include stm32f4xx.h#include led.h// 延时函数void delay(int n){ int i,j; for(i=0; i< n; i++) for(j=0; j< 30000; j++);}int main(void){ led_init(); while(1) { //bsrr 25位置1 odr输出0 灯亮 gpiof_bsrr |= (0x01< <25); delay(1000); //bsrr 9位置1 odr输出1 灯灭 gpiof_bsrr |= (0x01< <9); delay(1000); } return 0;}四、作业拓展
上拉电阻和下拉电阻二者共同的作用是:避免电压的“悬浮”,造成电路的不稳定。
1、概念:将一个不确定的信号,通过一个电阻与电源vcc相连,固定在高电平;通过一个电阻与电源gnd相连,固定在低电平
2、上拉是对器件注入电流,灌电流;下拉是对引脚进行分流,拉电流;
3、当一个接有上拉电阻的io端口设置为输入状态时,它的常态为高电平。
led流水灯举例-2
一、led.h
#ifndef __led_h#define __led_h#include stm32f4xx.h#define rcc_ahb1enr (*((unsigned int *)(0x40023800+0x30))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_moder (*((unsigned int *)(0x40021400+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_otyper (*((unsigned int *)(0x40021400+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_ospeedr (*((unsigned int *)(0x40021400+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_pupdr (*((unsigned int *)(0x40021400+0x0c))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_odr (*((unsigned int *)(0x40021400+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpiof_bsrr (*((unsigned int *)(0x40021400+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpioe_moder (*((unsigned int *)(0x40021000+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpioe_otyper (*((unsigned int *)(0x40021000+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpioe_ospeedr (*((unsigned int *)(0x40021000+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpioe_pupdr (*((unsigned int *)(0x40021000+0x0c))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpioe_odr (*((unsigned int *)(0x40021000+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值#define gpioe_bsrr (*((unsigned int *)(0x40021000+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值void led_init(void);void led0(void);void led1(void);void led2(void);void led3(void);void beep(void);#endif二、led.c
#include led.hvoid led_init(void){ //将第5位置1 使能gpiof组时钟 rcc_ahb1enr |= (0x01< <5); //将第4位置1 使能gpioe组时钟 rcc_ahb1enr |= (0x01< <4); led0(); led1(); led2(); led3();}/*********************************引脚说明:led0 -- pf9**********************************/void led0(){ //设置gpiof9为输出模式 gpiof_moder &= ~(0x01< <19); //19位清0 gpiof_moder |= (0x01< <18); //18位置1 //设置gpiof9为输出推挽 gpiof_otyper &= ~(0x01< <9); //9位清0 //设置gpiof9为上拉 gpiof_pupdr &= ~(0x01< <19); //19位清0 gpiof_pupdr |= (0x01< <18); //18位置1 //设置gpiof9输出速度50mhz gpiof_ospeedr |= (0x01< <19); //19位置1 gpiof_ospeedr &= ~(0x01< <18); //18位清0}/*********************************引脚说明:led1 -- pf10**********************************/void led1(){ //设置gpiof10为输出模式 gpiof_moder &= ~(0x01< <21); //21位清0 gpiof_moder |= (0x01< <20); //20位置1 //设置gpiof9为输出推挽 gpiof_otyper &= ~(0x01< <10); //10位清0 //设置gpiof9为上拉 gpiof_pupdr &= ~(0x01< <21); //21位清0 gpiof_pupdr |= (0x01< <20); //20位置1 //设置gpiof9输出速度50mhz gpiof_ospeedr |= (0x01< <21); //21位置1 gpiof_ospeedr &= ~(0x01< <20); //20位清0}/*********************************引脚说明:led2 -- pe13**********************************/void led2(){ //将第4位置1 使能gpioe组时钟 rcc_ahb1enr |= (0x01< <4); //设置gpiof13为输出模式 gpioe_moder &= ~(0x01< <27); //27位清0 gpioe_moder |= (0x01< <26); //26位置1 //设置gpioe输出速度为50mhz gpioe_ospeedr |= (0x01< <26); //26位置1 gpioe_ospeedr &= ~(0x01< <27); //27为清0 //设置gpioe为上拉 gpioe_pupdr &= ~(0x01< <27); //27位清0 gpioe_pupdr |= (0x01< <26); //26位置1 //设置gpioe为输出推挽 gpioe_otyper &= ~(0x01< <13); //13位清0}/*********************************引脚说明:led3 -- pe14**********************************/void led3(){ //设置gpioe14为输出模式 gpioe_moder &= ~(0x01< <29); //29位清0 gpioe_moder |= (0x01< <28); //28位置1 //设置gpioe输出速度为50mhz gpioe_ospeedr |= (0x01< <28); //28位置1 gpioe_ospeedr &= ~(0x01< <29); //29为清0 //设置gpioe为上拉 gpioe_pupdr &= ~(0x01< <29); //29位清0 gpioe_pupdr |= (0x01< <28); //28位置1 //设置gpioe为输出推挽 gpioe_otyper &= ~(0x01< <14); //14位清0}三、main.c
#include stm32f4xx.h#include led.hvoid delay(int n){ int i,j; for(i=0; i< n; i++) for(j=0; j< 30000; j++);}int main(void){ led_init(); while(1) { //bsrr 25位置1 odr输出0 led0灯亮 gpiof_bsrr |= (0x01< <25); delay(1000); //bsrr 9位置1 odr输出1 灯灭 gpiof_bsrr |= (0x01< <9); //delay(1000); //bsrr 26位置1 odr输出0 led1灯亮 gpiof_bsrr |= (0x01< <26); delay(1000); //bsrr 10位置1 odr输出1 灯灭 gpiof_bsrr |= (0x01< <10); //delay(1000); //bsrr 29位置1 odr输出0 led2灯亮 gpioe_bsrr |= (0x01< <29); delay(1000); //bsrr 13位置1 odr输出1 灯灭 gpioe_bsrr |= (0x01< <13); //delay(1000); //bsrr 30位置1 odr输出0 led3灯亮 gpioe_bsrr |= (0x01< <30); delay(1000); //bsrr 14位置1 odr输出1 灯灭 gpioe_bsrr |= (0x01< <14); //delay(1000); //bsrr 24位置1 odr输出0 蜂鸣器响 gpioe_bsrr |= (0x01< <30); delay(1000); //bsrr 8位置1 odr输出1 蜂鸣器关 gpioe_bsrr |= (0x01< <14); //bsrr 24位置1 odr输出0 蜂鸣器响 gpiof_bsrr |= (0x01< <8); delay(100); } return 0;}led流水灯和蜂鸣器举例-3
一、beep.h
#ifndef __beep_h#define __beep_h#include stm32f4xx.h#include led.hvoid beep_init(void);#endif二、beep.c
#include beep.h/*********************************引脚说明:beep -- pf8**********************************/void beep_init(void){ //将第5位置1 使能gpiof组时钟 rcc_ahb1enr |= (0x01< <5); //设置gpiof8为输出模式 gpiof_moder &= ~(0x03< <16); //16、17位清0 gpiof_moder |= (0x01< <16); //16位置1 //设置gpiof8为输出推挽 gpiof_otyper &= ~(0x01< <8); //8位清0 //设置gpiof8为下拉 gpiof_pupdr &= ~(0x03< <16) ; //设置gpiof8输出速度100mhz gpiof_ospeedr |= (0x01< <17); //17位置1 gpiof_ospeedr |= (0x01< <16); //16位置1}三、main.c
#include stm32f4xx.h#include led.h#include beep.hvoid delay(int n){ int i,j; for(i=0; i< n; i++) for(j=0; j< 30000; j++);}int main(void){ beep_init(); while(1) { //bsrr 24位置1 odr输出0 蜂鸣器响 gpiof_bsrr |= (0x01< <8); delay(100); //bsrr 8位置1 odr输出1 蜂鸣器关 gpiof_bsrr |= (0x01< <24); delay(1000); } return 0;}
三星note7爆炸原因真相大白信任危机就过去了吗?
有源滤波器APF和静止无功发生器SVG在石油行业中的应用
嵌入式软件设计模式 好文值得收藏
GetError与GetErrorID指令的使用
大数据时代需要智能云存储 边缘智能存储是新的风口?
STM32时钟与GPIO分析 基于STM32的LED灯开发
蓝牙5与WiFi有什么优势 蓝牙5与WiFi如何选择
OLED电视负增长 液晶电视全球出货量首次跌破2亿台
谷歌关闭了向移动运营商共享数据的服务,担心遭到监管部门调查
SIC功率器件在汽车电驱动系统的作用
亲子家庭重要成员——佳能LEGRIA HF R86
华为推送鸿蒙2.0系统开发者测试版,拥有功能独特设计
小米MIX和华为荣耀magic:最强国产旗舰互怼,孰强孰弱
魏德米勒工业分析:兼备数据科学研究与专业技能
土壤温湿度传感器教你科学种茶,从此种茶不再难
丹麦miniBOOSTER增压器HC3-4.0-B-1
爱普生QMEMS技术是什么?
STM32单片机开发环境安装与工程搭建
华为秘密研究的全面屏设计曝光
Owlchemy全新混合现实解决方案寻求Beta版测试人员