stm32库函数代码自动生成器_嵌入式单片机STM32原理及应用

后端 (3) 2024-09-18 17:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
stm32库函数代码自动生成器_嵌入式单片机STM32原理及应用,希望能够帮助你!!!。

一、功能说明

stm32库函数代码自动生成器_嵌入式单片机STM32原理及应用_https://bianchenghao6.com/blog_后端_第1张

本文实现STM库函数点亮LED的功能。
库函数的工程模板来自普中官方教材。
工程模板类似下图:

stm32库函数代码自动生成器_嵌入式单片机STM32原理及应用_https://bianchenghao6.com/blog_后端_第2张

二、实现

1. 定义 LED的引脚,我的开发板使用GPIOC

#define LED_PORT GPIOC 1

2. 定义所有引脚,使用或操作:

#define LED_PIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7) 1

3. 关键函数说明

2.3.1 RCC_APB2PeriphClockCmd

打开或关闭APB2外设时钟。可选参数有:

  • RCC_APB2Periph_AFIO 功能复用 I/O 时钟
  • RCC_APB2Periph_GPIOA GPIOA 时钟
  • RCC_APB2Periph_GPIOB GPIOB 时钟
  • RCC_APB2Periph_GPIOC GPIOC 时钟
  • RCC_APB2Periph_GPIOD GPIOD 时钟
  • RCC_APB2Periph_GPIOE GPIOE 时钟
  • RCC_APB2Periph_ADC1 ADC1 时钟
  • RCC_APB2Periph_ADC2 ADC2 时钟
  • RCC_APB2Periph_TIM1 TIM1 时钟
  • RCC_APB2Periph_SPI1 SPI1 时钟
  • RCC_APB2Periph_USART1 USART1 时钟
  • RCC_APB2Periph_ALL 全部APB2外设时钟

打开GPIOC时钟示例:

RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);

2.3.2 GPIO_Init

功能描述: 根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器。
初始化参数是个结构体,定义在stm32f10x_gpio.h里。
GPIO_InitTypeDefStructure

typedef struct { u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; } GPIO_InitTypeDef; 

GPIO_Pin

GPIO的引脚定义

  • GPIO_Pin_None : 没有选中引脚
  • GPIO_Pin_0 引脚0
  • ……
  • GPIO_Pin_All 选中全部引脚

GPIO_Speed

引脚的速率

  • GPIO_Speed_10MHz 最高输出速率 10MHz
  • GPIO_Speed_2MHz 最高输出速率 2MHz
  • GPIO_Speed_50MHz 最高输出速率 50MHz

GPIO_Mode

用来设置引脚的工作状态

  • GPIO_Mode_AIN 模拟输入
  • GPIO_Mode_IN_FLOATING 浮空输入
  • GPIO_Model_IPD 下拉输入
  • GPIO_Mode_IPU 上拉输入
  • GPIO_Mode_Out_OD 开漏输出
  • GPIO_Mode_Out_PP 推挽输出
  • GPIO_Mode_AF_OD 复用开漏输出
  • GPIO_Mode_AF_PP 复用推挽输出

2.3.3 函数 GPIO_Write

向指定GPIO数据端口写入数据,输入参数GPIOx和PortVal待写入的数值。
我这里的开发板LED共阳接法,控制时把要点亮的位设置为低,其余设置高。如点亮L1:

GPIO_Write(GPIOC, 0xFE);

2.3.4 GPIO_SetBits

设置指定的数据端口位,示例:

GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);

2.3.5 GPIO_ResetBits

清除指定的端口位。

2.3.6 GPIO_WriteBit

设置或清除指定的数据端口位,示例:

GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);

三、示例源代码

1. LED.h

#ifndef _led_H #define _led_H #include "stm32f10x.h" /* LED时钟端口、引脚定义 */ #define LED_PORT GPIOC #define LED_PIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7) #define LED_PORT_RCC RCC_APB2Periph_GPIOC void LED_Init(void); #endif 

2. LED.c

#include "led.h" void LED_Init() { GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量 RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE); GPIO_InitStructure.GPIO_Pin=LED_PIN; //选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(LED_PORT,&GPIO_InitStructure); /* 初始化GPIO */ GPIO_SetBits(LED_PORT,LED_PIN); //将LED端口拉高,熄灭所有LED } 

3. main.c

 #include "stm32f10x.h" #include "led.h" // 延时函数 void delay(u32 i){ while(i--); } int main() { LED_Init(); while(1) { GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//点亮D1 delay(0xfffff); GPIO_ResetBits(LED_PORT, GPIO_Pin_1); delay(0xfffff); GPIO_ResetBits(LED_PORT, GPIO_Pin_2); delay(0xfffff); GPIO_ResetBits(LED_PORT, GPIO_Pin_3); delay(0xfffff); GPIO_ResetBits(LED_PORT, GPIO_Pin_4); delay(0xfffff); GPIO_ResetBits(LED_PORT, GPIO_Pin_5); delay(0xfffff); GPIO_ResetBits(LED_PORT, GPIO_Pin_6); delay(0xfffff); GPIO_ResetBits(LED_PORT, GPIO_Pin_7); delay(0xfffff); GPIO_SetBits(LED_PORT,LED_PIN); } } 

运行效果:连续点亮8个LED,然后全熄灭,再重复循环。

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

下一篇

已是最新文章

发表回复