首页 > 其他分享 >STM32MP157AAA开发板通过GPIO模拟SPI驱动通信控制数码管

STM32MP157AAA开发板通过GPIO模拟SPI驱动通信控制数码管

时间:2025-01-09 21:02:13浏览次数:3  
标签:STM32MP157AAA M74HC595 开发板 数码管 m74hc595 0X1ODR MATH define

实验目标:

硬件:STM32MP157AAA开发板+拓展板

管脚:拓展板上数码管(M74HC595),由下图可知,数码管通过SPI与核心板通信,时钟(S)CK对应PE12、主机输出从机输入(MOSI)对应PE14、主机输入从机输出(MISO)对应PE13、从设备选择(CSN)对应PE11,由于当前电路SPI只有一个从设备,因此在硬件层面上将PE11常置为低电平,表示SPI主机连接此数码管。

图一
图二

下图为数码管(M74HC595)的pin脚连接及说明、逻辑符号:

图三
图四

下图为数码管(M74HC595)的SPI收发逻辑,由图可知,该数码管存在串口输入(SERIAL IN)/输出口(SERIAL OUT)、时钟(SCK)、移位寄存器输入清空(SCLR)、锁存器输入使能(RCK)、移位寄存器(SHIFT REGISTER)、锁存器(STORAGE REGISTER)

图二可知,拓展板使用了两个数码管(M74HC595)芯片来进行数码管控制,由于STM32MP157AAA只给一个数码管(M74HC595)发送SPI数据,主机需要给该数码管发送两组数据,第一组数据经过芯片1,由芯片1再发送给芯片2,表示芯片的位(表示几个数码管,由图二可知有4个数码管),第二组数据在芯片1中处理,表示芯片的段(表示数码管有几个发光二极管组成,由图二可知由8个发光二极管)。

图五

通过图六可知芯片各管脚在不同状态下的操作代表的意义,了解即可:

 梳理:

在数码管(M74HC595)芯片中的移位寄存器(SHIFT REGISTER)处理数据是从低位开始,所以需要以低位在前高位在后的方式发送,如第一组控制位的数据,需要控制数码管第一位使能,字节应当是0B10000000,反转后实际是0B00000001=0X1。

#ifndef _M74HC595_H_
#define _M74HC595_H_

#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "delay.h"

#define FIRST_M74HC 0X1    //第一个灯亮
#define SECOND_M74HC 0X2    //第二个灯亮
#define THIRD_M74HC 0X4    //第三个灯亮
#define FORTH_M74HC 0X8    //第四个灯亮
#define ALL_M74HC 0XF    //全部灯亮

#define MATH_0 0X3F
#define MATH_1 0X06
#define MATH_2 0X5B
#define MATH_3 0X4F
#define MATH_4 0X66
#define MATH_5 0X6D
#define MATH_6 0X7D
#define MATH_7 0X07
#define MATH_8 0X7F
#define MATH_9 0X6F


void m75hc595_init();   //初始化m75hc595
void m74hc595_write_byte(unsigned char m74hc_posi, unsigned char m74hc_date);   //写入两组数据,第一个表示位,第二个表示段
void m74hc595_write_byte1(unsigned char m74hc_posi);    //写入一组数据,分两次写入,第一次写入位,第二次写入段

#endif

初始化m74hc595主要配置GPIO输入输出模式和各寄存器,m74hc595_write_byte发送两组数据:

#include "m74hc595.h"

void m75hc595_init()
{
    //使能GPIO外设时钟
    RCC->MP_AHB4ENSETR |= (0X1<<4);

    //PE11设置为输出    NSS
    GPIOE->MODER &= (~(0X3<<22));
    GPIOE->MODER |= (0X1<<22);
    GPIOE->OTYPER &= (~(0X1<<11));
    GPIOE->PUPDR &= (~(0x3<<22));
    GPIOE->OSPEEDR &= (~(0x3<<22));  
    //PE12设置为输出    SCK
    GPIOE->MODER &= (~(0X3<<24));
    GPIOE->MODER |= (0X1<<24);
    GPIOE->OTYPER &= (~(0X1<<12));
    GPIOE->PUPDR &= (~(0x3<<24));
    GPIOE->OSPEEDR &= (~(0x3<<24));  
    //PE13设置为输入    MISO
    GPIOE->MODER &= (~(0X3<<26));
    //PE14数值为输出    MOSI
    GPIOE->MODER &= (~(0X3<<28));
    GPIOE->MODER |= (0X1<<28);
    GPIOE->OTYPER &= (~(0X1<<14));
    GPIOE->PUPDR &= (~(0x3<<28));
    GPIOE->OSPEEDR &= (~(0x3<<28));  

    //PE11输出低电平
    GPIOE->ODR &= (~(0X1<<11));

    //PE12输出低电平
    GPIOE->ODR &= (~(0X1<<12));
}


void m74hc595_write_byte1(unsigned char date)
{
    //
    int i;
    for(i = 0; i < 8; i++)
    {
        //输出高位8bit,再发送地位
        if (date & 0x80)    //  最高位为高
        {
            //PE14输出高电平
            GPIOE->ODR |= (0X1<<14);
        }
        else
        {
            //PE14输出低电平
            GPIOE->ODR &= (~(0X1<<14));
        }
        //PE12输出低电平
        GPIOE->ODR &= (~(0X1<<12));
        //延时等待稳定
        delay(10);
        //PE12输出高电平
        GPIOE->ODR |= (0X1<<12);

        date <<= 1;//左移1位,读下一个bit数据
    }
}

void m74hc595_write_byte(unsigned char m74hc_posi, unsigned char m74hc_date)
{
    //
    int i;
    for(i = 0; i < 8; i++)
    {
        //输出高位8bit,再发送地位
        if (m74hc_posi & 0x80)    //  最高位为高
        {
            //PE14输出高电平
            GPIOE->ODR |= (0X1<<14);
        }
        else
        {
            //PE14输出低电平
            GPIOE->ODR &= (~(0X1<<14));
        }
        //PE12输出低电平
        GPIOE->ODR &= (~(0X1<<12));
        //延时等待稳定
        delay(10);
        //PE12输出高电平
        GPIOE->ODR |= (0X1<<12);

        m74hc_posi <<= 1;//左移1位,读下一个bit数据
    }

    for(i = 0; i < 8; i++)
    {
        //输出高位8bit,再发送地位
        if (m74hc_date & 0x80)    //  最高位为高
        {
            //PE14输出高电平
            GPIOE->ODR |= (0X1<<14);
        }
        else
        {
            //PE14输出低电平
            GPIOE->ODR &= (~(0X1<<14));
        }
        //PE12输出低电平
        GPIOE->ODR &= (~(0X1<<12));
        //延时等待稳定
        delay(10);
        //PE12输出高电平
        GPIOE->ODR |= (0X1<<12);

        m74hc_date <<= 1;//左移1位,读下一个bit数据
    }
}

简单调用配置第一个数码管显示数字5:

#include "m74hc595.h"
int main()
{
	m75hc595_init();

	while(1)
	{
			m74hc595_write_byte(FIRST_M74HC, MATH_5);

			//PE11输出低电平
			GPIOE->ODR &= (~(0X1<<11));
			//延时
			delay(10);

			//PE11输出高电平
			GPIOE->ODR |= (0X1<<11);
			delay_ms(1000);		
	}

	return 0;
}

标签:STM32MP157AAA,M74HC595,开发板,数码管,m74hc595,0X1ODR,MATH,define
From: https://blog.csdn.net/weixin_72755055/article/details/145041251

相关文章

  • 【WCH蓝牙系列芯片】-基于CH592开发板—BLE_USB程序中低功耗模式下,USB设备的拔插唤醒
    -------------------------------------------------------------------------------------------------------------------------------------在CH592EVT例程中,有一个BLE_USB程序,是蓝牙与USB合用例程,通过USB模拟340设备转发蓝牙数据。在正常使用中,蓝牙和USB设备都可以一起运......
  • 51单片机--动态数码管显示
    点击查看代码/*动态数码管显示(数码管扫描) xff 2025/1/7 扫描方式:单片机直接扫描*/#include<REGX52.H>#include"Delay.h"voidNixieDisplay(unsignedintloc,num);voidmain(){ while(1) { NixieDisplay(1,1); NixieDisplay(2,2); Nix......
  • Linux系统更换开机logo方法教程,触觉智能RK3562开发板演示
    本文介绍Linux系统更换开机logo方法教程,通用RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必......
  • ESP32-S3-N16R8在platformio中的开发板设置
    前言platformio现有的板子库里面没有ESP32-S3-N16R8(8MBPSRAM+16MBFLASH)的开发板模型,直接强行套用,要么就是解锁不了8MBPSRAM,要么就下载后运行不起来。 一、选用esp32-s3-devkitc-1开发板先选用esp32-s3-devkitc-1作为开发板模型,点击Finish后务必耐心等待。二、下载完毕......
  • 【迅为】一图了解OpenHarmony4.1开发资料,快速上手RK3568开发板+鸿蒙系统新玩法
    【迅为】一图了解OpenHarmony4.1开发资料,快速上手RK3568开发板+鸿蒙系统新玩法  什么是OpenHarmonyOpenHarmony是一款面向全场景的开源分布式操作系统,隶属于开放原子开源基金会。它基于传统单设备系统能力,创新性地支持多种终端形态,旨在为不同设备提供统一的操作系统底座,从而......
  • OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示
    本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程,触觉智能PurplePiOH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。编译源码后镜像路径编译完OpenHarmony源码后,会在以下路径,生成散......
  • 北京迅为iTOP-RK3576开发板新品上市
    北京迅为iTOP-RK3576开发板新品上市迅为iTOP-RK3576开发板是一款高性能、低功耗的应用处理平台,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。瑞芯微RK3576功能框图,如下图所示:     迅为iTOP-RK3576开发板内置多种强大的嵌入式硬件引擎,......
  • 瑞芯微开发板/主板Android系统APK签名文件使用方法,实用干货
    本文介绍瑞芯微开发板/主板Android系统APK签名文件使用方法,触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,各类接口一应俱全,帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。系统签名文件生成APK系统签名文件,具体可参考此文章方法https://www.cnblogs.com/industi......
  • 5G CPE 主控CPU(上位机) 数据转发性能评估--基于5G模组和NEO3开发板评估
    5GCPEARM主控CPU数据转发性能评估--基于5G模组和NEO3开发板评估摘要NEO3介绍演示架构网络拓扑硬件连接固件及驱动NEO固件NEO3串口驱动拔号及网络配置配置AT接口拔号NEO3网络接口性能测试5G空口性能NEO千兆网口性能验证NEO3高速接口数......
  • 可调整提亮度8级/数码管显示屏驱动-VK1638 SOP28点阵LED数码管驱动芯片(ic)
    产品品牌:永嘉微电/VINKA产品型号:VK1638封装形式:SOP28概述VK1638是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED驱动、键盘扫描等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持10SEGx8GRID的点阵LED显示面板,最大支持8x3按键......