赞
踩
目录
对于stm32的操作,通常有寄存器、标准库、HAL库三种编译方式,在本文主要就是借用点灯这一实例,展示标准库是如何让GPIO工作起来的。
下载地址:
链接: STM32 Standard Peripheral Libraries - STMicroelectronics
STM32F103标准库模板:
STM32工程文件夹主要包含以下几个文件夹:
接下来就是将这些文件配置进入工程
首先将工程文件夹里面的文件全部导入工程,全部的.c和.h文件
接着点击魔术棒,导入文件夹路径
1.使用RCC开启GPIO时钟
2.使用GPIO_Init函数初始化GPIO口
3.使用输入输出的函数控制GPIO口
给指定端口给定想要的高低电平,本文采用高电平熄灭、低电平点亮的模式。
因为本文需要点亮LED灯,因此我们只需要借助GPIOx端口进行输出高低电平,因此需要开启APB2 时钟,语法如下:
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
第一个参数是选择输出端口,通常为GPIOA、GPIOB等,第二个参数是选择状态,使能(ENABLE)和失能(DISABLE)二选一
GPIO_Init的语法为:
GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
在使用时需要端口和初始化结构体,因此在使用该函数之前,需要先定义一个结构体。
- void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//把指定端口的引脚设置为高电平
- void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//把指定端口的引脚设置为低电平
- void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//对指定端口的引脚进行写入操作
- void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//对指定端口的16个引脚同时进行写入操作
本文需要使用的引脚为PA0-15,因此需要开启APB2的外设使能时钟,如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
结构体的类型为:GPIO_InitTypeDef
该结构体的成员有三个,分别为:GPIO_Pin、GPIO_Speed、GPIO_Mode。
GPIO_Mode为GPIO工作的模式,共八种,如下所示:
- typedef enum
- { GPIO_Mode_AIN = 0x0,//模拟输入
- GPIO_Mode_IN_FLOATING = 0x04,//浮空输入
- GPIO_Mode_IPD = 0x28,//下拉输入
- GPIO_Mode_IPU = 0x48,//上拉输入
- GPIO_Mode_Out_OD = 0x14,//开漏输出
- GPIO_Mode_Out_PP = 0x10,//推挽输出
- GPIO_Mode_AF_OD = 0x1C,//复用开漏输出
- GPIO_Mode_AF_PP = 0x18//复用推挽输出
- }GPIOMode_TypeDef;
GPIO_Pin为我们选择的引脚,按照格式选择相应引脚即可,如下:
GPIO_Speed为输出速率,具体如下:
本文具体创建的结构体代码如下:
- GPIO_InitTypeDef GPIOA_Initleds;
- GPIOA_Initleds.GPIO_Mode =GPIO_Mode_Out_PP;//推挽输出模式
- GPIOA_Initleds.GPIO_Pin =GPIO_Pin_All;//输出引脚为PA0-15全部作为输出端口
- GPIOA_Initleds.GPIO_Speed =GPIO_Speed_50MHz;//输出速率为50MHz
GPIO_Init (GPIOA,&GPIOA_Initleds);//&是取地址的意思
因为本文是直接对PA0的8个端口进行灯的亮灭操作,因此本文选用的是GPIO_Write函数
本文因为延时函数比较常用,将延时函数做成了Delay.h的头文件,其中.C文件代码内容具体如下:
- #include "stm32f10x.h"
-
- /**
- * @brief 微秒级延时
- * @param xus 延时时长,范围:0~233015
- * @retval 无
- */
- void Delay_us(uint32_t xus)
- {
- SysTick->LOAD = 72 * xus; //设置定时器重装值
- SysTick->VAL = 0x00; //清空当前计数值
- SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
- while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
- SysTick->CTRL = 0x00000004; //关闭定时器
- }
-
- /**
- * @brief 毫秒级延时
- * @param xms 延时时长,范围:0~4294967295
- * @retval 无
- */
- void Delay_ms(uint32_t xms)
- {
- while(xms--)
- {
- Delay_us(1000);
- }
- }
-
- /**
- * @brief 秒级延时
- * @param xs 延时时长,范围:0~4294967295
- * @retval 无
- */
- void Delay_s(uint32_t xs)
- {
- while(xs--)
- {
- Delay_ms(1000);
- }
- }
本文的题目要求是需要亮灭间隔1秒,因此直接调用Delay_s即可
具体代码如下:
Delay_s(1);
本文因为要使8个引脚的灯按规律亮灭,如果使用GPIO_Bits和GPIO_Rebits需要重复写八次,代码内容繁多,因此本文直接使用GPIO_Write函数对十六个端口进行写入操作,同时借用循环移位操作,每次向左移位一次,实现灯的亮灭转换,具体的代码如下:
- for (i=0;i<=7;i++)
- {
- GPIO_Write(GPIOA,~(0X0001<<i));//0000 0000 0000 0001取反
- Delay_s(1);
- if (i==8)i=0;
- }
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
-
- int main(void)
- {
- //开启时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- //初始化GPIO口
- GPIO_InitTypeDef GPIOA_Initleds;
- GPIOA_Initleds.GPIO_Mode =GPIO_Mode_Out_PP;//推挽输出模式
- GPIOA_Initleds.GPIO_Pin =GPIO_Pin_All;//输出引脚为PA0-15全部作为输出端口
- GPIOA_Initleds.GPIO_Speed =GPIO_Speed_50MHz;//输出速率为50MHz
- GPIO_Init (GPIOA,&GPIOA_Initleds);//&是取地址的意思
- while (1)
- {
- int i;
- for (i=0;i<=7;i++)
- {
- GPIO_Write(GPIOA,~(0X0001<<i));//0000 0000 0000 0001取反
- Delay_s(1);
- if (i==8)i=0;
- }
- }
- }
首先设置debug
接下来再点击debug,进行引脚设置
最后点击 全速运行程序,即可输出波形
由波形可以看出,PA0-7的引脚能够依次实现亮灭
由于本文将拍摄的视频转为gif格式,看出来的有延时,间隔比1s大了,但是实际是烧录情况是非常完美的
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
其中,GPIOA
是端口名称,GPIO_InitStruct
是一个结构体,包含了引脚配置信息。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
其中,GPIOA
是端口名称,GPIO_PIN_1
是LED连接到的引脚号,GPIO_PIN_SET
表示将引脚设置为高电平状态。
https://www.bilibili.com/video/BV1th411z7sn?p=6&vd_source=282ea78ce81b7a1817b467d1df493b2a
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。