STM32学习笔记(一)从点灯开始之ST-LINK V2
文章目录
之前介绍了使用串口来下载程序,接下来,我们使用ST-LINK V2来开始我们的正式学习。
前言
在代码编写中,我将采取模块化编程的思想,带领大家一步步编写程序
1、ST-LINK V2的接线及Keil5的配置
2、开始点灯----函数介绍及代码实现
2.1、函数介绍
1、函数名: GPIO_WriteBit
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal)
2、函数名: GPIO_SetBits
void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
3、函数名: GPIO_ResetBits
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
2.2、代码实现
while (1)
{
//方法1:
GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)(1)); //输出高电平1
// GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)(0)); //输出低电平0
//方法2:
// GPIO_SetBits(GPIOC, GPIO_Pin_13); //输出高电平1
// GPIO_ResetBits(GPIOC, GPIO_Pin_13);//输出低电平0
}
3、让灯闪烁起来----使用延时函数
3.1、延时函数代码
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; //关闭定时器
}
3.2、根据微秒我们可以写出毫秒和秒
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
3.3、完整代码
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while (1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
Delay_us(500);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
Delay_us(500);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
Delay_ms(500);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
Delay_ms(500);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)0);
Delay_s(5);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)1);
Delay_s(5);
}
}
4、呼吸灯
4.1、原理介绍
原理:使用循环和延时函数,让LED亮灭交替。亮的时间占亮灭时间和的比值逐渐增加和减少,让人眼产生灯逐渐变亮和变暗,来达到手动PWM的目的。
4.2、代码展示----变亮循环
if(flag == 0){ //变亮循环
for(i = 0; i < 10; i++) //十个等级的亮度
{
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
delay_us(t); //延时
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
delay_us(501-t); //延时
}
t++;
if(t==500){ //等待0.5s后开始变暗
flag = 1;
}
}
变暗循环
if(flag== 1){ //变暗循环
for(i = 0; i < 10; i++)
{
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
delay_us(t); //延时
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
delay_us(501-t); //延时
}
t--;
if(t==1){
flag= 0;
}
}
5、结语
学习了以上知识,相信对点灯应该炉火纯青了,接下来我们将学习使用按键来控制LED灯。