STM32菜鸟成长记录---GPIO的使用

发布者:Mengyun最新更新时间:2016-12-28 来源: eefocus关键字:STM32  GPIO 手机看文章 扫描二维码
随时随地手机看文章

 

  1. #include "stm32f10x_lib.h"  

  2. #include "stm32f10x.h"  

  3.   

  4. GPIO_InitTypeDef GPIO_InitStructure;         //定义GPIO宏操作结构体  

  5.   

  6. void Delay(__IO uint32_t nCount)//__IO的宏定义volatile  

  7. {  

  8.   for(; nCount != 0; nCount--);  

  9. }  

  10.   

  11. /*初始化嵌入式Flash接口,初始化PLL使其达到系统可用频率*/  

  12. void RCC_Configuration(void)  

  13. {     

  14.   /* Setup the microcontroller system. Initialize the Embedded Flash Interface,   

  15.      initialize the PLL and update the SystemFrequency variable. */  

  16.   SystemInit();  

  17. }  

  18. int main()  

  19. {  

  20.         

  21.      int i;  

  22.      RCC_Configuration();   //初始化FLASH及其PLL,系统时钟配置  

  23.        

  24.    

  25.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB,ENABLE);    //外设时钟配置,开启GPIOC的时钟   

  26.      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;                          

  27.      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//将PC6\7\9口配置为通用推挽输出  

  28.      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //口线翻转速度为50MHz  

  29.      GPIO_Init(GPIOC, &GPIO_InitStructure);         //配置GPIOC口  

  30.       

  31.        

  32.    

  33.      while(1)  

  34.      {  

  35.           

  36.          GPIO_SetBits(GPIOC, GPIO_Pin_6);           //PC6口输出高电平  

  37.          GPIO_SetBits(GPIOC, GPIO_Pin_7);               //PC7口输出高电平                GPIO_SetBits(GPIOC, GPIO_Pin_9);        //PC9口输出高电平    

  38.           

  39.               for(i=0;i<1000000;i++);  

  40.          GPIO_ResetBits(GPIOC, GPIO_Pin_6);  

  41.          GPIO_ResetBits(GPIOC, GPIO_Pin_7);  

  42.         //   GPIO_ResetBits(GPIOC, GPIO_Pin_9);  

  43.         // Delay(0xAFFFF);  

  44.       

  45.          for(i=0;i<1000000;i++);  

  46.      }  

  47. }  

  48.  

具体代码工程在我的资源里:免费提供 http://download.csdn.net/detail/yx_l128125/4494861

步骤一声明GPIO的结构:

            GPIO_InitTypeDef GPIO_InitStructure;

 

步骤二为变量GPIO_InitStructure的成员赋值,如果只设置其中的一部分成员,我们需要如下代码:

/** * LED1->PC6,LED2->PC7,LED3->PC9 */

 

      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;

      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

      GPIO_Init(GPIOC,&GPIO_InitStructure);

 

实际上这里省略掉一个函数:

GPIO_StructInit,它是用来初始化变量

GPIO_InitStructure的,经过实验,发现不用也可以。大家可以尝试一下:)然后

修改该变量中的成员,有三个成员。在STM32开发板上,GPIO端口接的

PC6、 PC7、 PC9引脚。因此,我们在GPIO_Pin成员这里赋值GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9。

在GPIO_Speed成员上赋值 GPIO_Speed_50MHz,

 GPIO_Mode成员则是设置为 GPIO_Mode_Out_PP,表示推挽输出模式。

 

推挽输出——>(输出高电平电流和输出低电平电流一样大)

     
        推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。

       推挽电路适用于低电压大电流的场合,广泛应用于功放电路和开关电源中。

优点是:结构简单,开关变压器磁芯利用率高,推挽电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小。

缺点是:变压器带有中心抽头,而且开关管的承受电压较高;由于变压器原边漏感的存在,功率开关管关断的瞬间,漏源极会产生较大的电压尖峰,另外输入电流的纹波较大,因而输入滤波器的体积较大。

       三极管的推挽部分的简化电路图如图

 

步骤三 调用函数GPIO_Init()来初始化外设GPIO,代码如下:

        GPIO_Init(GPIOC,&GPIO_InitStructure);

   

步骤四使能。注意,在固件库中,GPIO没有GPIO_Cmd的函数,因此这个步骤省略。

   

通过以上四个步骤,我们已经对GPIO进行了设置。还有一个问题不能忽略:

在设置外设前,我们必须给它调用一个时钟函数来使能外设时钟。

    在CPU的用户手册中,我们知道,stm32有好几个时钟的,现在我们用哪个                                      

时钟呢?打开《STM32F10xxx参考手册》中文版的P25页,截图如下页所

示。我们使用的是GPIOC端口,因此,使用的是APB2。

 

步骤五:定下这个APB2对应的函数后,我们就调用它:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

 

其中,第一个参数需要指示要开启什么端口的时钟,RCC_APB2Periph_GPIOx就是开启GPIOx的时钟,第二个参数需要指示是开启还是关闭,ENABLE/DISABLE。

 

注意,这个时钟的使能函数,应该放在最前面。必须先有时钟,才能做后续的操作。

我们先看原理图里,LED如何连接的:

 

 从原理图,我们可以看到,要使得3个LED都亮起来,必须把对应的引脚

清零。置1会让LED灭。现在打开STM32固件库文档,找到10.2小节,GPIO

库函数。GPIO设置的所有函数,都在这里。我们看下要使用GPIO库的哪个函

数。找到:GPIO_SetBits();和GPIO_ResetBits();

    这两个函数,根据说明,分别是设置某个引脚为高电平和低电平。

GPIO_SetBits函数是设置高电平,

GPIO_ResetBits函数则是清零操作。根据我们

获得的信息,写出如下代码:我们的目的是让所有的LED有规律地闪烁,并且无限循环。

 

我们还需要调用SystemInit();函数,来初始化整个系统,包括时钟设置到

72MHZ。以上配置结束后,您就可以根据MDK+Jlink的相关教程,下载HEX

文件到板子里进行调试了。

 

JLINK 烧写方法在我的资源:《奋斗版STM32开发板JTAG下载步骤》http://download.csdn.net/detail/yx_l128125/4494855

 

承诺!这周五前一定要发表关于系统时钟--嘀嗒定时器,普通定时器,485通信的几篇文章,因为时间关系一直没能整理成博客,在此承诺给自己一点压力!做不到丢自己的脸!



关键字:STM32  GPIO 引用地址:STM32菜鸟成长记录---GPIO的使用

上一篇:STM32菜鸟成长记录---普通定时器应用
下一篇:STM32菜鸟成长记录---1

推荐阅读最新更新时间:2024-03-16 15:27

stm32之TIM-高级定时器应用实例一(详细)
硬件:stm32f103c8t6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 如果第一次接触定时器,可以先看基本定时器。本篇内容较多,如果想直接动手操作,可以跳到后面的实验代码。 stm32标准库对定时器外设建立了4个初始化结构体,定时器分为基本定时器、通用定时器、高级定时器,针对不用的定时器要使用不同初始化结构体。下面是4个初始化结构体的适用分类: TIM_TimeBaseInitTypeDef (基本定时器、通用定时器、高级定时器) TIM_OCInitTypeDef (通用定时器、高级定时器) TIM_ICInitTypeDef (通用定时器、高级定时器
[单片机]
<font color='red'>stm32</font>之TIM-高级定时器应用实例一(详细)
IAR FOR STM8 学习笔记 固件库 GPIO
经过一番挣扎,还是决定使用官方的固件库了。。 从网上下一个STM8S的固件库,记得是FOR IAR的。 找到里面的IAR模板就可以开始用了。 这些都是直接写好的库函数,可以直接调用,但首先得先读懂,先了解些必备知识。 STM8的寄存器的地址 在STM8中,与某个外围设备有关的寄存器在地址上都是顺序排列的;比如与GPIO有关的寄存器有ODR、IDR、DDR、CR1、CR2,与PA口有关的这五个寄存器就被安排在了0x00 5000~0x00 5004这5个地址空间中,它们有一个0x005000的基地址,分别偏移0,1,2,3,4。 ”stm8s.h 中与GPIO有关的定义,以及固件库中访问外围设备寄存器的方法
[单片机]
IAR FOR STM8 学习笔记 固件库 <font color='red'>GPIO</font>
基于STM32的MDK程序启动
;//HeapSize(inBytes) 0x0-0xFFFFFFFF:8 ;// Heap_SizeEQU0x00000020;//定义堆空间大小 AREAHEAP,NOINIT,READWRITE,ALIGN=3;//定义一个数据段,8字节对齐 __heap_base Heap_MemSPACEHeap_Size;//保留Heap_Size的堆空间 __heap_limit;//标号,代表堆末尾地址,后面有用 PRESERVE8;//指示编译器8字节对齐 THUMB;//指示编译器为THUMB指令 ;VectorTableMappedtoAddress0atReset AREARESET,DATA,READONLY;//
[单片机]
STM32初学笔记3之外部中断
学习的第三部分,我选择了外部中断,因为个人觉得除了时序问题,我们应用的最多的就要数中断了,当然还有一个定时器还没学,呵呵,只能往后放一下了。当然,我不打算花太多时间去搞GPIO,所以就自己看了一下手册,能用就行了。 反正学习这些东西还是根据个人的习惯吧,我学习主要也就是参考ST给的示例程序,反正还是很有用的。今天花了差不多两个小时的时间根据EXTI的示例程序自己编写了一个程序,最后在ALIENTEK上面运行成功,下面将示例代码展示如下: 笔者将跟硬件平台有关的配置放在一个板级支持包的源文件里面,具体请查看: 板级支持包的应用 一文。 一、GPIO的配置 二、嵌入向量中断控制器配置 三、中断服务程序 说
[单片机]
<font color='red'>STM32</font>初学笔记3之外部中断
STM32输出比较模式输出不动频率的脉冲
//以下为TIM配置程序 void TIM1_PWM_INIT(void) //TIM1配置PWM输出参数 { u32 temp_fre,temp_duty; TempC = 60; //设置频率初始值 TempD = 4; //设置初始占空比1 / 2 temp_fre = (1000000 / TempC) - 1; temp_duty = ((temp_fre + 1) / TempD); TIM_TimeBaseStructure.TIM_Prescaler = 72; TIM_TimeBaseStructure.TIM_CounterMode
[单片机]
stm32跑马灯——寄存器和位操作
寄存器版: GPIO基础: 每组io口有7个寄存器。也就是7个寄存器,一共可以控制一组GPIO的16个IO口。 硬件连接: 例如: 由上图1可知:要使用到LED0和LED1,他们的IO口分别为PB5和PE5 由上图2可知:要使用到LED0和LED1,他们的IO口分别为PA8和PD2 GPIO的输出模式为推挽输出。 代码: 使能IO口时钟:配置寄存器RCC APB2ENR. 初始化IO口模式:配置寄存器GPIOx CRH/CRL 操作IO口,输出高低电平:配置寄存器GPIOX_ODR或者BSRR/BRR. 这里采用上图1的的原理图: led.h: #ifndef __LED_H //避免重复引用 #d
[单片机]
<font color='red'>stm32</font>跑马灯——寄存器和位操作
聊聊一个STM32中断处理问题
先看一段代码: while(1) { if(EXTI_Sign==1) { HAL_Delay(Period); HAL_NVIC_EnableIRQ(EXTI2_3_IRQn); HAL_NVIC_EnableIRQ(EXTI2_3_IRQn); EXTI_Sign=0; 。。。。。。 } } 有人使用STM32G0系列的芯片开发产品,有段功能测试验证代码如上所示,相同的函数必须调用2次才能正常运行,调用2次倒也罢了,关键是必须!颇为纳闷。 这里开启了PA3的外部中断功能,上下沿均可触发。PA3接收外来报警信号,类似于烟感报警器。报警信号是一串脉冲信号,报警信号过来时存在多次
[单片机]
聊聊一个<font color='red'>STM32</font>中断处理问题
SPI接口说明及原理
1简介 SPI:Serial Peripheral Interface,是串行外设接口。 SPI是由摩托罗拉于 1985 年前后开发,是一种适用于短距离、设备到设备通信的同步串行接口。 从那时起,这种接口就已成为许多半导体制造商,特别是微控制器(MCU)和微处理器(MPU)采用的事实标准。 2SPI接口 SPI总线是一种4线总线,通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以。 MOSI:Master Output Slave Input,主设备数据输出,从设备数据输入; MISO:Master Input Slave Output,主设备数据输入,从设备数据输出; SCLK:Serial Clock,时
[单片机]
SPI接口说明及原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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