尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

4.STM32 驱动 74HC138 译码器点亮 LED:寄存器配置与程序优化实战

4.STM32 驱动 74HC138 译码器点亮 LED:寄存器配置与程序优化实战 摘要本文以 STM32 驱动 74HC138 译码器点亮 LED 为例先结合原理图与真值表分析 3 输入 8 输出的译码逻辑再通过直接操作寄存器完成 RCC 时钟使能、PC3 输出配置与 E3 使能最终点亮 LED10。随后针对直接寄存器操作晦涩难懂的问题依次介绍宏定义、结构体与库函数三种程序优化方式重点讲解宏定义方式下 GPIOA_CRL 寄存器中 MODE 位与 CNF 位的设置/清除逻辑以及 PA0、PA1、PA4 推挽输出模式的配置方法。项目从0-1步骤看实物——明确自己的需求看原理图——1、高电平亮还是低电平亮 2、连到哪个引脚了——PC3看自己的芯片工作原理开启 RCC 时钟使能模式——输入和输出配置——配置为输出配置输出类型——推挽输出开漏输出配置输出速度——输出速度如何选择需要功耗低的场景并且数据传输速率不高——低速数据传输速度高时必须用高速输出数据总结——找地址 RCC 的地址——对应位写数据优化使用结构体封装好寄存器——声明结构体变量的方式定义地址一、利用74HC138译码器点亮LED1. 分析原理图3 输入 8 输出138-A、138-B、138-C 对应 PA0、PA1、PA42. 结合真值表来辅助判断 LED 亮灭3. 通过寄存器配置来点亮 LED代码实现RCC 使能*(volatile unsigned int *)0x40021018 |(14);//RCC时钟使能 CE3 使能//PC3输出模式 *(volatile unsigned int *)0x40011000 |(112); //PC3 *(volatile unsigned int *)0x40011000 ~(113);//MODE 01 //PC3推挽输出模式 *(volatile unsigned int *)0x40011000 |~(114); //PC3 *(volatile unsigned int *)0x40011000 ~(115);//CNF 01 *(volatile unsigned int *)0x4001100C |(13); // PC3置1 E3使能输出数据寄存器总结最终点亮 LED10。二、程序优化上述直接对寄存器操作的方法比较晦涩难懂。所以我们可以使用一些方法简化代码同时提高程序的可读性。方式1. 宏定义方式优化2. 结构体方式优化3. 库方式编写1. 宏定义方式优化代码实现//宏定义将GPIOA端口配置低寄存器CRL的地址0x40010800映射为宏GPIOA_CRL //CRL寄存器控制PA0~PA7共8个引脚每个引脚占用4位MODE[1:0] CNF[1:0] #define GPIOA_CRL *(volatile unsigned int *)0x40010800 // PA0 配置 //PA0输出模式设置MODE位为01输出模式最大速度10MHz GPIOA_CRL |(10); //置位bit0MODE0PA0的MODE[1:0] 01 GPIOA_CRL ~(11);//清零bit1MODE1确保MODE[1:0] 01 //PA0推挽输出模式设置CNF位为00通用推挽输出 GPIOA_CRL ~(12); //清零bit2CNF0CNF[1:0] 00 GPIOA_CRL ~(13);//清零bit3CNF1确保CNF[1:0] 00 // PA1 配置 //PA1输出模式PA1的4位配置位于bit4~bit7 GPIOA_CRL |(14); //置位bit4MODE0PA1的MODE[1:0] 01 GPIOA_CRL ~(15);//清零bit5MODE1确保MODE[1:0] 01 //PA1推挽输出模式 GPIOA_CRL ~(16); //清零bit6CNF0CNF[1:0] 00 GPIOA_CRL ~(17);//清零bit7CNF1确保CNF[1:0] 00 // PA4 配置 //PA4输出模式PA4的4位配置位于bit16~bit19 GPIOA_CRL |(116); //置位bit16MODE0PA4的MODE[1:0] 01 GPIOA_CRL ~(117);//清零bit17MODE1确保MODE[1:0] 01 //PA4推挽输出模式 GPIOA_CRL ~(118); //清零bit18CNF0CNF[1:0] 00 GPIOA_CRL ~(119);//清零bit19CNF1确保CNF[1:0] 002. 结构体方式优化代码实现typedef struct { volatile unsigned int CRL; /* 0x00 端口配置低寄存器Pin0~7 */ volatile unsigned int CRH; /* 0x04 端口配置高寄存器Pin8~15 */ volatile unsigned int IDR; /* 0x08 端口输入数据寄存器 */ volatile unsigned int ODR; /* 0x0C 端口输出数据寄存器 */ volatile unsigned int BSRR; /* 0x10 端口位设置/清除寄存器 */ volatile unsigned int BRR; /* 0x14 端口位清除寄存器 */ volatile unsigned int LCKR; /* 0x18 端口配置锁定寄存器 */ } GPIO_TypeDef;3.使用库HAL LL STD进行编程下一篇文章单开一个文档进行详解三、总结本文以 STM32 驱动 74HC138 译码器点亮 LED10 为主线完整走通了从硬件分析到软件实现再到代码优化的全过程核心步骤可概括为以下三个阶段原理图与真值表分析确认 138-A、138-B、138-C 分别对应 PA0、PA1、PA4结合 3 输入 8 输出的译码逻辑与真值表判断 LED 的亮灭条件。寄存器直接操作依次完成 RCC 时钟使能、PC3 输出模式与推挽输出配置、E3 使能最终通过输出数据寄存器点亮 LED10。程序优化针对直接操作寄存器晦涩难懂的问题依次引入宏定义、结构体与库函数三种方式在简化代码的同时提升可读性与可维护性。其中宏定义方式重点讲解了 GPIOA_CRL 寄存器中 MODE 位与 CNF 位的设置/清除逻辑以及 PA0、PA1、PA4 推挽输出模式的配置方法这也是理解 STM32 GPIO 底层配置的关键。四、参考资料STM32 参考手册Reference ManualGPIO 寄存器描述、RCC 时钟使能相关章节。74HC138 数据手册Datasheet3 线-8 线译码器真值表与引脚功能说明。STM32 标准外设库 / HAL 库 / LL 库官方文档GPIO 配置接口说明。五、下篇预告本文介绍的宏定义与结构体方式虽然已经比直接操作寄存器清晰不少但仍有大量底层细节需要开发者自行维护。下一篇文章将单开一个文档详细讲解如何使用库函数HAL、LL、STD进行编程借助官方封装好的接口进一步简化 GPIO 配置流程让代码更简洁、更易移植敬请期待。
返回列表