STM32入门笔记(3)——GPIO

发布者:BlissfulDreams最新更新时间:2016-01-11 来源: eefocus关键字:STM32  入门笔记  GPIO 手机看文章 扫描二维码
随时随地手机看文章
      STM32的每个I/O口都由7个寄存器控制:2个32位端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位复位寄存器BSRR;1个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;最常用的有4个:CRL/CRH/IDR/ODR;因此通常情况下只需要配置好以上四个寄存器就可以了。而CRH和CRL作用是完全一样的,只不过CRH控制的是高8位的IO而CRL控制的是低8位的,因此IO的控制就显的比较简单了。

(1)使能IO时钟

    老规矩,用到哪个IO使能哪组IO时钟。例:RCC->APB2ENR|=1<<2;  // 使能PORTA时钟

(2)配置IO输入/输出模式

    STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出)。例:设置PORTC的11位为上拉输入,12位为推挽输出

    GPIOC->CRH&=0XFFF00FFF; //  清除这2位原来设置

    GPIOC->CRH|=0X00038000; // PC11输入,PC12输出

    GPIOC->ODR|=1<<11; // PC11上拉

(3)IO作为输入时判断IO高低电平

    例:判断PORTC的11位是否为低

   if((GPIOC->IDR&1<<11)==0)

   {

            //用户代码;

     }

小结:

上电后IO默认为浮空输入状态;当输出速率为50M时,八种I/O模式CRH/CRL配置为:通用推挽输出:0x3;通用开漏输出:0x7;复用推挽输出:0xb;复用开漏输出:0xf;模拟输入:0x0;浮空输入:0x4(上电默认);下/上拉输入:0x8;

I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。

比如:

对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。

对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。

对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。

点亮LED例程:(正点原子开发板)

[cpp] view plaincopy
 
  1. //点亮第一个LED灯,不用位映射  
  2. #include"sys.h"  
  3. #include "delay.h"  
  4. int main(void)  
  5. {  
  6. Stm32_Clock_Init(9);//初始化系统时钟  
  7. delay_init(72);//延时初使化  
  8. RCC->APB2ENR|=1<<2;//使能PORTA时钟  
  9. GPIOA->CRH&=0XFFFFFFF0;//清PA8  
  10. GPIOA->CRH|=0X03;//设置PA8为推挽输出  
  11. GPIOA->ODR&=0<<8;//初始化PA8输出0  
  12. while(1)  
  13. {  
  14. GPIOA->ODR|=1<<8;//设置PA8输出1,led灭  
  15. delay_ms(1000);//延时1s  
  16. GPIOA->ODR&=0<<8;//设置PA8输出0,led亮  
  17. delay_ms(1000);//延时1s  
  18. }  
  19.   
  20. }// 位映射法点亮LED,不过于纠结位映射的具体实现  
  21. #include"sys.h"  
  22. #include "delay.h"  
  23. int main(void)  
  24. {  
  25. Stm32_Clock_Init(9);//初始化系统时钟  
  26. delay_init(72);//延时初使化  
  27. RCC->APB2ENR|=1<<2;//使能PORTA时钟  
  28. GPIOA->CRH&=0XFFFFFFF0;//清PA8  
  29. GPIOA->CRH|=0X03;//设置PA8为推挽输出  
  30. PAout(8)=1;  
  31. while(1)  
  32. {  
  33. PAout(8)=0;  
  34. delay_ms(1000);//延时1s  
  35. PAout(8)=1;//设置PA8输出0,led亮  
  36. delay_ms(1000);//延时1s  
  37. }  
  38.   
  39.      
 

关键字:STM32  入门笔记  GPIO 引用地址:STM32入门笔记(3)——GPIO

上一篇:STM32入门笔记(1)——时钟
下一篇:Keil arm 编译 RO RW ZI DATA

推荐阅读最新更新时间:2024-03-16 14:43

STM32之关于USART以及波特率的一些思考
一、UART与USART?   UART:通用异步收发器    USART:通用同步和异步收发器   同步:发送端发送数据后,接收端回应后才发下一个数据包,是为阻塞模式   异步:发送端发送收据后,不需要等待接收端回应,接着发送下一个数据包,是为非阻塞模式   半双工:允许数据在两个方向上传输,但是某一时间,只允许数据在一个方向上传输   全双工:允许数据同时在两个方向上传输   SPI为同步全双工通信、IIC为同步半双工通信,UART为异步全双工通信、USART为同步或异步通信   UART数据格式:          数据帧格式:开始位、数据位、奇偶校验位、停止位       起始位:开始发送一个字节数据,数据线为逻辑0状态
[单片机]
<font color='red'>STM32</font>之关于USART以及波特率的一些思考
stm32串口发送16进制字符和16进制数的区别和具体实现方法
在调试一个stm32串口通信时,下位机设置好的发送方式采用串口助手接收后已经可以正常离线解包。但是由于需要实时解包并存储,因此写了一个实时解包存储的上位机,通信正常后接收的数据一直有误。经过单步调试,发现单片机发送的数据帧是字符串,并不是16进制数,而在线解包程序直接是对16进制数进行处理的,这就导致的比如16进制的数0xAA(170),下位机发送的是“AA (字符串),上位机处理的16进制数是41 41(10进制为65*100+65)。查询‘A’的ASCII码可知,‘A’的ASCII码对应的10进制数为65,16进制数为41,也就是说上位机把接收到的16进制字符串当16进制数处理了,所以出错。 解决方法两个,一个是修改下位机
[单片机]
STM32实战一 初识单片机
一直用PLC搞智能控制,最近研发新产品,因为控制点太多,想改用单片机,一阵某度之后,选用STM32,功能足够。开始想自己设计电路,很久没有Altium了,水平本来也不高,放弃了。从宝宝上买了一块开发板STM32F103VET6(单片机主体),一个ST-LINK仿真器(下载和调试程序),一些杜邦线(各种公母头),一些发光管(实际没有用上),开始奇妙的单片机旅程。 与客服联系,要了好多资料,客服不是很专业,不能回答技术问题,简单的安装和使用还行,专业问题要在工作时间找技术支持。一共有3G多的资料,首先安装驱动和软件。 ST-LINK+V2++WIN10+驱动.zip 这是WIN10的驱动。首先安装这个。 mdk472
[单片机]
<font color='red'>STM32</font>实战一 初识单片机
stm32软件仿真调试
下面是一个单片机STM32RCT6的PA8,PA9,PA10引脚输出PWM波形的仿真步骤,此外还展示了软件运行过程,如何查看全局变量的实时数据。每一步我都做了截图,大家照着一步步来,请大家放心参考! 1.点target图标,如下: 2.选择好单片机芯片的型号:我选的STM32RCT6型号,大家可以根据自己手上stm32开发板的型号来选择 3.外部晶振频率的选择:8Mhz(因为大部分单片机的外部晶振是8Mhz),为了使仿真更贴近实际,通常情况下都是选8Mhz 4.进入Debug页面进行设计,特别要注意第四点parameter,注意选正确好芯片的型号,我的是RC系列,所以写了RC,如果是RB系列,
[单片机]
<font color='red'>stm32</font>软件仿真调试
STM32 软件触发 DAC
/* DAC.c 用于DAC的初始化和配置 */ #include includes.h void DAC_Config(void); void DAC_Task(void* prg); void DAC_Task(void* prg) { DAC_SetChannel1Data(DAC_Align_12b_R,1028); //设置数据右对齐,转换值设置为1028 DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE); //软件触发通道1 开始转换 DAC_SetChannel2Data(DAC_Align_12b_R,2047)
[单片机]
STM32GPIO输入—按键检测
2.1硬件设计 弹性按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一 下子断开,使用按键时会产生如图带波纹信号,需要用软件消抖处理滤波,不方便输入检测。当然有专用的去抖电路,也有专用的去抖芯片,但通常我们用软件延时的方法就能解决抖动问题,没有必要添加多余的硬件电路。 2.2软件设计 同 LED 的工程,为了使工程更加有条理,我们把按键相关的代码独立分开存储,方便 以后移植。在“工程模板”之上新建“bsp_key.c”及“bsp_key.h”文件,这些文件也可根 据您的喜好命名,这些文件不属于 STM32标准库的内容,是由我们自己根据应用需要编写 的。 2.2.1编程要点 使能 GPIO端口时钟;
[单片机]
【<font color='red'>STM32</font>】<font color='red'>GPIO</font>输入—按键检测
JSN-SR04T超声波模块驱动(模式一、STM32
一、前期准备 单片机:STM32F103C8T6 开发环境:MDK5.14 库函数:标准库V3.5 JSN-SR04T模块:淘宝有售 二、实验效果 三、驱动原理 此模块分3中模式: (1)模式一:R27 = open,普通驱动模式; (2)模式二:R27 = 47K,串口模式,每隔100ms更新一次数据。 (3)模式三:R27 = 120K,串口模式,发0x55。 注意:次模块测试盲区20cm。 触发信号Tirig维持10Us以上的高电平即可等待Echo的返回,这里是用EXTI检测俩个跳变信号,去打开和关闭定时器,最后一次测量计算结果后清除定时器计时,并等待下一个循环开始。 需要完整工程或者有问题的请加QQ:100
[单片机]
JSN-SR04T超声波模块驱动(模式一、<font color='red'>STM32</font>)
STMCU应用过程中与电源相关的案例分享
我们在从事STM32单片机的应用开发及调试过程中,往往会碰到各类异常。其中有不少比例的问题跟电源有关。对于一个电子产品而言,电源部分很关键、很重要,但在实际开发调试中,我们偶尔会有意无意的忽视它。这里分享几个实际案例,以加强刺激,加深印象。 毕竟因为电源问题可能导致的异常很多很多,这里分享几个案例算是抛砖引玉,希望大家在调试中对电源方面加以重视。个人认为,往往电源出问题时导致的异常时并不太好分析。多数时候异常表现得更为诡异或没章法。 注:下面提到的案例中异常原因都与电源有关,但并不是说出现类似异常时一定是电源的原因。 下面主要分享五个基于STM32应用的案例。 案例1:STM32芯片的PLL无法正常工作。 有人使用STM3
[单片机]
STMCU应用过程中与电源相关的案例分享
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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