[STM32F1] stm32(F103c8t6)自学笔记

[复制链接]
5035|177
 楼主| t60yz 发表于 2023-11-21 16:11 | 显示全部楼层
3.工程架构 97287655c6615baf5b.png
 楼主| t60yz 发表于 2023-11-21 16:11 | 显示全部楼层
3.工程架构
 楼主| t60yz 发表于 2023-11-21 16:11 | 显示全部楼层
4.步骤回顾、总结
26656655c6624acbf0.png
 楼主| t60yz 发表于 2023-11-21 16:11 | 显示全部楼层
三、GPIO(外设)
1.GPIO结构及原理
1.1 介绍
65169655c66344d6ae.png
 楼主| t60yz 发表于 2023-11-21 16:11 | 显示全部楼层
1.2 结构
简单来说,GPIO是受RCC寄存器 控制的APB2总线上的一系列外设IO口。

这些IO口由 GPIO A~GPIO E ,而单个GPIO如GPIOC都是又下分为16个小IO口(引脚),其中驱动器是为了增加引脚电平驱动能力 59201655c6644384d0.png
 楼主| t60yz 发表于 2023-11-21 16:12 | 显示全部楼层
单个外设口如GPIOC的内部电路结构如下:

        下图中的肖特基触发器是文献翻译错误,实际应为施密特触发器。
 楼主| t60yz 发表于 2023-11-21 16:12 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-21 16:12 | 显示全部楼层
施密特触发器原理:

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

94955655c66681d89b.png
 楼主| 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)。
 楼主| t60yz 发表于 2023-11-21 16:12 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-21 16:13 | 显示全部楼层
2.GPIO输出
2.1 可输出设备(LED、蜂鸣器...)
和51单片机一样,每个IO口都具有输出功能(高低电平)

因此可实现点亮LED,蜂鸣器报警等功能。
 楼主| t60yz 发表于 2023-11-21 16:13 | 显示全部楼层
 楼主| t60yz 发表于 2023-11-21 16:13 | 显示全部楼层
2.2Stm32中LED、蜂鸣器的电路 44767655c66a20619f.png
 楼主| t60yz 发表于 2023-11-21 16:13 | 显示全部楼层
2.3 面包板(结构) 76487655c66b15ba78.png
 楼主| t60yz 发表于 2023-11-21 16:21 | 显示全部楼层
2.4 实现LED闪烁(含代码)
一定要先按照自己的思路和理解去写一遍,主要就是调用各种库函数。

下面代码需要注意的是:

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

这段代码如果在函数中间定义会报错,那么是由于你的Keil版本过低导致,按下图设置: 36527655c68a229410.png
 楼主| 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);
        }
}
 楼主| t60yz 发表于 2023-11-21 16:22 | 显示全部楼层
不知道你是否发现,其实代码里是定义了三个外设,每个外设又单独设置的IO,其实这种方法是不对的,也是初学时容易产生的误区,如何修改,看下面的代码。
 楼主| 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个引脚可以设置为不同的输出模式。
 楼主| t60yz 发表于 2023-11-21 16:23 | 显示全部楼层
  1. #include "stm32f10x.h"                  // Device header
  2. #include "Delay.h"
  3. int main(void)
  4. {
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE );//使能GPIO时钟
  6.        
  7.         GPIO_InitTypeDef A;  //定义一个中间结构体变量

  8.         A.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出模式
  9.         A.GPIO_Pin=GPIO_Pin_All;  //设置所有的Pin口(PA0~PA15)
  10.         A.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz
  11.         GPIO_Init( GPIOA,&A); //以上三个都要传入该函数初始化
  12.        
  13.         while(1)
  14.         {
  15.                 unsigned char i;
  16.                 for(i=0;i<8;i++)
  17.                 {
  18.                         GPIO_Write(GPIOA ,~(0X0001<<i));//0000 0000 0000 0001依次左移8位 该函数可以整体写入GPIOx->ODR
  19.                         Delay_ms(100);
  20.                 }
  21.         }
  22. }
 楼主| t60yz 发表于 2023-11-21 16:23 | 显示全部楼层
2.6 蜂鸣器(含代码)
配置原理和配LED是一样的
  1. #include "stm32f10x.h"                  // Device header
  2. #include "Delay.h"
  3. int main(void)
  4. {
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE );//使能GPIO时钟
  6.        
  7.         GPIO_InitTypeDef A;

  8.         A.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出模式
  9.         A.GPIO_Pin=GPIO_Pin_12;  //设置为Pin0口
  10.         A.GPIO_Speed=GPIO_Speed_50MHz;  //输出速度为50MHz
  11.         GPIO_Init( GPIOB,&A); //以上三个都要传入该函数初始化
  12.         while(1)
  13.         {
  14.                 GPIO_ResetBits(GPIOB,GPIO_Pin_12);//低电平触发
  15.                 Delay_ms (100);
  16.                 GPIO_SetBits(GPIOB,GPIO_Pin_12);//不响
  17.                 Delay_ms (100);
  18.         }
  19. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部