STM32--基本知识点

简介: STM32--基本知识点

STM32--基本知识点

GPIO端口模式

(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出

STM32F10C8T6 引脚分布功能图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

STM32F10C8T6 串口分布

串口 1
PA9  /USART1 _TX/TIM1_ _CH2 
PA10 /USART1_ RX/TIM1_ _CH3 ;

串口 2
PA2  /USART2_ TX/ ADC_ IN2/TIM2_ CH3
PA3  /USART2_ RX/ADC_ IN3/TIM2_ _CH4

串口 3 

21 PB10 /12C2 SCL 1 USART3_ TX
22 PB11 / 12C2_ SDA /USART3 _RX

学习案例

STM32固件库使用(GPIO端口控制LED)

led.c

#include"led.h"

void LED_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;             //定义结构体指针变量    
        RCC_APB2PeriphClockCmd(LED1_GPIO_CLK,ENABLE);  
     //配置时钟RCC_APB2PeriphClock寄存器
    /*配置GPIO端口的模式
        {
            1.选择要控制的GPIO引脚
            2.设置引脚模式(通用推挽输出)
            3.设置引脚速率
        }*/
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
      GPIO_InitStructure.GPIO_Pin   = LED1_GPIO_PIN;    //red
      GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);    //调用GPIO库函数,初始化GPIO端口
      
      GPIO_InitStructure.GPIO_Pin   = LED2_GPIO_PIN;    //blue
      GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);    //调用GPIO库函数,初始化GPIO端口
      
      GPIO_InitStructure.GPIO_Pin   = LED3_GPIO_PIN;    //green
      GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);    //调用GPIO库函数,初始化GPIO端口

led.h

#ifndef __LED_H
#define __LED_H

#include"stm32f10x.h"
/*
注意:该引脚定义是根据野火STM32F103霸道开发板的原理图定义的,如果需要自行的设计需要重新更改宏定义选择不同的GPIO端口
STM32F103ZET6芯片共有144个引脚
其中:GPIOA,GPIOB,GPIOC,GPIOD,GPIOE
*/

/*red*/

#define LED1_GPIO_PORT        GPIOB                          /* GPIO端口 */
#define LED1_GPIO_CLK         RCC_APB2Periph_GPIOB        /* GPIO端口时钟 */
#define LED1_GPIO_PIN            GPIO_Pin_5                    /* 连接到SCL时钟线的GPIO */

/*blue*/

#define LED2_GPIO_PORT        GPIOB                          /* GPIO端口 */
#define LED2_GPIO_CLK         RCC_APB2Periph_GPIOB        /* GPIO端口时钟 */
#define LED2_GPIO_PIN            GPIO_Pin_1                    /* 连接到SCL时钟线的GPIO */

/*green*/

#define LED3_GPIO_PORT        GPIOB                          /* GPIO端口 */
#define LED3_GPIO_CLK         RCC_APB2Periph_GPIOB        /* GPIO端口时钟 */
#define LED3_GPIO_PIN            GPIO_Pin_0                    /* 连接到SCL时钟线的GPIO */


#define ON  0
#define OFF 1

/* 使用标准的固件库控制IO*/
#define LED1(a)    if (a)    \
                    GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
                    else        \
                    GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)

#define LED2(a)    if (a)    \
                    GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
                    else        \
                    GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)

#define LED3(a)    if (a)    \
                    GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\
                    else        \
                    GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)


/* 直接操作寄存器的方法控制IO */
#define    digitalHi(p,i)         {p->BSRR=i;}     //输出为高电平        
#define digitalLo(p,i)         {p->BRR=i;}     //输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态


/* 定义控制IO的宏 */
#define LED1_TOGGLE         digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_OFF           digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_ON               digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)

#define LED2_TOGGLE         digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_OFF           digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_ON               digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)

#define LED3_TOGGLE         digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_OFF           digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_ON               digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)

/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */

//红
#define LED_RED  \
                    LED1_ON;\
                    LED2_OFF\
                    LED3_OFF

//绿
#define LED_GREEN        \
                    LED1_OFF;\
                    LED2_ON\
                    LED3_OFF

//蓝
#define LED_BLUE    \
                    LED1_OFF;\
                    LED2_OFF\
                    LED3_ON

                    
//黄(红+绿)                    
#define LED_YELLOW    \
                    LED1_ON;\
                    LED2_ON\
                    LED3_OFF
//紫(红+蓝)
#define LED_PURPLE    \
                    LED1_ON;\
                    LED2_OFF\
                    LED3_ON

//青(绿+蓝)
#define LED_CYAN \
                    LED1_OFF;\
                    LED2_ON\
                    LED3_ON
                    
//白(红+绿+蓝)
#define LED_WHITE    \
                    LED1_ON;\
                    LED2_ON\
                    LED3_ON
                    
//黑(全部关闭)
#define LED_RGBOFF    \
                    LED1_OFF;\
                    LED2_OFF\
                    LED3_OFF

void LED_GPIO_Config(void);

#endif

main.c

#include "stm32f10x.h"   
#include "led.h"

int main(void)
{
    // 来到这里的时候,系统的时钟已经被配置成72M。
        LED_GPIO_Config();
        while(1)
        {
                //red
                 GPIO_ResetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//开
                 DELAY_nMS(2000);
             GPIO_SetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//关
             DELAY_nMS(2000);
             // blue
             GPIO_ResetBits(LED2_GPIO_PORT , LED2_GPIO_PIN);//开
             DELAY_nMS(1000);
             GPIO_SetBits(LED2_GPIO_PORT , LED2_GPIO_PIN);//关
             DELAY_nMS(1000);
             //green 
             GPIO_ResetBits(LED3_GPIO_PORT , LED3_GPIO_PIN);//开
             DELAY_nMS(3000);
             GPIO_SetBits(LED3_GPIO_PORT , LED3_GPIO_PIN);//关
             DELAY_nMS(3000);    
        }    
}

软件延迟函数

delay.c

#include"DELAY.H"                           

void DELAY_nUS(unsigned int Time)
{
    while(--Time);
}
void DELAY_nMS(unsigned int time)
{
  unsigned int  i,j;             
  for(i=0;i<time;i++)    
     for(j=0;j<939;j++); 
}


dely.h

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"

void DELAY_nUS(unsigned int Time);
void DELAY_nMS(unsigned int time);

#endif

STM32 GPIO端口 寄存器点灯

#include"stm32f10x.h"//STM32库文件

/***************************************************
  * @file    main.c
  * @author  dele
  * @version V1.0
  * @date    2020-01-28
  * @brief   测试LED
*****************************************************/
/*****************************************************
    操作LED时寄存器的步骤
    {
      1.打开 GPIO 端口的时钟
      2.配置IO口  (输出/输入)
      3.控制ODR寄存器的高低电平状态
    }
*****************************************************/
/*函数声明*/
int main(void);
void DELAY_nMS(unsigned int time);
void SystemInit(void);


/*****************************************************
函数名称:main()
函数功能:主函数
*****************************************************/
int main(void)
{    
    while(1)
    {
        // 打开 GPIOB 端口的时钟
        *( unsigned int * )0x40021018 |=  ( (1) << 3 );    
        // 配置IO口为输出
        *( unsigned int * )0x40010C00 |=  ( (1) << (4*0) );
        // 控制 ODR 寄存器
        *( unsigned int * )0x40010C0C &= ~(1<<0);//输出低电平    
         DELAY_nMS(1000);        
        // 打开 GPIOB 端口的时钟
        *( unsigned int * )0x40021018 |=  ( (1) << 3 );    
        // 配置IO口为输出
        *( unsigned int * )0x40010C00 |=  ( (1) << (4*0) );    
        *( unsigned int * )0x40010C0C |= (1<<0); //输出高电平    
        DELAY_nMS(2000);
    }
}



/**********************************************************************
函数名称:DELAY_nMS()
函数功能:延迟函数(延迟1ms)
***********************************************************************/
void DELAY_nMS(unsigned int time)
{
  unsigned int  i,j;             
  for(i=0;i<time;i++)    
     for(j=0;j<939;j++); 
}

/**********************************************************************
函数名称:SystemInit()
函数功能:系统初始化(从汇编代码进入C程序)
***********************************************************************/
void SystemInit(void)
{
    //骗过编译器
}

注:使用开发板是野火F103ZET6霸道开发板(代码是火哥的例程资料代码)

参考资料

1.野火STM32视频学习https://space.bilibili.com/356820657/
2.野火STM32论坛http://www.firebbs.cn/forum.php

目录
相关文章
|
7月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
7月前
|
传感器
STM32标准库外部中断和定时器知识点总结-2
STM32标准库外部中断和定时器知识点总结
|
7月前
|
传感器
STM32标准库外部中断和定时器知识点总结-1
STM32标准库外部中断和定时器知识点总结
|
7月前
|
消息中间件 物联网 Linux
STM32面试知识点总结分析
STM32面试知识点总结分析
187 0
|
编解码 机器人 芯片
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
2119 0
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
|
编解码
STM32:PWM驱动LED达到呼吸灯效果(内含:1.接线原理图/实物图+2.代码部分+3.注意事项/补充知识点部分)
STM32:PWM驱动LED达到呼吸灯效果(内含:1.接线原理图/实物图+2.代码部分+3.注意事项/补充知识点部分)
1495 0
STM32:PWM驱动LED达到呼吸灯效果(内含:1.接线原理图/实物图+2.代码部分+3.注意事项/补充知识点部分)
|
6月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
481 2
|
5月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
803 0