博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Stm32基础
阅读量:6583 次
发布时间:2019-06-24

本文共 7502 字,大约阅读时间需要 25 分钟。

Stm32基础

 

目录

 

常用功能函数

初始化gpio函数

作用:初始化一个或者多个io口(同一组)的工作方式和速度

该函数主要是操作GPIO CRL(CRH)寄存器,在上拉或者下拉的时候有设置BSRR或者BRR寄存器

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

注意:外设(包括GPIO)在使用之前,几乎都要先使能对应的时钟

 

参数

第一个参数:

GPIOAGPIOBGPIOCGPIODGPIOEGPIOFGPIOG
可选参数

 

第二个参数为一个结构体,三个变量成员

GPIO_Pin

GPIO_Pin_0GPIO_Pin_1GPIO_Pin_2GPIO_Pin_3GPIO_Pin_4GPIO_Pin_5GPIO_Pin_6GPIO_Pin_7GPIO_Pin_8GPIO_Pin_9GPIO_Pin_10GPIO_Pin_11GPIO_Pin_12GPIO_Pin_13GPIO_Pin_14GPIO_Pin_15
可选参数

GPIO_Speed

GPIO_Speed_10MHz = 1,GPIO_Speed_2MHz, GPIO_Speed_50MHz
可选参数

GPIO_Mode

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//复用推挽
可选参数

 

 示例

 

 

读取输入电平函数

作用:读取某个GPIO的输入电平

实际操作的是GPIOx_IDR寄存器

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 

示例

 

 

作用:读取某组GPIO的输入电平

实际操作的是GPIOx_IDR寄存器

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 

示例

 

 

 

 

读取输出电平函数

作用:读取某个GPIO的输出电平

实际操作的是GPIO_ODR寄存器

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

示例 

 

作用:读取某组GPIO的输出电平

实际操作的是GPIO_ODR寄存器

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

示例

 

 

设置输出电平函数

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);

 

跑马灯实验

 

led.h

#ifndef __LED_H#define __LED_Hvoid LED_Init(void);   #endif
代码

led.c

#include "led.h"#include "stm32f10x.h"void LED_Init(void){    GPIO_InitTypeDef GPIO_InitStruct;    //使能对应的时钟    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);////初始化gpioB.5与gpioE.5  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;      GPIO_Init(GPIOB,&GPIO_InitStruct);//初始化gpioB.5    GPIO_Init(GPIOE,&GPIO_InitStruct);//初始化gpioE.5    GPIO_SetBits(GPIOB,GPIO_Pin_5);//设置GPIOB.5输出低电平    GPIO_SetBits(GPIOE,GPIO_Pin_5);//设置GPIOE.5输出低电平  }
代码

main.c

#include "stm32f10x.h"#include "led.h"#include "delay.h"int main(void){//初始延时delay_init();LED_Init();        while(1)    {    GPIO_SetBits(GPIOB,GPIO_Pin_5);    GPIO_SetBits(GPIOE,GPIO_Pin_5);    delay_ms(500);            GPIO_ResetBits(GPIOB,GPIO_Pin_5);    GPIO_ResetBits(GPIOE,GPIO_Pin_5);    delay_ms(500);    }}
代码

 

 

 

蜂鸣器实验

 

原理

 

beep.h

#ifndef __BEEP_H#define __BEEP_H     #include "sys.h"//蜂鸣器端口定义#define BEEP PBout(8)    // BEEP,蜂鸣器接口 void BEEP_Init(void);    //初始化                             #endif
代码

beep.c

#include "beep.h"//初始化PB8为输出口,并使能这个口的时钟       //蜂鸣器初始化void BEEP_Init(void){  GPIO_InitTypeDef  GPIO_InitStructure;      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);     //使能GPIOB端口时钟  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                 //BEEP-->PB.8 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure);     //根据参数初始化GPIOB。8 GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出0,关闭蜂鸣器输出}
代码

main.c

#include "sys.h"    #include "delay.h"    #include "beep.h"   int main(void) {    delay_init();             //延时函数初始化        BEEP_Init();             //初始化蜂鸣器端口    while(1)    {            //BEEP=0;            GPIO_ResetBits(GPIOB,GPIO_Pin_8);                               delay_ms(300);//延时300ms                //BEEP=1;          GPIO_SetBits(GPIOB,GPIO_Pin_8);                     delay_ms(300);//延时300ms    } }
代码

 

 

 

 按键实验

 

原理图

 

按键扫描

 

 

解决办法

led.h

#ifndef __LED_H#define __LED_H#define LED0 PBout(5)// PB5#define LED1 PEout(5)// PE5    void LED_Init(void);    #endif
代码

led.c

#include "led.h"#include "stm32f10x.h"void LED_Init(void){    GPIO_InitTypeDef GPIO_InitStruct;//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOB,ENABLE);           GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;    GPIO_Init(GPIOB,&GPIO_InitStruct);    GPIO_SetBits(GPIOB,GPIO_Pin_5);          GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;    GPIO_Init(GPIOE,&GPIO_InitStruct);    GPIO_SetBits(GPIOE,GPIO_Pin_5);}
代码

key.h

#ifndef __KEY_H#define __KEY_H     #include "sys.h"//#define KEY0 PEin(4)       //PE4//#define KEY1 PEin(3)    //PE3 //#define KEY2 PEin(2)    //PE2//#define WK_UP PAin(0)    //PA0  WK_UP#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1#define KEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)  #define KEY0_PRES     1    //KEY0按下#define KEY1_PRES    2    //KEY1按下#define KEY2_PRES    3    //KEY2按下#define WKUP_PRES   4    //KEY_UP按下(即WK_UP/KEY_UP)void KEY_Init(void);//IO初始化u8 KEY_Scan(u8); //按键扫描函数                     #endif
代码

key.c

#include "stm32f10x.h"#include "key.h"#include "sys.h" #include "delay.h"                                    //按键初始化函数void KEY_Init(void) //IO初始化{      GPIO_InitTypeDef GPIO_InitStructure;      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入     GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4    //初始化WK_UP-->GPIOA.0      下拉输入    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始哈CPIOA.0}//按键处理函数//返回按键值//mode:0,不支持连续按;1,支持连续按//0,没有任何按键按下//1,key0按下//2,key1按下//3,key2按下//4,key3按下//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!u8 KEY_Scan(u8 mode){         static u8 key_up=1;//按键按松开标志    if(mode)key_up=1;  //支持连按            if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))    {        delay_ms(10);//去抖动        key_up=0;        if(KEY0==0)return KEY0_PRES;        else if(KEY1==0)return KEY1_PRES;        else if(KEY2==0)return KEY2_PRES;        else if(WK_UP==1)return WKUP_PRES;    }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;              return 0;// 无按键按下}
代码

beep.h

beep.c

main.c

#include "led.h"#include "delay.h"#include "key.h"#include "sys.h"#include "beep.h"  int main(void) {     vu8 key=0;        delay_init();             //延时函数初始化       LED_Init();                 //LED端口初始化    KEY_Init();          //初始化与按键连续的硬件接口    BEEP_Init();             //初始化蜂鸣器端口    LED0=0;                    //先点亮红灯    while(1)    {         key=KEY_Scan(0);    //得到键值           if(key)        {                                       switch(key)            {                                 case WKUP_PRES:    //控制蜂鸣器                    BEEP=!BEEP;                    break;                case KEY2_PRES:    //控制LED0翻转                    LED0=!LED0;                    break;                case KEY1_PRES:    //控制LED1翻转                    LED1=!LED1;                    break;                case KEY0_PRES:    //同时控制LED0,LED1翻转                    LED0=!LED0;                    LED1=!LED1;                    break;            }        }else delay_ms(10);     }     }
代码

 

 

端口复用与重映射

端口复用

简单来说就是一个端口有多种功能选择,复用功能更多请查表。

 

 

重映射

 

 

 

 

转载于:https://www.cnblogs.com/-wenli/p/10599293.html

你可能感兴趣的文章
LightOJ 1245(Harmonic Number (II))
查看>>
小知识记录
查看>>
css3 animate 和关键帧 @-webkit-keyframes
查看>>
文字链接颜色设置
查看>>
图片转流
查看>>
ubunto应用软件
查看>>
HTML 标签说明
查看>>
锋利的jQuery-2--判断jQuery获取到的对象是否存在$().length
查看>>
linux 查询系统版本命令、查询端口号是否被占用命令
查看>>
java笔记八:IO流之字符流与字符缓冲流
查看>>
Docker 命令收集
查看>>
myeclipse注册码生成器
查看>>
iOS App间相互跳转漫谈 part2
查看>>
Java CAS 原理剖析
查看>>
ISCC2014 writeup
查看>>
Kotlin 知识梳理(1) Kotlin 基础
查看>>
js正则表达式
查看>>
iOS socket通信,编解码,浮点型数据解析
查看>>
手把手教你如何新建scrapy爬虫框架的第一个项目(下)
查看>>
前端基础15:JS作用域基础
查看>>