STMF1 HAL库 —— ② 点亮LED灯

一、材料准备
准备以下材料
在这里插入图片描述
二、工程配置设置
2.1、选择MCU
点击Start My project from McU
在这里插入图片描述
在搜索框中搜索STM32F103VE,然后在右下方选择后缀是Tx的(因为教程中使用的是STM32F103VET6的这款芯片,因此要选择相对应的)
在这里插入图片描述
选择完成之后,点击右上方的Start Project
在这里插入图片描述
2.2、引脚分配&外设配置
在 Pinout & Configuration 的 System Core 中,点击 RCC,把 HSE 、LSE设置为 Crystal/Ceramic Resonator(晶体或陶瓷谐振器)
在这里插入图片描述
设置成功后,相应的管脚(OSC_IN & OSC_OUT)会被自动配置;
在这里插入图片描述
在 System Core 中,点击 SYS,设置 Debug 模式为 JTAG(4 pins)(不设置的话,程序将可能下载但不能仿真调试)
在这里插入图片描述
接着通过查看原理图获知,LED14所对应的引脚为PE0PE3
(在此,我们简要讲解一下LED灯的基础知识,LED即发光二极管,当LED内有电流通过时会发光,在安全电流范围内,电流越大,亮度越亮,如下图所示我们可以看到,发光二极管的阴极与单片机引脚相连,发光二极管的阳极通过电阻与3.3伏的VCC相连。当单片机的引脚给高电平时,近似于发光二极管两端没有电势差,没有电流通过,因此发光二极管没有点亮,相反的如果单片机的引脚给低电平,发光二极管两端有电势差,有电流通过,发光二极管可以点亮。)
在这里插入图片描述
然后在软件右边MCU处,寻找PE0~PE3引脚,并逐个点击将其设置成GPIO_Output(输出模式)
在这里插入图片描述
然后在GPIO处,依次点击PE0~PE3引脚,在下方User Label处修改引脚的用户标签(相当于取另一个新名字)
在这里插入图片描述
GPIO output level:选择引脚初始化电平(高、低)
GPIO mode:选择模式
GPIO Pull-up/Pull-down:选择上下拉、既不上拉也不下拉
Maximum output speed:选择输出速度
User Label:修改引脚标签
我们逐个将其设置成下图所示的配置
在这里插入图片描述
2.3、时钟树配置
STM32F1的最高主频可达到72M,最后使HCLK = 72Mhz即可:
在这里插入图片描述
配置时,将会自动检测错误;若频率配置错误,将会红色高亮报错。
在这里插入图片描述
2.4、工程生成配置
如图所示,填写工程名字以及路径,同时IDE选择MDK-ARM
在这里插入图片描述
2.5、代码生成配置
如图所示,勾选相对应的框
在这里插入图片描述
2.6、生成代码
配置完成之后,点击右上角的蓝色按钮
在这里插入图片描述
生成完成之后,点击Open Project打开工程
在这里插入图片描述
三、运行代码
3.1、设备连接
如图所示,进行设备接线
在这里插入图片描述
3.2、查看代码
点击gpio.c文件
在这里插入图片描述
我们在此处可以看到我们刚刚进行的引脚初始化配置,即代表LED灯初始化成功
3.3、编译代码
点击左上角编译按钮
在这里插入图片描述
下方出现"lightupLED\lightupLED.axf" - 0 Error(s), 0 Warning(s).语句,即代表编译无误
在这里插入图片描述
3.4、下载代码
点击魔法棒
在这里插入图片描述
如图所示,进行选择
在这里插入图片描述
点击settings
在这里插入图片描述
如图所示,选择SW,并点击确定
在这里插入图片描述
点击左上角下载按钮,等待下载
在这里插入图片描述
出现Verify OK.语句,即代表下载成功
在这里插入图片描述
3.5、效果展示
下载完成之后,我们查看板子,会发现四个LED灯以及全部亮起(因为我们初始化时将初始电平设置成低电平,因此代码下载之后,LED灯就会全部亮起)
在这里插入图片描述
QQ群:

796415884

欢迎大家进群交流!

以下是基于 STM32F103 HAL 库的 OLED 显示屏 IIC 驱动代码,供参考: ```c #include "stm32f1xx_hal.h" #include "fonts.h" #define OLED_I2C_ADDR 0x78 // OLED I2C 地址 #define OLED_WIDTH 128 // OLED 宽度 #define OLED_HEIGHT 64 // OLED 高度 I2C_HandleTypeDef hi2c1; void OLED_Init(void) { uint8_t data[] = { 0xAE, // 关闭显示 0xD5, 0x80, // 设置时钟分频因子,震荡频率 0xA8, 0x3F, // 设置驱动路数 0xD3, 0x00, // 设置显示偏移 0x40, // 设置起始行 0x8D, 0x14, // 使能电荷泵 0x20, 0x00, // 水平寻址模式 0xA1, // 设置段重定向 0xC8, // 设置行重定向 0xDA, 0x12, // 设置 COM 硬件引脚配置 0x81, 0xCF, // 设置对比度 0xD9, 0xF1, // 设置预充电周期 0xDB, 0x40, // 设置 VCOMH 电压倍率 0xA4, // 全局显示开启 0xA6, // 设置显示方式,正常显示 0xAF // 开启显示 }; HAL_I2C_Mem_Write(&hi2c1, OLED_I2C_ADDR, 0x00, 1, data, sizeof(data), 1000); } void OLED_Clear(void) { uint8_t data[OLED_WIDTH * OLED_HEIGHT / 8] = {0}; HAL_I2C_Mem_Write(&hi2c1, OLED_I2C_ADDR, 0x40, 1, data, sizeof(data), 1000); } void OLED_SetPos(uint8_t x, uint8_t y) { uint8_t data[] = { 0x00 + x % 16, // 设置列低位地址 0x10 + x / 16, // 设置列高位地址 0xB0 + y, // 设置页地址 }; HAL_I2C_Mem_Write(&hi2c1, OLED_I2C_ADDR, 0x00, 1, data, sizeof(data), 1000); } void OLED_DrawPixel(uint8_t x, uint8_t y, uint8_t color) { OLED_SetPos(x, y); uint8_t data[] = {color}; HAL_I2C_Mem_Write(&hi2c1, OLED_I2C_ADDR, 0x40, 1, data, 1, 1000); } void OLED_DrawChar(uint8_t x, uint8_t y, uint8_t ch, uint8_t size, uint8_t color) { uint8_t i, j; uint8_t data[size * size]; for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { if (size == 12) { data[i * size + j] = pgm_read_byte(&font1206[(ch - 32) * 12 + i]) & (1 << (11 - j)) ? color : 0; } else { data[i * size + j] = pgm_read_byte(&font1608[(ch - 32) * 16 + i]) & (1 << (15 - j)) ? color : 0; } } } OLED_SetPos(x, y); HAL_I2C_Mem_Write(&hi2c1, OLED_I2C_ADDR, 0x40, 1, data, size * size, 1000); } void OLED_DrawString(uint8_t x, uint8_t y, char *str, uint8_t size, uint8_t color) { while (*str) { OLED_DrawChar(x, y, *str++, size, color); x += size / 2; } } int main(void) { HAL_Init(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_I2C1_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 400000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&hi2c1); OLED_Init(); OLED_Clear(); OLED_DrawString(0, 0, "Hello World!", 12, 1); while (1) { HAL_Delay(1000); } } ``` 需要注意的是,上述代码中使用了一个 `fonts.h` 文件,它包含了 OLED 显示屏所需的字体数据。可以根据需要更换字体文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值