搜索
bottom↓
回复: 3

智能充电器入门教程 四: GPIO 简单应用

[复制链接]

出0入0汤圆

发表于 2009-11-23 19:13:40 | 显示全部楼层 |阅读模式
1: 设计要求:
    智能充电器上有 2 个 双色LED,  我们的目的为有规律的点亮 LED1 和 LED2.

2: 硬件电路:


(原文件名:12.jpg)

LED1: PA8   LED2: PB6    LED3: PB2   LED4: PB10


3: 软件程序设计:
(1) 根据要求配置 GPIOA 中的 PA8,PB6,PB2,PB10 为输出
对于下面程序中的  GPIO_InitStructure.GPIO_Speed 和 GPIO_InitStructure.GPIO_Mode 推荐大家看下面两篇文章.

========================================================================
STM32 GPIO的十大优越功能综述
前几天Hotpower邀请大家讨论一下GPIO的功能、性能和优缺点(STM32的GPIO很强大~~~),等了几天没见太多人发言,但综合来看提到了3点:1)真双向IO,2)速度快,3)寄存器功能重复。关于第3点有说好,有说多余的,见仁见智。

下面我就在做个抛砖引玉,根据ST手册上的内容,简单地综述一下GPIO的功能:
一、共有8种模式,可以通过编程选择:
  1. 浮空输入
  2. 带上拉输入
  3. 带下拉输入
  4. 模拟输入
  5. 开漏输出——(此模式可实现hotpower说的真双向IO)
  6. 推挽输出
  7. 复用功能的推挽输出
  8. 复用功能的开漏输出
模式7和模式8需根据具体的复用功能决定。

二、专门的寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。

三、每个GPIO口都可以作为外部中断的输入,便于系统灵活设计。

四、I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制。

五、所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平。

六、大电流驱动能力:GPIO口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD-1.3V时,可以提供或吸收20mA电流。

七、具有独立的唤醒I/O口。

八、很多I/O口的复用功能可以重新映射,见:你知道吗?STM32上很多管脚功能可以重新映射。

九、GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。

十、输出模式下输入寄存器依然有效,在开漏配置模式下实现真正的双向I/O功能

备注: 当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:2MHz、10MHz和50MHz,这个速度是指I/O口驱动电路的速度,是用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。

========================================================================

STM32 GPIO端口的输出速度设置

当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:2MHz、10MHz和50MHz,这个速度是指I/O口驱动电路的速度,是用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。

高频的驱动电路,噪声也高,当你不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。

当然如果你要输出较高频率的信号,但却选用了较低频率的驱动模块,你很可能会得到失真的输出信号。



--------------------------------------------------------------------------------


实际上芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路。

注意:GPIO的引脚速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与你的程序有关。


--------------------------------------------------------------------------------


关键是,GPIO的引脚速度跟应用匹配。

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

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

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


--------------------------------------------------------------------


void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure PA. as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure PB. as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_6 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
   
}

(2) 打开 GPIOA 和 GPIOB 的时钟, 因为 STM32 是一个低功耗的 MCU , 每一个你使用的外围设备都需要单独开启时钟, 如果不开启将不能使用, 这个也是对于 STM32 初学者容易疏忽的地方

  /* Enable GPIOA and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_AFIO, ENABLE);

STM32共有5种时钟源,其中三种不同的时钟源可用作为驱动系统时钟(SYSCLK);
1、HSI 由内部8MHz RC振荡器产生,它是可以直接用来作为系统时钟或经2分频后作为PLLSRC输入。
HIS时钟频率在出厂时被校准在1%(25°C),在系统复位时,工厂校准值会被装载到时钟控制寄存器的HISCAL[7..0] 位。
用户可以通过更改HISCAL[4..0]来调整HSI频率。
另外时钟寄存器中有一个HSIRDY位用来指示HSI RC是不稳定工作,在时钟启过后,直到这个标志位置被硬件置1后,HSI RC时钟才被输出。
HSI RC时钟还可以用时钟寄存器中的HSION位来启动和关闭。

HSI时钟同时也是HSE晶体荡振器的备用时钟源。

使用HSE时钟,程序设置时钟参数流程:
1、将RCC寄存器重新设置为默认值   RCC_DeInit;
2、打开外部高速时钟晶振HSE    RCC_HSEConfig(RCC_HSE_ON);
3、等待外部高速时钟晶振工作    HSEStartUpStatus = RCC_WaitForHSEStartUp();
4、设置AHB时钟         RCC_HCLKConfig;
5、设置高速AHB时钟     RCC_PCLK2Config;
6、设置低速速AHB时钟   RCC_PCLK1Config;
7、设置PLL              RCC_PLLConfig;
8、打开PLL              RCC_PLLCmd(ENABLE);
9、等待PLL工作   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
10、设置系统时钟        RCC_SYSCLKConfig;
11、判断是否PLL是系统时钟     while(RCC_GetSYSCLKSource() != 0x08)
12、打开要使用的外设时钟    RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()


最后一步就是运行主函数那

   for(;;)
   {
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        GPIO_SetBits(GPIOB,GPIO_Pin_6);
        Delay(500);
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
        GPIO_ResetBits(GPIOB,GPIO_Pin_6);
        Delay(500);
        GPIO_SetBits(GPIOB,GPIO_Pin_2);
        GPIO_SetBits(GPIOB,GPIO_Pin_10);
        Delay(500);
        GPIO_ResetBits(GPIOB,GPIO_Pin_2);
        GPIO_ResetBits(GPIOB,GPIO_Pin_10);
        Delay(500);
   
    }

(4) 编译与调试
      我们已经完成所有程序编写部份, 接下来就是将工程编译成功后下载到我们的智能充电器中进行调试和仿真.
      如果看到 LED 有规律的点亮和熄灭,说明我们已经达到我们的设计目标.

--------------------------------------------------------------------------

总结: 我们学习完了这篇教程之后, 相信大家对下面几个方面的内容已经掌握了.
* GPIO 的设置
* STM32 GPIO 的优势
* STM32 的时钟结构


基于 MDK3.50以上版本 的工程下载:
点击此处下载 ourdev_506473.rar(文件大小:5.72M) (原文件名:4 GPIO.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2009-11-23 19:41:23 | 显示全部楼层

出0入0汤圆

发表于 2010-2-23 13:39:27 | 显示全部楼层
STM32初学者

出0入0汤圆

发表于 2010-3-12 21:42:27 | 显示全部楼层
好东西  正在学习ING
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 03:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表