STM32笔记(二)—STM32与寄存器概念(附寄存器版简易LED流水灯)

发布者:ShimmeringStar最新更新时间:2022-05-26 来源: eefocus关键字:STM32  寄存器  LED流水灯 手机看文章 扫描二维码
随时随地手机看文章

image-20200607100451442
image-20200607100920701

image-20200607100952086
image-20200607101050664
image-20200607102918944

(内核+外设)

image-20200607103702408

ICode 总线


ICode 中的 I 表示 Instruction,即指令。我们写好的程序编译之后都是一条条指令,存

放在 FLASH 中,内核要读取这些指令来执行程序就必须通过 ICode 总线,它几乎每时每刻都需要被使用,它是专门用来取指的。


驱动单元


DCode 总线

DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。我们在写程序的时候,数据有常量和变量两种,常量就是固定不变的,用 C 语言中的 const 关键字修饰,是

放到内部的 FLASH 当中的,变量是可变的,不管是全局变量还是局部变量都放在内部的

SRAM。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数

的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。


System总线

系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。


DMA 总线

DMA 总线也主要是用来传输数据,这个数据可以是在某个外设的数据寄存器,可以在

SRAM,可以在内部的 FLASH。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。


被动单元


内部的闪存存储器(Flash)

内部的闪存存储器即 FLASH,我们编写好的程序就放在这个地方。内核通过 ICode 总

线来取里面的指令。


内部的 SRAM

内部的 SRAM,即我们通常说的 RAM,程序的变量,堆栈等的开销都是基于内部的SRAM。内核通过 DCode 总线来访问它。


FSMC

FSMC 的英文全称是 Flexible static memory controller,叫灵活的静态的存储器控制器,是 STM32F10xx 中一个很有特色的外设,通过 FSMC,我们可以扩展内存,如外部的

SRAM, NANDFLASH 和 NORFLASH。但有一点我们要注意的是, FSMC 只能扩展静态的内存,即名称里面的 S: static,不能是动态的内存,比如 SDRAM 就不能扩展。


AHB 到 APB 的桥

从 AHB 总线延伸出来的两条 APB2 和 APB1 总线,上面挂载着 STM32 各种各样的特色外设。我们经常说的 GPIO、串口、 I2C、 SPI 这些外设就挂载在这两条总线上,这个是

我们学习 STM32 的重点,就是要学会编程这些外设去驱动外部的各种设备。

image-20200607144649788

存储器映射、寄存器映射


什么是寄存器?


给有特定功能的内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。


什么是存储器映射?


给存储器分配地址的过程叫存储器映射,再分配一个地址叫重映射。


寄存器映射:

image-20200607145020761

image-20200607145419310

1.ST官方参考手册


2.(unsigned int*)(0x40010C0C) == 将0x40010C0C强制转化为地址,通过 *指向该地址的寄存器并写值


(缺点是太繁琐)


改进:

image-20200607145843107

总线

image-20200607150411186

(APB2与AHB均为高速总线)

image-20200607150942994

image-20200607154614685

(0100—一个字节对应8位二进制,4字节即为32位)


以GPIOB为例,寄存器地址偏移:

image-20200607155118868

image-20200607155130268
image-20200607155152819

image-20200607155816602

GPIOB_ODR &= ~(1<

GPIOB_ODR |= (1<

寄存器工程模板创建

建立一个文件夹


通过mdk5定位到该文件夹,新建一个工程

image-20200607162241468

选定设备

image-20200607162329805

image-20200607162355050

(不使用keil 在线库文件)


添加工程文件至文件夹

image-20200607162649471
image-20200607163557622

魔术棒配置一下output以及keil版本就完事了~


寄存器点亮LED

原理图判断灯所在外设对应位

image-20200607173330817

对应外设地址与时钟地址


对应外设地址:

image-20200607173552752

时钟地址:

image-20200607173524944

外设与时钟配置

image-20200607173712151

image-20200607175503809

image-20200607175200599

代码:


# include "stm32f10x.h"


void delay(unsigned int i);


int main(void)

{

//置1操作:|= ; 清零操作: &=~ ;

//GPIOB的RCC时钟开启

*(unsigned int*) 0x40021018 |= (1<<3);

//GPIOB的配置(推挽输出,10MHZ)

*(unsigned int*) 0x40010C00 |= (1<<0);

*(unsigned int*) 0x40010C00 |= (1<<4);

*(unsigned int*) 0x40010C00 |= (1<<20);

//while循环闪烁

while(1)

{

//GPIOB的输出

*(unsigned int*) 0x40010C0C &= ~(1<<0);

*(unsigned int*) 0x40010C0C |= (1<<1);

*(unsigned int*) 0x40010C0C |= (1<<5);

delay(2000);

*(unsigned int*) 0x40010C0C &= ~(1<<1);

*(unsigned int*) 0x40010C0C |= (1<<0);

*(unsigned int*) 0x40010C0C |= (1<<5);

delay(2000);

*(unsigned int*) 0x40010C0C &= ~(1<<5);

*(unsigned int*) 0x40010C0C |= (1<<0);

*(unsigned int*) 0x40010C0C |= (1<<1);

delay(2000);

*(unsigned int*) 0x40010C0C &= ~(1<<0);

*(unsigned int*) 0x40010C0C &= ~(1<<1);

*(unsigned int*) 0x40010C0C &= ~(1<<5);

delay(2000);

}

}

void SystemInit(void)

{

//

}


void delay(unsigned int i)

{

unsigned char j;

for(i;i>0;i--)

for(j = 255; j>0; j--);

}


关键字:STM32  寄存器  LED流水灯 引用地址:STM32笔记(二)—STM32与寄存器概念(附寄存器版简易LED流水灯)

上一篇:STM32笔记(三)---寄存器映射--BSRR分析
下一篇:STM32笔记(一)---串口ISP模式下载原理

推荐阅读最新更新时间:2024-11-08 10:23

STM32串口接收数据保存到数组——遇到问题及解决方法
遇到问题: PC端发送给stm32的字符串数据,只有最后一个字节被保存在数组的首地址,其他数据都丢失,而且数组中只有首地址有数据。 比如我用PC给stm32发送abcd,返回到PC串口助手的数据只有d,查看数组发现里面数据 。 解决方案: 错误的原因是,在中断服务函数中,每次来数据时,数组地址 t++ 的变量 t 被我定义成了局部变量,导致每次来中断时,t都被赋值为0,才导致只有数组首地址有数据,且之前的数据都被覆盖。 解决办法,把数组地址 t++ 的变量 t 定义为全局变量就ok了
[单片机]
<font color='red'>STM32</font>串口接收数据保存到数组——遇到问题及解决方法
STM32电机方波】记录3——TIM1时基初始化配置
定时器分类 : STM32F1x 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。 基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。 通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。 高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。 高级定时器TIM1的库函数: 定时器TIM1时基结构体缺省值: { TI
[单片机]
【<font color='red'>STM32</font>电机方波】记录3——TIM1时基初始化配置
STM32之按键+蜂鸣器
今天写一下按键加上蜂鸣器的相关知识,emmm,学到这里,就觉得32和51其实是很相像的,底层思想也差不多一样。51的底层再加上一个初始化函数,就构成了32的底层,而初始化函数部分的方法和步骤也是大同小异,所以大家如果学过51的话,32也会很好入门的~~~ 按键 老规矩,我们还是先看一下按键部分的原理图: 然后在原理图上找一下对应的引脚: 初始化按键的思想和LED配置部分差不多,而且比LED的配置简单:配置端口时钟(时钟使能GPIOA和GPIOB),设置引脚号,配置端口模式。 这里说明一点:我们知道配置LED时是需要设置引脚速率的,那么初始化按键时为什么不需要设置引脚速率了呢?我们需要知道这里的引脚速率是输出速率,但
[单片机]
<font color='red'>STM32</font>之按键+蜂鸣器
stm32之断言详细讲解
最近公司不忙,就想着充实下自己,偶然看到了“断言机制”,也认真试验了一番,便赶紧记录下来,也是为了温故而知新,再者与大家分享一下! 首先看一个应用:(网络不好,图片不好上传,原谅我偷懒) void TIM_DeInit(TIM_TypeDef* TIMx) { /* Check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); if (TIMx == TIM1) { RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphResetCmd(RCC_AP
[单片机]
<font color='red'>stm32</font>之断言详细讲解
STM32】HAL库-RTC实时时钟
简介 实时时钟是一个独立的定时器 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变 系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问: 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。 时钟源 通过设置备份域控制寄存器(RCC_BDCR)里的RTCSEL 位,RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供。 除非备份域复位,此选择不能被改变。
[单片机]
【<font color='red'>STM32</font>】HAL库-RTC实时时钟
STM32的JTAG引脚说明
STM32的PA3、PA4、PA13、PA14、PA15,是JTAG用的引脚 若要当作普通IO口使用,则需要配置 在管脚初始化中加入 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); 其中 GPIO_Remap_SWJ_NoJTRET 除JTRST外SWJ完全使能(JTAG+SWJ); GPIO_Remap_SWJ_JTAGDisable JTAG-DP失能+SW-DP使能; GPIO_Remap_SWJ_Disable SWJ完全失能(JTAG+SW-DP); 上电复位后IO端口被配置为浮空输出模式; JTAG引脚被置于输入上拉或下拉
[单片机]
arm LPC210X GPIO操作有关的寄存器
通常的名称 描述 属性 复位值 PORT0的地址和名称 IOPIN GPIO的管脚值。不管当前管脚的方向如何,都能从此寄存器读取GPIO的状态。 读/写 NA 0xE002 8000 IO0PIN IOSET GPIO置高电平寄存器。写1则相应的管脚输出高电平。 读/写 0x0000 0000 0xE002 8004 IO0SET IODIR GPIO方向设置寄存器。控制各个引脚的方向。 读/写 0x0000 0000 0xE002 8008 IO0DIR IOCLR GPIO置低电平寄存器。写1则相应的管脚输出低电平。 只写 0x0000 0000 0xE002 800C IO0CLR GPIO有两种工作方式
[单片机]
编译STM32错误之一:Error: L6218E: Undefined symbol TIM_Cmd
注意要包含头文件:#include stm32f10x_tim.h 还有要把stm32f10x_tim.c加进工程。
[单片机]

推荐帖子

俺的RPG游戏 中要实时画一张大的位图 闪动的厉害
用所谓的双缓冲技术也步行怎么办俺的RPG游戏中要实时画一张大的位图闪动的厉害画图肯定比较占用CPU资源的双缓冲可以利用多个CDC(全部为成员变量)层叠的方法.一个CDC专门存放不常画的背景什么的一个CDC专门图擦的可以适当多几个多一个就会占用内存多一点然后刷新的时候不要重画背景了Invalidate(FALSE);InvalidateRect(,FALSE);遵循原则:能少画就少画能不刷新就不刷新
fgfgfg 嵌入式系统
我的modelsim和modelsim-altera的compile编译按钮都是灰的
我的modelsim和modelsim-altera的compile编译按钮都是灰的。请问高手,如何解决?谢谢!百度搜了,不管用。我的modelsim和modelsim-altera的compile编译按钮都是灰的注册好了吗? 好了。现在有时候也不是灰的了,很奇怪
chenbingjy EE_FPGA学习乐园
今年电赛有没可能让作品加入AI技术?
每年电赛都在与时俱进,近些年AI这么火,除了物体识别,目标检测,今年有没可能让大家用人工智能技术去实现一些不一样的作品?今年电赛有没可能让作品加入AI技术?电赛的周期还是比较短的,要不是那种一直进行的团队,训练还是挺困难的不可能的不可能的,发展没有这么快的。不可能的,发展没有这么快的。 这倒是,不知道今年会出什么样的题目。 我觉得电赛题目还是挺跟的上时代的。 换位思考一下,如果组委会是自己,该怎么出题? 可以把历届电赛题目list一下看
wangerxian 嵌入式系统
单晶外观质量标准:单晶太阳能电池板质量标准:太阳能板:单晶硅质量标准
产品特点:◆所采用的单晶太阳能电池片转换效率高◆所采用的铝合金边框具有高强度,抗机械冲击能力强。◆功率公差范围(保证输出功率在-3~+3%的正负公差范围内)◆本产品有着优秀的弱光性能。◆能够承受强风和雪的荷载太阳能电池板可承受的风荷载(2400Pascal)和雪荷载(5400Pascal)电力参数型号.SFM100W-36/5SFM95W-36/5SFM90W-36/5SFM85W
13211002591 工控电子
这段是在运算什么?
有哪位高手能看懂下边程序在做什么?MOVA,4AHMOVR0,AANLA,#0FEHJNZQ168A;(4AH)!=1Q168A:CLRC;(4AH)=1MOVA,44HANLA,#03HADDA,R0
ericwx 单片机
【2024 DigiKey 创意大赛】二月柳絮大作战项目-07控制外设I/O的输出控制
查看原理图可以得到扩展IO引脚分布及注意事项:EX_IO4、EX_IO5、EX_IO6、EX_IO7可以无条件使用打开案例库:ESP32_IO_ExpanderIIC引脚为IO47、IO48修改代码如下:#includeArduino.h#includeESP_IOExpander_Library.h#defineEXAMPLE_CHIP_NAMETCA95xx_8bit#defineEXAMPLE_I
Maker_kun DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved