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

发布者:快乐飞跃最新更新时间:2020-09-03 来源: eefocus关键字:STM32  GPIO 手机看文章 扫描二维码
随时随地手机看文章

#include "stm32f10x_lib.h"

#include "stm32f10x.h"

 

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

 

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

{

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

}

 

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

void RCC_Configuration(void)

{   

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

     initialize the PLL and update the SystemFrequency variable. */

  SystemInit();

}

int main()

{

  

int i;

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

 

 

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

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;         

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//将PC679口配置为通用推挽输出

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

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

while(1)

{

   

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

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

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

GPIO_ResetBits(GPIOC, GPIO_Pin_6);

GPIO_ResetBits(GPIOC, GPIO_Pin_7);

// GPIO_ResetBits(GPIOC, GPIO_Pin_9);

// Delay(0xAFFFF);

    

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

  }

}


具体代码工程在我的资源里:免费提供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

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

上一篇:STM32之HAL库和标准库的GPIO
下一篇:STM32学习系列---STM32之GPIO

推荐阅读最新更新时间:2024-11-12 00:10

STM32的PWM输入模式
这个程序用的是PWM输入模式,该模式是输入捕获模式的一个特例,除了下列区别外,工作过程序与输入捕获模式一样的。 2个ICx信号映射到同一下TIxl输入(这里是CH1及CH2)。 这两个ICx信号都为边沿有效,但极性相反。 TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.
[单片机]
STM32定时器捕获PWM脉冲频率
一、概念理解 PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx信号。 3. 这两个ICx信号分别在相反的极性边沿有效。 4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。 5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。 6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信
[单片机]
STM32-高级定时器TIM1的应用
void GPIO_Configuration(void)//配置IO脚 { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pi
[单片机]
STM32-高级定时器TIM1的应用
学习STM32笔记3 GPIO设置
/******************************************************************************* 设置GPIO基本参数 *******************************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器 GPIO_InitStructure.GPIO_Pin = GPIO_P
[单片机]
stm32之i2C硬件驱动ht16c22
使用硬件i2c,驱动ht16c22,程序不稳定是肯定的,还是贴出来吧,项目中最好不要用。 文件i2c.h内容: #ifndef _STM32F103_I2C_H_ #define _STM32F103_I2C_H_ #include stm32f10x.h #define SlaveAddress 0x7e //0x7e //#define ModeSet 0b10001100 //80Hz,turn on sys and LCD bias,1/3 bias #define ModeSet 0x8C //80Hz,turn on sys and LCD bias,1/3 bias //#define VlcdAdjus
[单片机]
STM32 系列MCU 不同型号的移植步骤解析
STM32 系列MCU 不同型号的移植! 第一步 更换启动文件: 第二步 修改宏定义: 图 1 或者修改stm32f10x.h 具体修改如下: 图2 第三步 修改系统主频率: 文件:system_stm32f10x.c 具体修改如下: 图 3 第四步 修改外部晶振源: 文件:stm32f10x.h 具体修改如下: 图 4 第五步 定时器需要根据以上修改的系统主频率进行对应的修改。 其他: 修改 Flash 地址 文件:misc.h 具体修改如下: 图 5 与以下配置一致: IAP 设置步骤 一、 IAP 工程设置 1、修改main 中的按键触发键 2、修改下载串口 二、 下载工程设置 1、修改程序入
[单片机]
<font color='red'>STM32</font> 系列MCU 不同型号的移植步骤解析
解决STM32单片机的ADC采样不准确偏移的问题
项目场景: 用STM32CubeMX生成的ADC采样测量电压。 单片机:STM32G070 MDK:V5.25 问题描述: 采样回来的数值Debug看总是大了些许,几个通道都是这样,具体测试情况如下: 原因分析: 翻阅对比官方历程检查发现没有ADC校准,STM32CubeMX不会自动帮你配置校准。 /* Run the ADC calibration */ if (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK) { /* Calibration Error */ Error_Handler(); } /* USER CODE END 2 */ /*
[单片机]
解决<font color='red'>STM32</font>单片机的ADC采样不准确偏移的问题
关于STM32 ADC时采用DMA的一点疑问
手册上有这样的话:只有ADC1能够产生DMA请求,似乎是只有ADC通道1能采用DMA方式传输数据。 但是万利的开发板上的ADC例子,用的是ADC通道10,还用了DMA 方式传数据。 所以我猜测 “只有ADC1能够产生DMA请求”中提到的ADC1 并不是指ADC 通道1, 而是软件可配置的 ADC 通道的分类形式,可分为ADC1和ADC2. 我们可将 通道10(或其他)配置成ADC1 “模式”。通过函数 /* ADC1 regular channel10 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_5
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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