您的位置 首页 应用

STM32入门笔记(3)——GPIO

STM32的每个IO口都由7个寄存器控制:2个32位端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位复位寄存器BSRR;1

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. intmain(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. } //位映射法点亮LED,不过于纠结位映射的详细完成
  20. #include”sys.h”
  21. #include”delay.h”
  22. intmain(void)
  23. {
  24. Stm32_Clock_Init(9);//初始化体系时钟
  25. delay_init(72);//延时初使化
  26. RCC->APB2ENR|=1<<2;//使能PORTA时钟
  27. GPIOA->CRH&=0XFFFFFFF0;//清PA8
  28. GPIOA->CRH|=0X03;//设置PA8为推挽输出
  29. PAout(8)=1;
  30. while(1)
  31. {
  32. PAout(8)=0;
  33. delay_ms(1000);//延时1s
  34. PAout(8)=1;//设置PA8输出0,led亮
  35. delay_ms(1000);//延时1s
  36. }
  37. 
    

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/261413.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部