用户工具

站点工具


icore3l_arm_2
银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V0.1 2020-11-11 gingko 初次建立

STM32CubeMX教程二——GPIO输出实验

1.在主界面选择File–>New Project或者直接点击ACCEE TO MCU SELECTOR新建项目 2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F429IGHx。 3.配置RCC,使用外部时钟源 4.配置调试引脚 5.将三色LED对应的三个引脚(PI3、PI4、PH14)设置为GPIO_Output 6.引脚模式配置 7.时钟源设置,选择外部高速时钟源,配置为最大主频 8.工程文件的设置, 这里就是工程的各种配置。我们只用到有限的几个,其他的默认即可。IDE我们使用的是 MDK V5 9.点击Code Generator,进行进一步配置

  • Copy all used libraries into the project folder 【将HAL库的所有.C和.H都复制到所建工程中】
    • 优点:这样如果后续需要新增其他外设又可能不再用STM32CubeMX的时候便会很方便
    • 缺点:体积大,编译时间很长
  • Copy only the necessary library files 【只复制所需要的.C和.H(推荐)】
    • 优点:体积相对小,编译时间短,并且工程可复制拷贝
    • 缺点:新增外设时需要重新用STM32CubeMX导入
  • Add necessary library files as reference in the toolchain project configuration file【不复制文件,直接从软件包存放位置导入.C和.H】
    • 优点:体积小,比较节约硬盘空间
    • 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径

自行选择方式即可

10.然后点击GENERATE CODE,创建工程 创建成功,打开工程。



实验二:GPIO输出实验——ARM驱动三色LED

一、实验目的与意义

  1. 了解STM32 GPIO结构
  2. 了解STM32 GPIO 特征
  3. 了解LED特征和应用领域
  4. 掌握STM32 HAL库中GPIO属性的配置方法
  5. 掌握KEIL MDK集成开发环境使用方法

二、实验设备及平台

  1. iCore3L双核心板
  2. JLINK(或相同功能)仿真器
  3. Micro USB线缆
  4. Keil MDK开发平台
  5. STM32CubeMX开发平台
  6. 装有WIN XP(及更高版本)系统的计算机

三、实验原理

STM32 GPIO简介

  • GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚, STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32F429 芯片的 GPIO 被分成十一组,分别为PA、PB、PC、PD、……、PK,PA到PJ前十组每组有 16 个引脚,引脚标号分别为0到15,第十一组PK有8个引脚,引脚标号分别为0到7。GPIO 最简单的功能是输出高低电平, GPIO 还可以被设置为输入功能,用于读取按键等输入信号。STM32F4 每组通用 I/O 端口包括 4 个 32 位配置寄存器( MODER、 OTYPER、 OSPEEDR和 PUPDR)、 2 个 32 位数据寄存器( IDR 和 ODR)、 1 个 32 位置位/复位寄存器 (BSRR)、1 个 32 位锁定寄存器 (LCKR) 和 2 个 32 位复用功能选择寄存器( AFRH 和 AFRL)等。

GPIO可以配置成以下8种工作模式:

  • 浮空输入:此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。
  • 上拉输入:上拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个上拉电阻,这个上拉电阻的阻值介于30K~50K欧姆,CPU可以随时在输入数据寄存器的另一端,读出I/O端口的电平状态。这种模式的好处在于我们什么都不输入时,由于内部上拉电阻的原因,处理器会觉得我们输入了高电平,这就避免了不确定的输入。该端口在默认情况下输入为高电平。
  • 下拉输入:下拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个下拉电阻。与上拉输入模式类似,这种模式的好处在于外部没有输入时,由于内部下拉电阻的原因,我们的处理器会觉得我们输入了低电平。
  • 模拟功能:STM32的模拟输入通道的配置很简单,信号从I/O端口直接进入ADC模块。此时,所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此输入数据寄存器将不能反映端口上的电平状态,也就是说,模拟输入配置下,信号不经过输入数据寄存器,CPU不能在输入数据寄存器上读到有效的数据。该输入模式,使我们可以获得外部的模拟信号。
  • 开漏输出:开漏输出不可以直接输出高电平,开漏输出的输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。
  • 推挽输出:推挽输出可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。
  • 开漏复用输出:GPIO的基本功能是普通的I/O,而STM32有自己的各个功能模块,这些内置外设的外部引脚是与标准GPIO复用的,当作为这些模块的功能引脚时就叫复用。开漏复用输出功能模式与开漏输出模式相比,不同的是输出控制电路的输入,是和片上外设的输出信号相连即与复用功能的输出端相连,此时,输出数据寄存器在输出通道被断开。
  • 推挽复用输出:推挽复用输出功能模式与推挽输出模式相比,不同的是输出控制电路的输入,是和片上外设的输出信号相连,即与复用功能的输出端相连,而输出数据寄存器在输出通道被断开。

本实验通过STM32的GPIO口驱动LED,设定GPIO为推挽输出模式。输出低电平LED亮,输出高电平LED灭。驱动原理图如下图所示。

四、实验程序

1.主函数

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
 
  while (1)
  {
     //三色LED循环闪烁
     LED_RED_ON;  
     LED_BLUE_OFF;  
     LED_GREEN_OFF;  
     HAL_Delay(500);  //延时500ms
     LED_RED_OFF;  
     LED_BLUE_ON;  
     LED_GREEN_OFF;  
     HAL_Delay(500);  
     LED_RED_OFF;  
     LED_BLUE_OFF;  
     LED_GREEN_ON;  
     HAL_Delay(500);
  }
}

2.GPIO初始化

void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOI_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();                         //GPIOA、GPIOI和GPIOH端口时钟使能
 
  HAL_GPIO_WritePin(GPIOI, LED_GREEN_Pin|LED_RED_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_SET);  //PH14接蓝色LED灯,PH14置高电平,蓝灯熄灭 
 
  GPIO_InitStruct.Pin = LED_GREEN_Pin|LED_RED_Pin;       //设置连接红绿LED灯的IO端口
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;            //输出类型为推挽输出
  GPIO_InitStruct.Pull = GPIO_PULLUP;                    //上拉输出
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     //设置I/O输出速率
  HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
 
  GPIO_InitStruct.Pin = LED_BLUE_Pin;                    //设置连接蓝色LED灯的IO端口
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;            //输出类型为推挽输出
  GPIO_InitStruct.Pull = GPIO_PULLUP;                    //上拉输出
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     //设置I/O输出速率
  HAL_GPIO_Init(LED_BLUE_GPIO_Port, &GPIO_InitStruct);
}
  • void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)这个函数有两个参数,第一个参数是用来指定需要初始化的GPIO对应的GPIO组,取值范围为GPIOA~GPIOK。第二个参数为初始化参数结构体指针,结构体类型为GPIO_InitTypeDef。
typedef struct 
{  
  uint32_t Pin;         // 配置IO端口
  uint32_t Mode;        // 配置IO模式
  uint32_t Pull;        // 配置IO上下拉
  uint32_t Speed;       // 配置IO速度等级
  uint32_t Alternate;   // 要连接到所选引脚的外围设备
}GPIO_InitTypeDef; 

五、实验步骤

  1. 把仿真器与iCore3L的SWD调试口相连(直接相连或者通过转接器相连);
  2. 把iCore3L通过Micro USB线与计算机相连,为iCore3L供电;
  3. 打开Keil MDK开发环境,并打开本实验工程;
  4. 烧写程序到iCore3L上;
  5. 也可以进入Debug 模式,单步运行或设置断电运行观察LED状态。

六、实验现象

iCore3L 双核心板上与ARM相连的三色LED(PCB上标示为ARM▪LED),按照红色、绿色、蓝色的次序交替点亮。

icore3l_arm_2.txt · 最后更改: 2022/03/19 10:56 由 sean