标签:
首先还是贴一下这个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