stm32学习日志(第一周)
(本文谨作为个人首次试手,问题很多,后续有时间会重新修改)
2023年9月12日
1、STLINK驱动器下载
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、一些说明
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语言常用知识:
2、按键控制LED
按键电路:常用下接法(上拉电阻)
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%;”>