单片机学习小组
直播中

半导体开发

11年用户 920经验值
擅长:可编程逻辑
私信 关注

GPIO有哪些重要函数?

GPIO有哪些重要函数?

回帖(1)

王莉

2022-2-16 11:46:33
  前言

在做STM32单片机实验开发我们之前进行了开发环境的搭建,工程模板的建立以及单片机基础知识和GPIO相关知识的准备,下面我们进行32固件库开发第一个实验:控制LED,堪称单片机界入门的 hello Word,不仅可以熟悉单片机的引脚控制,更能对单片机的时钟进行深入了解,废话不多说,咱们进入正文,跳转文尾
  一、硬件资源

我的实验采用的STM32C8T8最小系统单片机,采用其他的单片机也可以进行本实验
1、芯片命名介绍:

STM32F103C8T6命名说明
[tr]符号说明[/tr]
STM32ST公司采用ARM Cortex-M3内核的32位微控制器
F芯片子系列
103增强型系列
C引脚数,T:36,C:48,R:64,V:100,Z:144,I:176
8内部Flash容量(单位:字节),6:32K,8:64K,B:128K,C:256K,D:384K,E:512K,G:1M
T芯片封装,H:BGA,T:LQFP,U:VFQFPN
6工作温度,6: -40 ~ 85℃,7: -40 ~ 105℃
2、芯片资源介绍

  STM32F103C8是高性能ARM-M3系列, 32位RISC核心操作,工作在一个72 MHz的频率,拥有Flash =64Kb RAM = 20Kb、两组10通道12位同步A/D、三个通用16位定时器和一个PWM定时器、1个CAN、2个I2C、2个SPI、3个URAT通道,一个USB等内嵌资源的芯片
一、电气原理图

下面是本次实验的板子,与LED原理图

  因为板子只自带一个LED,因为不需要其他的控制方式,只需要芯片内给PC13 引脚置低,即可实现LED电路导通,另外需要找到烧写代码的下载原理图,连接电路,我是使用SWD下载方式,只需要连接4根线,找到板子上的SWD接口原理图并对照实物图

二、电器件连接

因为不需要其他的控制方式,只需要连接一个下载电路。

三、开发思路

1、须知



  • 需要控制引脚PC13,即GPIOC第13个引脚,低电平有效
  • 找到IO口对应的时钟总线 ,即ABP2 。可查阅 —— 图一、系统框架图
  • 关于GPIO几个重要函数


2、控制LED流程与步骤:


四、代码实践
因为LED 作为STM32板子的一个外设,我将其封装为一个模块放入HARDWARE文件中,以后需要可以直接调用,
led.h文件


#ifndef LED_H   
#define LED_H


void LED_Init(void);
       
#endif


==引用条件编译原因,防止多文件编译时,发生重复编译 ==


下面是led.c文件函数示例:


#include "led.h"
#include "stm32f10x.h"  //顶层头文件
void LED_Init(void)
{
        GPIO_InitTypeDef LED_InitStruct;  //叶柄:定义一个结构体变量LED_InitStruct
        //1、打开串口时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );
        //2、配置并初始化串口
        LED_InitStruct.GPIO_Pin = GPIO_Pin_13;    //PC13
        LED_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
        LED_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;


        GPIO_Init(GPIOC, &LED_InitStruct);  //初始化串口
        //3、控制串口读写(一般是主函数控制读写,这里LED默认关闭,即置高)
        GPIO_SetBits(GPIOC, GPIO_Pin_13);  
}


主函数main.c


#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
int main ()
{
        LED_Init();
  while(1)
        {
                GPIO_ResetBits(GPIOC, GPIO_Pin_13); //LED点亮
                delay_s(1);
                GPIO_SetBits(GPIOC, GPIO_Pin_13); //LED熄灭
                delay_s(1);
        }       
        return 0;
}


五、问题与思考
检查不到设备:
解决方式:检查驱动是否安装好,检查型号选择是否正确ST-link等


debug,中看不到寄存器——案例一
需引入一个文件STM32F103_SVD文件


函数相似导致选错 ——案例二,如下
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE );
注意分清楚函数字母的含义就不会再次出错了


思考
1、为什么在led.c文件中引用了rcc、gpio相关函数,却没有调用相关头文件,而用STM32f10x代替了所有库函数头文件
原因:顶层头文件stm32f10x.h这个文件包含了STM32F10x全系列所有外设寄存器的定义(寄存器的基地址和布局)、位定义、中断向量表、存储空间的地址映射等,
好吧可能是不是这个原因,我查不到
举报

更多回帖

发帖
×
20
完善资料,
赚取积分