stm32学习日志

stm32学习日志(第一周)

(本文谨作为个人首次试手,问题很多,后续有时间会重新修改)

2023年9月12日
1、STLINK驱动器下载

[2-1] 软件安装_哔哩哔哩_bilibili

2、新建工程

Start: 启动文件,不能修改

User: main函数放置位置

3、代码输入

main(void)

最后一行必须为空行,不然有警告

4、寄存器操作点灯
int main(void)
{
	RCC->APB2ENR = 0X00000010;
    GPIOC->CRH = 0X00300000;
    GPIOC->ODR = 0X00000000;
    while(1)
    {
        
    }
}

效果图:

2023年9月14日
1、库函数工程点灯

出现一个问题,库函数不存在 至凌晨1.30无法解决,sleep

2023年9月15日
1、解决14日问题

重新删掉文件照着步骤进行一次,但无法自动弹出函数

解决方法:

[keil5如何开启代码自动补全及如何加快编译速度_keil5代码自动补全_学工科的皮皮志_的博客-CSDN博客](https://blog.csdn.net/qq_45138815/article/details/117465568?ops_request_misc=%7B%22request%5Fid%22%3A%22169478533516800213031162%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fall.%22%7D&request_id=169478533516800213031162&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-6-117465568-null-null.142v94insert_down1&utm_term=keil5 32打函数时没有自动弹出是什么原因&spm=1018.2226.3001.4187)

2、库函数点灯代码

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);
	GPIO_SetBits(GPIOC, GPIO_Pin_13);  //灯亮
//	GPIO_ResetBits(GPIOC, GPIO_Pin_13); 灯灭

	while (1)
	{	
        
	}
}

3、一些说明
image-20230917234410248
2023年9月16日
1、(3-1)GPIO小节学习

相关电路、LED、蜂鸣器、面包板等介绍

2、LED闪烁
#include "stm32f10x.h"                  // Device header
#include "Delay.h"     

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
	
	GPIO_InitTypeDef GPIO_Innitstructure;
	GPIO_Innitstructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出模式
	GPIO_Innitstructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_Innitstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_Innitstructure);    //用结构体的参数来初始化GPIO口
	
	//GPIO_ResetBits(GPIOA, GPIO_Pin_0);  //点亮LED
	//GPIO_SetBits(GPIOA, GPIO_Pin_0);  //熄灭LED
	//GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_RESET);  //熄灭LED
	//GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_SET);  //点亮LED
	
	while (1)
	{
		GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_SET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_RESET);  
		Delay_ms(500);
	}
}

效果:

<video src="D:/桌面/32效果图/d4b4dff76b7df6aae4b6f3006231f903.mp4"style=“zoom:35%;” />

3、LED流水灯
#include "stm32f10x.h"                  // Device header
#include "Delay.h"     

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
	
	GPIO_InitTypeDef GPIO_Innitstructure;
	GPIO_Innitstructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Innitstructure.GPIO_Pin = GPIO_Pin_All; //用或选的话是根据地址的相或,1的部分点亮的原理
	GPIO_Innitstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_Innitstructure);    //用结构体的参数来初始化GPIO口
	
	//GPIO_ResetBits(GPIOA, GPIO_Pin_0);  //点亮LED
	//GPIO_SetBits(GPIOA, GPIO_Pin_0);  //熄灭LED
	//GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_RESET);  //熄灭LED
	//GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_SET);  //点亮LED
	
	while (1)
	{
		GPIO_Write(GPIOA, ~0x0001); //低电平点亮,按位取反
		Delay_ms(500);
		GPIO_Write(GPIOA, ~0x0002); //低电平点亮,按位取反
		Delay_ms(500);
		GPIO_Write(GPIOA, ~0x0004); //低电平点亮,按位取反
		Delay_ms(500);
		GPIO_Write(GPIOA, ~0x0008); //低电平点亮,按位取反
		Delay_ms(500);
		GPIO_Write(GPIOA, ~0x0010); //低电平点亮,按位取反
		Delay_ms(500);
		GPIO_Write(GPIOA, ~0x0020); //低电平点亮,按位取反
		Delay_ms(500);
		GPIO_Write(GPIOA, ~0x0040); //低电平点亮,按位取反
		Delay_ms(500);
		GPIO_Write(GPIOA, ~0x0080); //低电平点亮,按位取反
		Delay_ms(500);
	}
}

效果:

4、蜂鸣器
#include "stm32f10x.h"                  // Device header
#include "Delay.h"     

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
	
	GPIO_InitTypeDef GPIO_Innitstructure;
	GPIO_Innitstructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Innitstructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_Innitstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_Innitstructure);    //用结构体的参数来初始化GPIO口
	

	while (1)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(100);
		GPIO_SetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(100);
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(100);
		GPIO_SetBits(GPIOB, GPIO_Pin_12);
		Delay_ms(700);
	}
}

5、使用库函数方法

no.1 先打开.h文件的最后,看一下有哪些函数,右键转到定义,查看用法

no.2 打开提供资料中的库函数用户使用手册

2023年9月17日
1、(3-3) GPIO输入的学习

C语言常用知识:

0d34a1a0ba5706a4536e19d39667990 image-20230917214952288 image-20230917215006688
2、按键控制LED

按键电路:常用下接法(上拉电阻)

image-20230917220335426
NO.1 LED模块化编程管理:
//LED.h文件

#ifndef __LED_H
#define __LED_H

void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED_Init(void);
void LED1_Turn(void);
void LED2_Turn(void);

#endif 

//LED.c文件

#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);  //置1,无操作时,LED不亮
}
 void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

void LED1_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}

void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void LED2_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}

LED闪烁主函数代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"     
#include "LED.h"

int main(void)
{

	LED_Init();

	while (1)
	{
		LED1_ON();
		Delay_ms(500);
		LED1_OFF();
		Delay_ms(500);
		
		LED2_ON();
		Delay_ms(500);
		LED2_OFF();
		Delay_ms(500);
	}
}

效果:

<video src="D:/桌面/32效果图/2b92d859c7adf6bf14faa2b95d24690a.mp4"style=“zoom:35%;”>

N0.2 按键模块化编程管理:
//KEY.c文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //此为输出转态的速度,输入时没用到
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyNum = 1;
		}  //判断输入端口按键1是否按下,按下为低电平,按一次松开后返回1
	
	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	return KeyNum;
}
//LED.h文件
#ifndef __KEY_H
#define __KEY_H

void Key_Init(void);
uint8_t Key_GetNum(void);

#endif

按键控制灯主函数代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"     
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;

int main(void)
{

	LED_Init();
	Key_Init();
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if(KeyNum == 1)
		{
			LED1_Turn();
			}  //接受到按键1按下的信号后,将判断LED1的状态并反转,初始为高电平熄灭,第一次按动反转为亮
		
		if(KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}

效果:

<video src="D:/桌面/32效果图/06da850fd144d45e32129782a1eef7c6.mp4"style=“zoom:35%;”>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值