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
while(1)
{
//初始状态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;
}
}
}