打印
[STM32F1]

stm32(F103c8t6)自学笔记

[复制链接]
楼主: t60yz
手机看帖
扫描二维码
随时随地手机跟帖
41
t60yz|  楼主 | 2023-11-21 16:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
3.工程架构

使用特权

评论回复
42
t60yz|  楼主 | 2023-11-21 16:11 | 只看该作者
3.工程架构

使用特权

评论回复
43
t60yz|  楼主 | 2023-11-21 16:11 | 只看该作者
4.步骤回顾、总结

使用特权

评论回复
44
t60yz|  楼主 | 2023-11-21 16:11 | 只看该作者
三、GPIO(外设)
1.GPIO结构及原理
1.1 介绍

使用特权

评论回复
45
t60yz|  楼主 | 2023-11-21 16:11 | 只看该作者
1.2 结构
简单来说,GPIO是受RCC寄存器 控制的APB2总线上的一系列外设IO口。

这些IO口由 GPIO A~GPIO E ,而单个GPIO如GPIOC都是又下分为16个小IO口(引脚),其中驱动器是为了增加引脚电平驱动能力

使用特权

评论回复
46
t60yz|  楼主 | 2023-11-21 16:12 | 只看该作者
单个外设口如GPIOC的内部电路结构如下:

        下图中的肖特基触发器是文献翻译错误,实际应为施密特触发器。

使用特权

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

使用特权

评论回复
48
t60yz|  楼主 | 2023-11-21 16:12 | 只看该作者
施密特触发器原理:

        内部可设两个阈值,输入信号高于上限才为高电平,低于下限才为低电平

使用特权

评论回复
49
t60yz|  楼主 | 2023-11-21 16:12 | 只看该作者
1.3 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;

Stm32库里将8种模式定义为了枚举类型

GPIO_Mode_AIN:模拟输入模式(Analog Input Mode)。
GPIO_Mode_IN_FLOATING:浮空输入模式(Floating Input Mode)。
GPIO_Mode_IPD:下拉输入模式(Input Pull-down Mode)。
GPIO_Mode_IPU:上拉输入模式(Input Pull-up Mode)。
GPIO_Mode_Out_OD:开漏输出模式(Output Open-drain Mode)。
GPIO_Mode_Out_PP:推挽输出模式(Output Push-pull Mode)。
GPIO_Mode_AF_OD:复用开漏输出模式(Alternate Function Output Open-drain Mode)。
GPIO_Mode_AF_PP:复用推挽输出模式(Alternate Function Output Push-pull Mode)。

使用特权

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

使用特权

评论回复
51
t60yz|  楼主 | 2023-11-21 16:13 | 只看该作者
2.GPIO输出
2.1 可输出设备(LED、蜂鸣器...)
和51单片机一样,每个IO口都具有输出功能(高低电平)

因此可实现点亮LED,蜂鸣器报警等功能。

使用特权

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

使用特权

评论回复
53
t60yz|  楼主 | 2023-11-21 16:13 | 只看该作者
2.2Stm32中LED、蜂鸣器的电路

使用特权

评论回复
54
t60yz|  楼主 | 2023-11-21 16:13 | 只看该作者
2.3 面包板(结构)

使用特权

评论回复
55
t60yz|  楼主 | 2023-11-21 16:21 | 只看该作者
2.4 实现LED闪烁(含代码)
一定要先按照自己的思路和理解去写一遍,主要就是调用各种库函数。

下面代码需要注意的是:

GPIO_InitTypeDef A,B,C;  //定义三个IO的结构体变量 A是PA0口、B是PA1口、C是PA3口

这段代码如果在函数中间定义会报错,那么是由于你的Keil版本过低导致,按下图设置:

使用特权

评论回复
56
t60yz|  楼主 | 2023-11-21 16:22 | 只看该作者
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE );//使能GPIO时钟
       
        GPIO_InitTypeDef A,B,C;  //定义三个GPIO的结构体变量 A是GPIOA、B是GPIOB、C是GPIOC//这里理解也不对,因为ABC只在RCC那里使能打开,这里定义的只是变量名,只是一个中间媒介去实现传值

        A.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出模式
        A.GPIO_Pin=GPIO_Pin_0;  //设置为Pin0口
        A.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz
        GPIO_Init( GPIOA,&A); //以上三个都要传入该函数初始化
       
        B.GPIO_Mode=GPIO_Mode_Out_PP;
        B.GPIO_Pin=GPIO_Pin_1;
        B.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init( GPIOA,&B);
       
        C.GPIO_Mode=GPIO_Mode_Out_PP;
        C.GPIO_Pin=GPIO_Pin_2;
        C.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init( GPIOA,&C);
        while(1)
        {
                GPIO_ResetBits (GPIOA,GPIO_Pin_0);//先亮
                GPIO_ResetBits (GPIOA,GPIO_Pin_1);
                GPIO_ResetBits (GPIOA,GPIO_Pin_2);
                Delay_ms(500);
                GPIO_SetBits (GPIOA,GPIO_Pin_0);//再灭
                GPIO_SetBits (GPIOA,GPIO_Pin_1);
                GPIO_SetBits (GPIOA,GPIO_Pin_2);
                Delay_ms(500);
        }
}

使用特权

评论回复
57
t60yz|  楼主 | 2023-11-21 16:22 | 只看该作者
不知道你是否发现,其实代码里是定义了三个外设,每个外设又单独设置的IO,其实这种方法是不对的,也是初学时容易产生的误区,如何修改,看下面的代码。

使用特权

评论回复
58
t60yz|  楼主 | 2023-11-21 16:23 | 只看该作者
2.5 实现LED流水灯(含代码、理解)
初始化时是初始化一个外设,然后一个外设又有16个引脚。

上面的代码中 GPIO_InitTypeDef A,B,C;  //定义三个GPIO的结构体变量 A是GPIOA、B是GPIOB、C是GPIOC

这里理解也不对,因为ABC只在RCC寄存器那里使能打开,这里定义的只是变量名,只是一个中间媒介去实现传值

个人觉得这样定义可以实现一个外设例如GPIOA的16个引脚可以设置为不同的输出模式。

使用特权

评论回复
59
t60yz|  楼主 | 2023-11-21 16:23 | 只看该作者
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE );//使能GPIO时钟
       
        GPIO_InitTypeDef A;  //定义一个中间结构体变量

        A.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出模式
        A.GPIO_Pin=GPIO_Pin_All;  //设置所有的Pin口(PA0~PA15)
        A.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz
        GPIO_Init( GPIOA,&A); //以上三个都要传入该函数初始化
       
        while(1)
        {
                unsigned char i;
                for(i=0;i<8;i++)
                {
                        GPIO_Write(GPIOA ,~(0X0001<<i));//0000 0000 0000 0001依次左移8位 该函数可以整体写入GPIOx->ODR
                        Delay_ms(100);
                }
        }
}

使用特权

评论回复
60
t60yz|  楼主 | 2023-11-21 16:23 | 只看该作者
2.6 蜂鸣器(含代码)
配置原理和配LED是一样的
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE );//使能GPIO时钟
       
        GPIO_InitTypeDef A;

        A.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出模式
        A.GPIO_Pin=GPIO_Pin_12;  //设置为Pin0口
        A.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz
        GPIO_Init( GPIOB,&A); //以上三个都要传入该函数初始化
        while(1)
        {
                GPIO_ResetBits(GPIOB,GPIO_Pin_12);//低电平触发
                Delay_ms (100);
                GPIO_SetBits(GPIOB,GPIO_Pin_12);//不响
                Delay_ms (100);
        }
}

使用特权

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

本版积分规则