2019-12-25 STM32F103C8T6学习过程

STM32F103C8T6学习过程

一、了解:
(1)单片机型号STM32F103C8T6;
(2)编译软件:MDK5.41(开发环境)
(3)编程器:ST-LiNK;
(4)流程(焊电路板-装开发环境-调试)

二、安装软件Keil uVision5并破解;
注意:执行以下操作时需参考文档STM32软件开发指南;
(1)先执行安装mdk514安装包;
(2)再执行安装Keil.STM32F1xx_DFP.2.2.0安装包;
(3)安装完毕后打开Keil uVision5;
(4)接下来使用破解器keygen(具体破解操作参考文档STM32软件开发指南);
(5)破解完毕后找段源程序进行运行进行检验;

三、使用Keil uVision5编译程序使STM32F103C8T6上的LED灯亮;
了解:(1)引脚Pin;
(2)时钟AFIO;
(3)设置高低电频ResetBits(低)SetBits(高);
C语言源代码例子:

int main(void)
{
//定义一个变量,用来做参数设置。
GPIO_InitTypeDef GPIO_InitStructure;

//打开了端口B的总开关。
RCC_APB2PeriphClockCmd(
      RCC_APB2Periph_GPIOB ,
      ENABLE);

//打开AFIO时钟。为了能让引脚这个外部设备能够工作。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

//打开了PB5引脚,同时也开启了相对应的LED灯端口。      
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);

//while循环使while语句内的程序不断执行。
while(1)
{
 int delay1=0x7FF;
 int delay2=0xFF;
//设置PB5为高电平,使相对应的LED灯亮。
GPIO_SetBits(GPIOB,GPIO_Pin_5);
 //做一段延迟
 while(delay1--)
  {
   delay2=0xFF;
   while(delay2--);
  };
    delay1=0x7FF;
//设置PB5为低电平,使相对应的LED灯灭。
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
//再做一段延迟
 while(delay1--)
  {
   delay2=0xFF;
   while(delay2--);
  };
    delay1=0x7FF;
};
return 0;
}
(注:运行此代码发生LED灯会闪烁。)

四、控制开关按钮使得LED灯亮;
(1)按钮的设置:
用C语言;
开关的上拉模式:
开关闭合为低电频0,开关断开为高电频1;
(2)状态机的处理方法:
状态迁移;(设一个变量存储状态)
状态处理;
C语言源程序例子:

   int main(void)
   {
      int delay1=0x7FF;
      int delay2=0xFF;
      int sum=0;
      //设一个变量存储状态。
      int staute;
      //定义一个变量,用来做参数设置。
      GPIO_InitTypeDef GPIO_InitStructure;
      //打开了端口B和端口A的总开关。
      RCC_APB2PeriphClockCmd(
           RCC_APB2Periph_GPIOB ,
           ENABLE);
      RCC_APB2PeriphClockCmd(
           RCC_APB2Periph_GPIOA ,
           ENABLE);
      //打开打开AFIO时钟。为了能让引脚这个外部设备能够工作。
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  //关闭JTAG-DP(STM32的调试接口)打开SW-DP(编程接口)
      GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
      //打开所有的LED灯口;
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOA, &GPIO_InitStructure);

//打开所有的开关引脚。
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);//KEY1
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY2
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY5
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY3
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY4

while1)
{
    //初始状态LED灯为全关。
   GPIO_ResetBits(GPIOA,GPIO_Pin_15);
   GPIO_ResetBits(GPIOB,GPIO_Pin_3);
   GPIO_ResetBits(GPIOB,GPIO_Pin_4);
   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
   GPIO_ResetBits(GPIOB,GPIO_Pin_6);
   GPIO_ResetBits(GPIOB,GPIO_Pin_7);
   GPIO_ResetBits(GPIOB,GPIO_Pin_8);
   GPIO_ResetBits(GPIOB,GPIO_Pin_9);
   //对每一个按钮进行扫描,并将初始状态数字化;
   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0)
  {
   staute=0;
  } 
  
  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==0)
  {
   staute=1;
  }
  
  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==0)
  {
   staute=2;
  }
  
  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)
  {
   staute=3;
  }
  
  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==0)
  {
   staute=4;
  }
  //对每一种状态分别进行处理;
  if(staute= =0)
  {
    GPIO_ResetBits(GPIOA,GPIO_Pin_15);
    GPIO_ResetBits(GPIOB,GPIO_Pin_3);
   GPIO_ResetBits(GPIOB,GPIO_Pin_4);
   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
   GPIO_ResetBits(GPIOB,GPIO_Pin_6);
   GPIO_ResetBits(GPIOB,GPIO_Pin_7);
   GPIO_ResetBits(GPIOB,GPIO_Pin_8);
   GPIO_ResetBits(GPIOB,GPIO_Pin_9); 
  }//LED灯全关。
  
  if(staute==1)
  {
    GPIO_SetBits(GPIOA,GPIO_Pin_15);
    GPIO_SetBits(GPIOB,GPIO_Pin_3);
   GPIO_SetBits(GPIOB,GPIO_Pin_4);
   GPIO_SetBits(GPIOB,GPIO_Pin_5);
   GPIO_SetBits(GPIOB,GPIO_Pin_6);
   GPIO_SetBits(GPIOB,GPIO_Pin_7);
   GPIO_SetBits(GPIOB,GPIO_Pin_8);
   GPIO_SetBits(GPIOB,GPIO_Pin_9);
  }//LED灯全开。
  
  //使LED灯依次亮起。
  if(staute==2)
  {
   if(sum>=0&&sum<10000)
   {
   GPIO_SetBits(GPIOA,GPIO_Pin_15);
   }
   
   if(sum>=10000&&sum<20000)
   {
   GPIO_SetBits(GPIOB,GPIO_Pin_3);
   }
   
   if(sum>=20000&&sum<30000)
   {
   GPIO_SetBits(GPIOB,GPIO_Pin_4);
   }
   
   if(sum>=30000&&sum<40000)
   {
   GPIO_SetBits(GPIOB,GPIO_Pin_5);
   }
   
   if(sum>=40000&&sum<50000)
   {
   GPIO_SetBits(GPIOB,GPIO_Pin_6);
   }
   
   if(sum>=50000&&sum<60000)
   {
   GPIO_SetBits(GPIOB,GPIO_Pin_7);
   }
   
   if(sum>=60000&&sum<70000)
   {
   GPIO_SetBits(GPIOB,GPIO_Pin_8);
   }
   
   if(sum>=70000&&sum<80000)
   {
   GPIO_SetBits(GPIOB,GPIO_Pin_9);
   }
  }
  sum++;
  if(sum>=80000)
  {
   sum=0;
  }
  
  //使LED灯全部同时闪烁
  if(staute==3)
  {
    GPIO_SetBits(GPIOA,GPIO_Pin_15);
    GPIO_SetBits(GPIOB,GPIO_Pin_3);
    GPIO_SetBits(GPIOB,GPIO_Pin_4);
    GPIO_SetBits(GPIOB,GPIO_Pin_5);
   GPIO_SetBits(GPIOB,GPIO_Pin_6);
   GPIO_SetBits(GPIOB,GPIO_Pin_7);
   GPIO_SetBits(GPIOB,GPIO_Pin_8);
   GPIO_SetBits(GPIOB,GPIO_Pin_9);
   while(delay1--)
  {
   delay2=0xFF;
   while(delay2--);
  };
    delay1=0x7FF;
  GPIO_ResetBits(GPIOA,GPIO_Pin_15);
  GPIO_ResetBits(GPIOB,GPIO_Pin_3);
  GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  GPIO_ResetBits(GPIOB,GPIO_Pin_6);
  GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  GPIO_ResetBits(GPIOB,GPIO_Pin_9);
   while(delay1--)
  {
   delay2=0xFF;
   while(delay2--);
  };
    delay1=0x7FF;
 }
  
  //使LED灯分两部分同时闪烁
 if(staute==4)
 {
   GPIO_SetBits(GPIOB,GPIO_Pin_3);
    GPIO_SetBits(GPIOB,GPIO_Pin_7);
    GPIO_SetBits(GPIOB,GPIO_Pin_5);
   GPIO_SetBits(GPIOB,GPIO_Pin_9);
   while(delay1--)
  {
   delay2=0xFF;
   while(delay2--);
  };
    delay1=0x7FF;
   GPIO_ResetBits(GPIOB,GPIO_Pin_3);
  GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  GPIO_ResetBits(GPIOB,GPIO_Pin_9);
    while(delay1--)
  {
   delay2=0xFF;
   while(delay2--);
  };
    delay1=0x7FF;
   GPIO_SetBits(GPIOB,GPIO_Pin_4);
    GPIO_SetBits(GPIOB,GPIO_Pin_8);
   GPIO_SetBits(GPIOB,GPIO_Pin_6);
    GPIO_SetBits(GPIOA,GPIO_Pin_15);
  while(delay1--)
  {
   delay2=0xFF;
   while(delay2--);
  };
    delay1=0x7FF;
  GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  GPIO_ResetBits(GPIOB,GPIO_Pin_6);
  GPIO_ResetBits(GPIOA,GPIO_Pin_15);
  while(delay1--)
  {
   delay2=0xFF;
   while(delay2--);
  };
    delay1=0x7FF;
 }
}
    }
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值