打印
[STM32F1]

stm32(F103c8t6)自学笔记

[复制链接]
楼主: t60yz
手机看帖
扫描二维码
随时随地手机跟帖
61
t60yz|  楼主 | 2023-11-21 16:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
3.GPIO输入
3.1 可输入设备(按键、温湿度...)

使用特权

评论回复
62
t60yz|  楼主 | 2023-11-21 16:23 | 只看该作者

使用特权

评论回复
63
t60yz|  楼主 | 2023-11-21 16:26 | 只看该作者
3.2 Stm32中按键、红外发射等器件的电路

使用特权

评论回复
64
t60yz|  楼主 | 2023-11-21 16:26 | 只看该作者
3.3 复习数据类型、宏定义、Typedef、结构体、枚举

使用特权

评论回复
65
t60yz|  楼主 | 2023-11-21 16:31 | 只看该作者
define能改变任何数据的名字,但是编译器不会检测是否有错

使用特权

评论回复
66
t60yz|  楼主 | 2023-11-21 16:31 | 只看该作者
Typedef和结构体相关的用法和说明可以看我的另外一篇文章

http://t.csdn.cn/H8ikF

使用特权

评论回复
67
t60yz|  楼主 | 2023-11-21 16:31 | 只看该作者

使用特权

评论回复
68
t60yz|  楼主 | 2023-11-21 16:31 | 只看该作者

使用特权

评论回复
69
t60yz|  楼主 | 2023-11-21 16:31 | 只看该作者
枚举类似于结构体,其中关键词 enum相当于结构体的关键词 struct;

注意enum中是用逗号分隔;

枚举的作用就是限制变量值的输入取值范围,就像星期几只能从七天里选一个;

取值超出范围会报错;

下附释义代码

使用特权

评论回复
70
t60yz|  楼主 | 2023-11-21 16:32 | 只看该作者

使用特权

评论回复
71
t60yz|  楼主 | 2023-11-21 16:32 | 只看该作者
#include <stdio.h>

int main()
{
        typedef enum{
                mon=1,
                tur, //        等效于mon=1,tur=2,wen=3,tue=4
                wen,
                tue
        }day;//这里将整个枚举改名为day
        day a,b,c;
        int d;
       
        a=tur;
        b=(day)1;//直接赋值int型不行 ,需要转化为枚举型
        c=day(4);
       
        d=wen;//外界数据也可以引用枚举集合里的数
       
        printf("a=%d\n",a);
        printf("b=%d\n",b);
        printf("c=%d\n",c);
        printf("d=%d\n",d);
}

使用特权

评论回复
72
t60yz|  楼主 | 2023-11-21 16:32 | 只看该作者
3.4 代码(按键控制LED)(封装)(Delay函数封装)
Stm32中延时函数Delay的us、ms、s的代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"

/***************************************************/延时函数模块
#include "Delay.h"
#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);
        }
}

/***************************************************/LED模块
#include "LED.h"
#include "stm32f10x.h"                  // Device header

void LED_init(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE );//使能GPIOA的时钟
        
        GPIO_InitTypeDef A;  //定义两个IO的结构体变量 A是PA0口、B是PB0口

        A.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出模式
        A.GPIO_Pin=GPIO_Pin_All;  //设置为所有Pin口
        A.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz
        GPIO_Init( GPIOA,&A); //以上三个都要传入该函数初始化
        
}

void LED_state(uint16_t GPIO_Pin,FunctionalState NewState)//指定Pin口和对应状态
{
        if(NewState==0)
                GPIO_ResetBits(GPIOA,GPIO_Pin);//置低电平
        else
                GPIO_SetBits(GPIOA,GPIO_Pin);//置高电平
}

/***************************************************/按键模块
#include "Key.h"                  // Device header
#include "Delay.h"


void Key_init(uint16_t GPIO_Pin)//需要指定端口Pin进行模式设置
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE );//使能GPIOA的时钟
        
        GPIO_InitTypeDef A;  //定义两个IO的结构体变量 A是PA0口、B是PB0口

        A.GPIO_Mode=GPIO_Mode_IPU;//设置为 上拉输入 模式
        A.GPIO_Pin=GPIO_Pin;  //外界参数设置Pin口
        A.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz,在输入模式下该设置没用
        GPIO_Init( GPIOB,&A); //以上三个都要传入该函数初始化
}

uint8_t get_keynum(uint16_t GPIO_Pin)
{
        uint8_t keynum;
        keynum =GPIO_ReadInputDataBit(GPIOB,GPIO_Pin);
        if(keynum ==0)
        {
                while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin) ==0);
                Delay_ms(10);
                return 0;
        }
        else
                return keynum ;
}

/***************************************************/主函数
int main(void)
{
        uint8_t state=0;
        LED_init();
        Key_init(GPIO_Pin_12);
        while(1)
        {
                if(get_keynum(GPIO_Pin_12) ==0)
                {
                        state ++;
                }
                if(state %2)
                {
                        LED_state(GPIO_Pin_All ,ENABLE);
                }
                else
                {
                        LED_state(GPIO_Pin_All,DISABLE);
                }
        }
}

使用特权

评论回复
73
t60yz|  楼主 | 2023-11-21 16:33 | 只看该作者
3.5 代码(光敏电阻控制蜂鸣器及LED)(封装)
#include "stm32f10x.h"                  // Device header
#include "Buzzer.h"
#include "LightR.h"
#include "LED.h"


/***************************************************/蜂鸣器模块
#include "Buzzer.h"                  // Device header
#include "stm32f10x.h"

GPIO_InitTypeDef buzzer;  

void Buzzer_init(uint16_t GPIO_Pin)//需要指定端口Pin进行模式设置
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE );//使能GPIOB的时钟
       
       

        buzzer.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出模式
        buzzer.GPIO_Pin=GPIO_Pin;  //外界参数设置Pin口
        buzzer.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz,在输入模式下该设置没用
        GPIO_Init( GPIOB,&buzzer); //以上三个都要传入该函数初始化
}

void Buzzer_run(unsigned char Flag)//设定运行标志位
{
        if(Flag==0)
                GPIO_ResetBits(GPIOB,buzzer.GPIO_Pin);//置低电平
        else
                GPIO_SetBits(GPIOB,buzzer.GPIO_Pin);//置高电平
}

/***************************************************/光敏电阻模块
#include "LightR.h"
#include "stm32f10x.h"

GPIO_InitTypeDef lightr;  

void LightR_init(uint16_t GPIO_Pin)//需要指定端口Pin进行模式设置
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);//使能GPIOB的时钟
       
       

        lightr.GPIO_Mode=GPIO_Mode_IPU;//设置为 上拉输入 模式
        lightr.GPIO_Pin=GPIO_Pin;  //外界参数设置Pin口
        lightr.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz,在输入模式下该设置没用
        GPIO_Init( GPIOB,&lightr); //以上三个都要传入该函数初始化
}

uint8_t get_LightR_DO(void)//用来获取光敏电阻输出的数字量DO值
{
        return  GPIO_ReadInputDataBit(GPIOB,lightr.GPIO_Pin);
}

/***************************************************/LED模块
#include "LED.h"
#include "stm32f10x.h"                  // Device header

GPIO_InitTypeDef led;  //定义两个IO的结构体变量 A是PA0口、B是PB0口

void LED_init(uint16_t GPIO_Pin)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE );//使能GPIOA的时钟
       
       
        led .GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出模式
        led .GPIO_Pin=GPIO_Pin;  //设置为所有Pin口
        led .GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz
        GPIO_Init( GPIOA,&led ); //以上三个都要传入该函数初始化
       
}

void LED_state(unsigned char Flag)//指定Pin口和对应状态
{
        if(Flag==0)
                GPIO_ResetBits(GPIOA,led.GPIO_Pin);//置低电平
        else
                GPIO_SetBits(GPIOA,led.GPIO_Pin);//置高电平
}

/***************************************************/主函数

int main(void)
{
        uint16_t lightstate;//亮、暗状态
       
        LED_init(GPIO_Pin_0);
        Buzzer_init(GPIO_Pin_0);
        LightR_init(GPIO_Pin_1);
        while(1)
        {
                lightstate =get_LightR_DO();//循环里实时获取
                if(lightstate)//暗        灯灭、蜂鸣器响
                {
                        LED_state(1);
                        Buzzer_run(0);
                }
                else //亮        灯亮、蜂鸣器不响
                {
                        LED_state(0);
                        Buzzer_run(1);
                }
        }
}

使用特权

评论回复
74
t60yz|  楼主 | 2023-11-21 16:33 | 只看该作者
四、OLED显示屏
1.结构原理
1.1 结构图(0.96寸4针B版本)

使用特权

评论回复
75
t60yz|  楼主 | 2023-11-22 11:34 | 只看该作者
1.2 介绍

使用特权

评论回复
76
t60yz|  楼主 | 2023-11-22 11:34 | 只看该作者
1.3 电路

使用特权

评论回复
77
t60yz|  楼主 | 2023-11-22 11:34 | 只看该作者
1.4 调试方法

使用特权

评论回复
78
t60yz|  楼主 | 2023-11-22 11:34 | 只看该作者
2.OLED驱动函数

使用特权

评论回复
79
t60yz|  楼主 | 2023-11-22 11:35 | 只看该作者
3.驱动函数封装包
见资源包

五、EXTI外部中断系统
1.结构原理
1.1 认识中断

使用特权

评论回复
80
t60yz|  楼主 | 2023-11-22 11:35 | 只看该作者
和C51中的中断是一样的,只不过32的资源更加丰富;  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则