STM32寄存器点亮流水灯实验 实物+Proteus仿真

目录

 

 

一、Keil5程序编写与思路

     1.  程序思路:

     2. GPIOA端口使能

     3.  端口配置

     4. 端口操作和完整程序源码

二、 Proteus8.15 仿真

     1.  Proteus8. 15 下载和安装

     2.  在keil5中编译上面的代码,生成hex文件

     3.  Proteus8.15 新建项目,导入hex文件仿真

     4. 仿真效果

 三、 JLink烧录程序和实物效果

    1. 安装Jlink驱动

    2.  配置Jlink烧录环境

    3. 烧录程序

    4. 实验效果        ​

 四、总结


 

 

一、Keil5程序编写与思路

 1.  程序思路:

          通过寄存器配置使能GPIOA的8个端口,并且设置为推挽输出且50Mhz的输出速度,通过软            件延时的方法,采用共阴极接法,8个led灯阴极全部接地,阳极分别挤入8 个PA端口,控制            引脚输出高点平,然后延时,从而实现流水灯程序。

2. GPIOA端口使能


    首先是时钟使能

    通过查看stm系统架构,知道了GPIOA是连接在APB2这条总线上,因此我们使能GPIOA口需要     操作APB2的外设时钟使能寄存器,查看APB2的外设时钟使能寄存器:
 

56360f846c014376a0cffb8543242e3f.png

  因此我们修改APB2时钟使能寄存器的第二位为1,就成功使能GPIOA端口了。

  那么APB2的使能寄存器在哪里呢?

29ee89df1e46403eb4c3b624890c6649.png

 通过查表发现在AHB总线 复位和时钟控制 RCC的起始地址为0x4002100,

 为什么APB2的时钟使能控制寄存器在AHB上呢?

 因为系统架构是通过AHB桥接成APB1和APB2的,换句话说就是通过AHB上面的时钟频率分频给   APB1和APB2

 RCC总共有8个寄存器:CR 、CF、GR、CIR、APB2RSTR、APB1RSTR、AHBENR、   APB2ENR、APB1ENR、BDCR、CSR,我们需要使能GPIOA时钟,用到的是APB2ENR寄存器

eca7096ac5c44edcbfcdea0e813ec92e.png

其相对于RCC的偏移地址为0x18,那么使能寄存器映射地址就为:

0x40021000+0x18=0x40021018

在上面的程序中是通过volatile关键字声明了8个寄存器的RCC结构体完成的,其作用和直接声明寄存器映射地址效果是一样的:

c1c1af8761d34d5bbf3ab0f7a5c6ea55.png

可以简化为:#define APB2ENR  ((unsigned int)0x40021018)

下一步就是使能时钟了,就是将该寄存器第二位设置为1:

338d17d872a44d3d91597c525742b0d5.png

  现在就已经完成了GPIOA端口时钟使能了。

3.  端口配置


 stm32的GPIO口总共分为8种模式

 输入:上拉输入、下拉输入、浮空输入、模拟输入

 输出: 复用推挽输出、普通推挽输出、复用开漏输出、普通开漏输出

 在此次实验中所需要配置的类型为普通推挽输出,那么如何配置呢?还是通过操作寄存器配置

 需要用到的两个寄存器分别为端口配置低寄存器(端口配置高寄存器),端口输出数据寄存器

 那么首先应该找到这两个寄存器的映射地址:

7347fb0fab584eeb9832a1e28d66b2d0.png

 这两个寄存器都在GPIOA寄存器组里面,因此首先要找到GPIOA寄存器的映射地址:

 在表中APB2的起始地址为0x4001 0000,GPIOA寄存器组的起始地址为0x40010800

 其次找到对应的两个寄存器偏移地址:

  

8c51a45ac74141a6addb784283cddb8d.png

70e6d84c26c245bfbf728414d19b4a85.png

   

  所以端口配置低寄存器映射地址为0x40010800+0x00=0x40010800

  端口输出数据寄存器映射地址为:0x40010800+0x0c=0x4001080c

  同样也可以通过直接声明寄存器的映射地址来完成

  在代码中也是通过创建volatile关键词的GPIO结构体完成的:

15887707a5f345aaa5303b4b692a77b1.png

15c3e575b9244fcd8a4095cad42a5552.png

前面说过,stm32是32位操作系统,端口配置低寄存器控制32个bit,每4位为一个端口,从小到大分别为PA0~PA7

2c51650006ca488e939deabf17348bcd.png

每个4位的高两位CNF选择配置上面说的GPIO的8种的一种模式

低两位选择输入模式或者输出模式的输出频率

4ab616e6f4ee4346bcebfab3fb5f3534.png

 我们需要配置的是通用推挽输出模式,速度选择50Mhz,因此为00 11 在16进制里面为3

  因为需要用到8个端口,所以可以将这8个端口全部设置为推挽输出,速度为50MHz:

d9ece9fffd7d42ce971c5df4bc0e1cbb.png

这时端口输出模式选择完成了,但是不知道输出是0,还是1,因此需要端口输出数据寄存器

8b7ad62fc5324a14a846379846183dfa.png

  一个bit对应一个端口,最小系统板只有8个端口,则其有效位位0-8,当配置为0的时候,PA0则输出低电平,配置为1的时候,则输出高电平

初始化的时候,将PA0设置为高电平,其他为低电平,即该寄存器的值可以设置为:0x0001

     401fd030895341cba31f444ca03005f9.png

到这里,初始化就完成了

4. 端口操作和完整程序源码


     完成上述程序配置后,PA的8个端口全部为推挽输出模式,并且输出速度为50Mhz

    流水灯程序还需要一个延时程序

    在程序中采用的是软件延时的方法:

     

f5647db2fcf94c9fa70cfc78ab6a27de.png

     在此次实验中,采用的是共阴极接法,8个led的阴极全部接地,阳极接PA的8个端口,当PA端       口输出高电平的时候灯亮,输出高电平的时候灯灭。

    程序思路:初始化PA0为高电平,在循环中,先延时,然后左移,PA1为高电平,再判断是否0      ~8端口是否全为0,如果是的话,则又赋值为0x0001

   程序流程图:

   
d5b7aab3ad804a20b12d12f4c95df85b.png

  程序源码:


#define PERIPH_BASE           ((unsigned int)0x40000000)//AHB的地址
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000) //APB2地址
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800) //GPIOA地址
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C   //GPIOA_ODR地址
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
typedef  struct{
 
   volatile  unsigned  int  CR;
   volatile  unsigned  int  CFGR;
   volatile  unsigned  int  CIR;
   volatile  unsigned  int  APB2RSTR;
   volatile  unsigned  int  APB1RSTR;
   volatile  unsigned  int  AHBENR;
   volatile  unsigned  int  APB2ENR;
   volatile  unsigned  int  APB1ENR;
   volatile  unsigned  int  BDCR;
   volatile  unsigned  int  CSR;
} RCC_TypeDef;
 
#define RCC ((RCC_TypeDef *)0x40021000)
typedef  struct
{
volatile  unsigned  int  CRL;
volatile  unsigned  int  CRH;
volatile  unsigned  int  IDR;
volatile  unsigned  int  ODR;
volatile  unsigned  int  BSRR;
volatile  unsigned  int  BRR;
volatile  unsigned  int  LCKR;
} GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
void delay(unsigned int  time)
{
 unsigned int i=0;
	while(time--)
	{
   i=12000;
   while(i--);		
	}
}
 
int main(void)
{
	RCC->APB2ENR|=1<<2;      	  	 
	GPIOA->CRL&=0x00000000;
	GPIOA->CRL|=0x33333333;	
  GPIOA->ODR=0x01;      
  while(1)
	{
	delay(850);
	GPIOA->ODR=GPIOA->ODR<<1;
	if(GPIOA->ODR==0x0100)
	{
		GPIOA->ODR=0x01;
}
}

二、 Proteus8.15 仿真

    1.  Proteus8. 15 下载和安装

           由于8.0或者其他低版本可能没有stm32的固件库,所以需要下载更高版本

           下载安装Proteus8.15 可参考:

           Proteus8.15 安装包下载及详细安装_小殷学长的博客-CSDN博客  Proteus8.15 安装包下载及详细安装_小殷学长的博客-CSDN博客

    2.  在keil5中编译上面的代码,生成hex文件

          勾选输出选项中的生成hex文件选项

         

354c276032e6496ea2602ec1c2559b7b.png

                  

e67da32023084612aae9cf9cc396231c.png

               编译文件:

f9ef9ecabfad450097edf9212d8ed58a.png

                        03804052165a4b56b914b3b6ec09f273.png

   3.  Proteus8.15 新建项目,导入hex文件仿真

                     创建时需要在固件库中选择cortex-M3系列 和 STM32F103R6

f2608c0da62445739abbbef0aeb5062b.png

                   共阴极连接8个LED灯到单片机的GPIOA的8个端口

7286e60002484803884d699cafbd1b37.png

                   双击单片机,在Program File里面选择生成的hex文件

                                        在Clock Scale里卖选择8 Times

54b324c57b024401a9d6c23902a4ec55.png

     4. 仿真效果

                     

cced93418e984a9fb133ab6da1213930.gif

 三、 JLink烧录程序和实物效果

          

         1. 安装Jlink驱动

                参考网站:jlink驱动安装_洛殿的博客-CSDN博客

          2.  配置Jlink烧录环境

 

            899a6cb0126042b6bb42f86741ab4c88.png

           点击debug

           d54a592bff25439385b04f46e249d3a5.png

          选择ST-LIN/v2 端口选择sw

          b90da91521464ed0bf1de6f0d0c78ca2.png

       3. 烧录程序

         点击下载程序

         8c4633de3106495783abbd598b6a71df.png

4. 实验效果
        ​

     连线图:

12dcdabfe0d14003b2cfd8a2024f6fc9.png

       实验效果:  

IMG_8099

 四、总结

          1.  低版本的Proteus软件可能不含有stm32的固件库,需要下载更高版本如 Proteus8.15

          2.  Proteus仿真会出现问题,时钟频率与我们实物延时时间相差很大,可参考:       proteus仿真STM32时时钟问题解决方案_[rcc] apb1 is overclocked. force set prescaler = 2_Tnhello的博客-CSDN博客

          3. 由于本次实验采用的是软件延时的方式,因此延时不准确,可以通过定时器延时更准确 

       PS:

     参考网站:

proteus仿真STM32时时钟问题解决方案_[rcc] apb1 is overclocked. force set prescaler = 2_Tnhello的博客-CSDN博客

  Proteus8.15 安装包下载及详细安装_小殷学长的博客-CSDN博客

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 51单片机是一种广泛应用的单片机,而74ls138译码器则是一种具有多种应用的数字集成电路。在流水灯方面,无论是在家居智能化控制系统还是在车间工业生产控制系统中,流水灯都是一种非常常见的显示方式,具有非常好的视觉效果,能够快速吸引人们的注意力。 通过使用Proteus仿真软件,可以方便地进行电路图的设计和仿真。使用51单片机控制74ls138译码器实现流水灯的显示,可以采用循环移位的方式实现,即先将一个二进制数据进行左移或右移,并将移位后的数据输出到译码器的输入端口,通过译码器进行解译后实现LED灯的显示。 在仿真过程中,通过添加输入脚、外部触发器和LED灯等元件,实现对电路的数字信号输入和输出,通过电路设计和仿真,可以对流水灯的实现原理和方法有更加深入的认识,进一步提高电路设计和仿真的能力。 总之,通过51单片机和74ls138译码器的组合实现流水灯控制,借助Proteus仿真软件,可以方便地进行电路设计和仿真,为学习电路设计和数字电子技术提供了非常有益的途径。 ### 回答2: 流水灯是电子领域中一种很常见的实验电路,它可以通过51单片机和74ls138译码器的结合来实现。在Proteus软件中仿真可以更加方便地验证这个电路的实际效果。 51单片机是一种高性能的单片微控制器,它可以用来控制各种外设和实现不同的功能。在实现流水灯中,我们可以利用51单片机产生不同的时序信号,从而控制LED灯的亮灭状态。 74ls138译码器则是一种常用的二进制译码器,它可以将二进制输入信号转换成相应的输出信号。在流水灯中,我们可以通过对74ls138译码器的控制来产生不同的输出信号,使得LED灯在不同的时刻亮起。 具体电路实现中,我们可以通过将51单片机的引脚与74ls138译码器的引脚相连,从而形成一个完整的电路。通过Proteus仿真软件的帮助,我们可以模拟不同的信号输入和输出,从而验证电路的实际效果。 流水灯的实现不仅可以用于基础电子实验教学,也可以用于生产领域中的各种控制应用。此外,利用Proteus仿真软件开展实验,还可以帮助我们更加深入地理解各种电路的工作原理和实际效果。因此,掌握流水灯实验电路的知识是电子工程师必备的基础技能之一。 ### 回答3: 51单片机74ls138译码器流水灯 proteus仿真,是一种电路方案和仿真模拟技术。 首先,我们需要了解一些基本的电子知识。74ls138译码器是一种逻辑芯片,它的作用是将输入的数字信号转换成对应的输出信号。而51单片机则是一种经典的单片机芯片,它可以控制和处理数字信号,实现各种功能。流水灯则是一种LED灯效果,它可以实现多组LED灯的依次闪烁,形成流动的效果。 在实现流水灯的电路中,我们需要将51单片机和74ls138译码器相连接,并且控制LED灯的状态。在具体实现过程中,我们需要使用Proteus仿真软件进行电路的模拟和测试。在Proteus软件中,我们可以添加各种电子元器件,并对其进行相应的参数设置和连接。 具体步骤如下: 1. 打开Proteus软件,新建一个电路设计项目。 2. 在左侧工具栏中选择对应的元器件,比如51单片机和74ls138译码器。 3. 将元器件拖到电路设计界面,并使用连线工具将它们相互连接。 4. 对每个元器件进行相应的参数设置和相关信息的输入。比如,对51单片机进行程序编写,并设置其输出引脚和输入信号。 5. 添加LED灯,将其连接到74ls138译码器中的输出引脚上。 6. 利用Proteus软件进行仿真测试,检查电路设计和程序功能是否实现。 总之,51单片机74ls138译码器流水灯 Proteus仿真,是一种实现流水灯效果的电路设计和仿真技术。通过合理使用Proteus软件,我们可以快速构建一个真实的电路,并对其进行测试和调试,实现各种丰富的LED灯效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值