码迷,mamicode.com
首页 > 其他好文 > 详细

STM32F103学习3:通过器件参考手册和具体程序学习I/O操作(MDK软件仿真+硬件实验)

时间:2015-12-29 19:29:51      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:

首先还是贴一下这个LED例程的部分代码:

 1 int main()
 2 {
 3     
 4     Stm32_Clock_Init();//系统时钟设置
 5     RCC->APB2ENR |= 0x00000001; //开启afio时钟
 6    // AFIO->MAPR = (0x00FFFFFF & AFIO->MAPR)|0x04000000;          //关闭JTAG             
 7 
 8     RCC->APB2ENR|=0X0000001c;//先使能外设IO PORTa,b,c时钟
 9     
10     GPIOB->CRH=0X33333333;    //推挽输出
11     GPIOB->CRL=0X33333333;    //推挽输出
12     GPIOC->CRH=0X33333333;    //推挽输出
13     GPIOC->CRL=0X33333333;    //推挽输出
14     GPIOA->CRH=0X33333333;    //推挽输出
15     GPIOA->CRL=0X33333333;    //推挽输出
16 
17      while (1)
18     {            
19     delay_ms(50);
20               
21     GPIOB->ODR=0;               //全部输出0
22     GPIOA->ODR=0;        
23     GPIOC->ODR=0;
24     
25     delay_ms(50);
26     
27     GPIOB->ODR=0xffffffff;     //全部输出1 
28     GPIOA->ODR=0xffffffff;      
29     GPIOC->ODR=0xffffffff;
30     }
31 }

时钟设置先暂时不看了,先看I/O部分的操作

1、I/O输出模式设置

GPIOB->CRH=0X33333333;    //推挽输出

在器件手册中75页找到CRH寄存器列表:

技术分享

这里可以看到y=8...15意思是能控制8~15腿

以一个管脚为例,0x3等于二进制的0011,

MODEy的1:0位为11,即为输出模式,最大速度为50MHz。(BTW:点一个闪烁的LED灯哪能到得了这么快的速度)

在此基础上,CNFy为00,即为输出模式的推挽输出模式。

 

GPIOB->CRL=0X33333333;    //推挽输出

CRL寄存器的图就不贴了,不同就是这里的y=0...7,能控制0~7腿

GPIOA、GPIOB、GPIOC,所有的管脚都设置为了推挽输出的模式

 

管脚模式这就设置完成了,下面看一下管脚操作:

2.管脚置高、管脚置低

GPIOB->ODR=0;               //全部输出0

结合这一句来看:

GPIOB->ODR=0xffffffff;     //全部输出1 

一会儿全1,一会儿全0,有点《三体》里整个宇宙都同时为你而闪烁的意味呢。。。

 

我们找到ODR寄存器:

技术分享

发现这个寄存器没法进行单独位的操作,只能以16位的形式操作。

提示说独立位控制的置1置0还是去看看BSRR寄存器吧

技术分享

y=0~15

给31:16位赋值1则置低该位,给15:0为赋值1则置高该位,但是哪个赋值0的话那个管脚就不会鸟你。而置高是优先的。

(这样就可以让宇宙中的某个星系为你单独的闪烁了!)

 

首先修改代码:

注释掉全部涉及ODR寄存器的内容:

在原理图中找到LED管脚号为:PB8

技术分享

修改程序为:

GPIOB->BSRR=0X01000000; //PB8置0
GPIOB->BSRR=0X0100;     ////PB8置1

Rebuild一下

 

我们先用软件仿真试试:

在工具栏flash的configure flash tools中,Debug选项卡中,点击Use Simulator,点击OK:

技术分享

下面点击这个小放大镜进入Debug模式

技术分享

我们发现整个界面发生了完全的变化

技术分享

我们使用Analysis windows 查看一下PB8随时间变化的波形以此来判断I/O是否正确的操作了

点击:

技术分享

 

出现了一个叫逻辑分析仪的界面

技术分享

这篇帖子是keil的软件逻辑分析仪( logic analyzer)使用教程,我再次不再赘述了:

http://www.eeboard.com/bbs/thread-29726-1-1.html

结果:

技术分享

成功的实现了I/O端口的翻转

 

但是发现还有个寄存器可以实现BSRR寄存器的高16位的置0功能:端口位清除寄存器(GPIOx_BRR)
技术分享

我们退出Debug模式修改程序试试:

//    GPIOB->BSRR=0X01000000;     //PB8置0
    GPIOB->BRR=0X0100;     //PB8置0        

Rebuild一下,进入Debug模式:

仿真一下,发现结果是一样的!

但是,BSRR提供给了用户一种可能,就是用一个语句,同时置高置低不同的几个端口

3、在实际的STM32开发中,我们更多的应该是利用库函数的操作

先去找找库函数手册

STM32F103学习3:通过器件参考手册和具体程序学习I/O操作(MDK软件仿真+硬件实验)

标签:

原文地址:http://www.cnblogs.com/sdmpy/p/5086731.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!