ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)

这篇具有很好参考价值的文章主要介绍了ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.目标:

        a.数码管显示相同的值 0000 1111 ......9999;
        b.数码管显示不同的值 1234;

2.分析m74hc595芯片内部框图;

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示),ARM,arm开发,stm32,嵌入式硬件,c语言

 真值表:

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示),ARM,arm开发,stm32,嵌入式硬件,c语言

3.代码;

---spi.h头文件---
#ifndef __SPI_H__
#define __SPI_H__

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

// MOSI对应的引脚输出高低电平的信号
#define  MOSI_OUTPUT_H()	do{GPIOE->ODR |= (0x1 << 14);}while(0)
#define  MOSI_OUTPUT_L()    do{GPIOE->ODR &= (~(0x1 << 14));}while(0)

// 对应595芯片的锁存引脚输出高低电平
#define  NSS_OUTPUT_H()	    do{GPIOE->ODR |= (0x1 << 11);}while(0)
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)
	
// 时钟信号对应的引脚输出高低电平
#define  SCK_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 12);}while(0)
#define  SCK_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 12));}while(0)

/*
 * 函数功能: SPI初始化函数,推挽输出,高速,禁止上拉和下拉
 * 函数参数:无
 * 函数返回值:无
*/
void SPI_init(void);
/*
 * 函数功能:SPI发送数据的函数
 * 函数参数:dat : 要发送的数据
 * 函数返回值:无
 *
*/
void SPI_write(unsigned char dat);


#endif  // __SPI_H__
---spi.c函数文件---
#include "spi.h"
/* SPI4_NSS 	---->   PE11
 * SPI4_SCK     ---->   PE12
 * SPI4_MOSI    ---->   PE14
 * SPI4_MISO    ---->   PE13
 * */

/* 数码管的编码, 先发送低位,在发送高位
 * A B C D E F G DP
 * 1 1 1 1 1 1 0 0    0xFC   0
 * 0 1 1 0 0 0 0 0    0x60   1
 * 1 1 0 1 1 0 1 0    0xDA   2
 * 1 1 1 1 0 0 1 0    0xF2   3
 * 0 1 1 0 0 1 1 0    0x66   4
 * 1 0 1 1 0 1 1 0    0xB6   5 
 * 1 0 1 1 1 1 1 0    0xBE   6
 * 1 1 1 0 0 0 0 0    0xE0   7
 * 1 1 1 1 1 1 1 0    0xFE   8
 * 1 1 1 1 0 1 1 0    0xF6   9
 * */
void delay_us1(unsigned int us)
{
	int i,j;
	for(i = 0; i < us;i++)
		for (j = 0; j < 1;j++);
}

void SPI_init(void)
{
	RCC->MP_AHB4ENSETR |= (0x1 << 4);
	// MOSI    PE14 
	GPIOE->MODER &= (~(0x3 << 28));
	GPIOE->MODER |= (0x1 << 28);
	GPIOE->OTYPER &= (~(0x1 << 14));
	GPIOE->OSPEEDR &= (~(0x3 << 28));
	GPIOE->PUPDR &= (~(0x3 << 28));
	// MISO    PE13
	GPIOE->MODER &= (~(0x3 << 26));
	GPIOE->OSPEEDR &= (~(0x3 << 26));
	GPIOE->PUPDR &= (~(0x3 << 26));
	// SCK     PE12	
	GPIOE->MODER &= (~(0x3 << 24));
	GPIOE->MODER |= (0x1 << 24);
	GPIOE->OTYPER &= (~(0x1 << 12));
	GPIOE->OSPEEDR &= (~(0x3 << 24));
	GPIOE->PUPDR &= (~(0x3 << 24));
	// NSS     PE11
	GPIOE->MODER &= (~(0x3 << 22));
	GPIOE->MODER |= (0x1 << 22);
	GPIOE->OTYPER &= (~(0x1 << 11));
	GPIOE->OSPEEDR &= (~(0x3 << 22));
	GPIOE->PUPDR &= (~(0x3 << 22));
	NSS_OUTPUT_L();    // 595芯片的锁存引脚拉低
	SCK_OUTPUT_L();    // SPI的时钟线拉低
}

void SPI_write(unsigned char dat)
{
	//1.for循环 
	unsigned char i;
	for(i=0; i<8; i++)
	{
		if(dat & 0x01)	//先发低位,再发高位
			MOSI_OUTPUT_H();  //发1
		else
			MOSI_OUTPUT_L();  //发0
		
		dat >>= 1;

		//移位寄存器时钟,上升沿
		SCK_OUTPUT_L();
		delay_us1(10);
		SCK_OUTPUT_H();
		delay_us1(10);
	}	
}



---main.c测试文件---
#include "spi.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)

{
	int i,j;
	for(i = 0; i < ms;i++)
    	for (j = 0; j < 1800; j++);
}


int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};

int main()
{
	SPI_init();

	//实验1:0000 1111 .... 9999
	unsigned char i;

	while(1)
	{
	/*	for(i=0; i<10; i++)	
		{
			//循环条
			SPI_write(0xF0);   //传位
			SPI_write(num[i]);   //传段

			//锁存时钟上升沿,锁存器数据才会变化
			NSS_OUTPUT_L();
			delay_ms(10);
			NSS_OUTPUT_H();
			delay_ms(10);
		}

		*/
		
/        /实验2:1234
		for(i=0; i<4; i++)
		{
			SPI_write(0x80 >> i);
			SPI_write(num[i+1]);

			//锁存时钟上升沿,锁存器数据才会变化
			NSS_OUTPUT_L();
			delay_ms(1);
			NSS_OUTPUT_H();

		}
	}
	return 0;

}

4.运行结果;

a.数码管显示相同的值 0000 1111 ......9999;

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示),ARM,arm开发,stm32,嵌入式硬件,c语言

b.数码管显示不同的值 1234;

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示),ARM,arm开发,stm32,嵌入式硬件,c语言文章来源地址https://www.toymoban.com/news/detail-669839.html

到了这里,关于ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 驱动开发,stm32mp157a开发板的led灯控制实验

            编写LED灯的驱动,在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制; LED1-PE10 LED1亮灭: RCC寄存器[4]-1 0X50000A28 GPIOE_MODER[21:20]-01 (输出) 0X50006000 GPIOE_ODR[10]-1(输出高电平) 0(输出低电平)0X50006014 LED2-PF10 LED2亮灭: RCC寄存器[5]-1 0X50000A28 GPIOE_MODER[21:20]

    2024年02月09日
    浏览(34)
  • arm学习stm32之spi总线数码管倒计时,裸机开发,soc

    由于时间没有用时间计时器操作,有些误差,后续有空会翻新计时器版本 main.c spi.c spi.h

    2024年02月16日
    浏览(41)
  • cortex-A7核PWM实验--STM32MP157

    实验目的:驱动风扇,蜂鸣器,马达进行工作 目录 一,PWM相关概念 有源蜂鸣器和无源蜂鸣器 二,分析电路图,框图 三,分析RCC章节 1,确定总线连接 2,根据总线内容确定基地址 3.分析RCC章节所需寄存器 1,RCC_MP_AHB4ENSETR寄存器 2,RCC_MP_APB1ENSETR寄存器 四,分析GPIO章节寄存器

    2024年02月11日
    浏览(24)
  • cortex-A7核IIC实验--STM32MP157AAA

    实验目的:采集温湿度传感器值 1.同步串行半双工总线,主要用于链接整体电路,硬件结构简单,接口连接方便,成本较低 2.两线制,只有两根双向信号线,数据线SDA,时钟线SCL 3.IIC传输速率:1)低速:100k ,2)400k,全速:3.4M 4.总线外接两个上拉电阻:在总线处于空闲状态时

    2024年02月11日
    浏览(36)
  • STM32MP157驱动开发——按键驱动(中断)

    对于使用中断的按键驱动,内核自带的驱动程序 drivers/input/keyboard/gpio_keys.c 就可以,需要做的只是修改设备树指定引脚及键值 中断是引入其他基础知识的前提:休眠-唤醒、POLL 机制、异步通知、定时器、中断的线程化处理都离不开中断 设备树相关 查看原理图确定按键使用的

    2024年02月15日
    浏览(37)
  • STM32MP157驱动开发——按键驱动(tasklet)

    阅读Linux 系统中异常与中断可知,Linux 系统对中断处理的演进过程中,实现了中断的扩展:硬件中断、软件中断 硬件中断有:GPIO,网络中断(net),系统滴答中断(tick)等 软件中断有:定时器,tasklet等 内核中的软中断: 该数组里面有个action成员,该成员是个函数,函数会调

    2024年02月14日
    浏览(34)
  • STM32MP157驱动开发——按键驱动(工作队列)

    定时器、下半部 tasklet,它们都是在中断上下文中执行,它们无法休眠。当要处理更复杂的事情时,往往更耗时。这些更耗时的工作放在定时器或是下半部中,会使得系统很卡;并且循环等待某件事情完成也太浪费CPU 资源了。如果使用线程来处理这些耗时的工作,那就可以解

    2024年02月15日
    浏览(31)
  • STM32MP157驱动开发——按键驱动(异步通知)

    Linux 系统中也有很多信号,在 Linux 内核源文件 includeuapiasm-genericsignal.h 中,有很多信号的宏定义: 就 APP 而言,你想处理 SIGIO 信息,那么需要提供信号处理函数,并且要跟 SIGIO 挂钩。这可以通过一个 signal 函数 来“给某个信号注册处理函数”,用法如下: 重点从②开始:

    2024年02月15日
    浏览(42)
  • STM32MP157驱动开发——USB设备驱动

    参考文章:【正点原子】I.MX6U嵌入式Linux驱动开发——Linux USB驱动   由于 USB 协议太过庞大和复杂,所以本节只对 STM32MP157 自带的 USB 驱动进行使能和测试。详细的 USB 接口和协议的介绍,可以参考原子哥的资料《USB2.0 协议中文版.pdf》和《USB3.0 协议中文版.pdf》。   USB 全

    2023年04月14日
    浏览(39)
  • STM32MP157驱动开发——按键驱动(线程化处理)

    工作队列是在内核的线程的上下文中执行的 工作队列中有多个 work,前一个 work 没处理完会影响后面的 work。解决方法有如下2种: 比如自己创建一个内核线程,不跟别的 work 在一块。例如存储设备比如 SD/TF采用的就是单独一个线程。 使用线程化的中断处理。中断的处理仍然

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包