spi_2024.1.2

news2024/11/20 14:43:28

spi.h

#ifndef __SPI_H__
#define __SPI_H__

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

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

// 对应595芯片的锁存引脚输出高低电平  PE11
#define  NSS_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 11);}while(0)
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)
    
// 时钟信号对应的引脚输出高低电平  PE12
#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);
void delay_ms(int ms);
void bian();
#endif

spi.c

#include"spi.h"

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)
{
    //1.使能GPIOE时钟
    RCC->MP_AHB4LPENSETR |=(0X1<<4);
    //2.MOSI管脚PE14 设置输出的属性
    GPIOE->MODER &=(~(0X3<<28));
    GPIOE->MODER |=(0X1<<28);
     GPIOE->OTYPER &=(~(0X1<<14));
    GPIOE->OSPEEDR &=(~(0X3<<28));
    GPIOE->PUPDR &=(~(0X3<<28));
    //3.MISO管脚PE13 设置输入的属性
    GPIOE->MODER &=(~(0X3<<26));  
   
    GPIOE->OSPEEDR &=(~(0X3<<26));
    GPIOE->PUPDR &=(~(0X3<<26));
    //4.SCK管脚PE12  设置输出的属性
    GPIOE->MODER  &=(~(0x3<<24));
    GPIOE->MODER  |=(0x1<<24);
    GPIOE->OTYPER &=(~(0X1<<12));
    GPIOE->OSPEEDR &=(~(0X3<<24));
    GPIOE->PUPDR &=(~(0X3<<24));
    //5.RCK(NSS)管脚PE11 设置输出的属性
    GPIOE->MODER  &=(~(0X3<<22));
    GPIOE->MODER  |=(0X1<<22);
    GPIOE->OTYPER &=(~(0X1<<11));
    GPIOE->OSPEEDR &=(~(0X3<<22));
    GPIOE->PUPDR &=(~(0X3<<22));
    //默认PE12和PE11输出低电平,方便产生上升沿
     NSS_OUTPUT_L();
    SCK_OUTPUT_L();
    
}

void SPI_write(unsigned char dat)
{
     int i;
    for(i=0;i<8;i++)
    {
        if(dat&0X01)
        {
            //输出高电平
            MOSI_OUTPUT_H();
        }
        else
        {
            //输出低电平
            MOSI_OUTPUT_L();
        }
        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++);



}   



void bian()

{

	NSS_OUTPUT_L();

	delay_ms(1);

	NSS_OUTPUT_H();

	delay_ms(1000);

}



//保存0-9编码的数组





int main(void)



{



    //unsigned char i;



    SPI_init();



    while(1)



    {



              // 发送数码管的位 



    		SPI_write(0X80);



		   SPI_write(0XFC);



		   bian();



		   SPI_write(0X40);



		   SPI_write(0XF2);



		   bian();



		   SPI_write(0X20);



		   SPI_write(0X3e);



		   bian();



		   SPI_write(0X10);



		   SPI_write(0XF6);



		   bian();



		   



		  







    }











    return 0;



}









spi.h(加了key_it.h)

#ifndef __SPI_H__
#define __SPI_H__

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

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

// 对应595芯片的锁存引脚输出高低电平  PE11
#define  NSS_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 11);}while(0)
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)
    
// 时钟信号对应的引脚输出高低电平  PE12
#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);
void delay_ms(int ms);
void bian();
#endif

main.c



#include "spi.h"

#include"key_it.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++);



}   







//保存0-9编码的数组





int main(void)



{

  SPI_init();

    key1_it_config();

    key2_it_config();

    key3_it_config();

    //unsigned char i;



    while(1)



    {



              // 发送数码管的位 

			printf("do_main.....\n");

			delay_ms(1000);



		   



		  







    }











    return 0;



}









spi.c

同上

do_irq.c

#include"led.h"
#include"spi.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void bian()
{
	NSS_OUTPUT_L();
	delay_ms(1);
	NSS_OUTPUT_H();
	delay_ms(1000);
}
void do_irq(void) 
{
  
    int irqno=(GICC->IAR &0X3FF);
  
    switch(irqno)
    {
        case 99:
        {
            printf("im key1\n");
           
            
    		SPI_write(0X80);

		   SPI_write(0XFC);
            bian();
           SPI_write(0X20);

		   SPI_write(0X3e);

		   bian();

		  
           
            GICD->ICPENDR[3] |=(0X1<<3);
            EXTI->FPR1 |=(0X1<<9);
            led1_off();
        }break;
        case 98:
        {
            printf("im key3\n");
         SPI_write(0X40);

		   SPI_write(0XF2);

		   bian();
            GICD->ICPENDR[3] |=(0X1<<2);
            EXTI->FPR1 |=(0X1<<8);
           
        }break;
        case 97: 
        {
            printf("im key2\n");
           
             SPI_write(0X10);

		   SPI_write(0XF6);

		   bian();
            GICD->ICPENDR[3] |=(0X1<<1);
            EXTI->FPR1 |=(0X1<<7);
            
        }break;
    }
    GICC->EOIR=irqno;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫与反爬-localStorage指纹(某易某盾滑块指纹检测)(Hook案例)

概述&#xff1a;本文将用于了解爬虫中localStorage的检测原理以及讲述一个用于检测localStorage的反爬虫案例&#xff0c;最后对该参数进行Hook断点定位 目录&#xff1a; 一、LocalStorage 二、爬虫中localStorage的案例&#xff08;以某盾滑块为例&#xff09; 三、如何…

机器学习基本概念及模型简单代码(自用)

监督学习 监督学习是机器学习的一种方法&#xff0c;其中我们教导模型如何做出预测或决策&#xff0c;通过使用包含输入和对应输出的已标注数据集进行训练。这种方法的关键特点是利用这些标注数据**&#xff08;即带有正确答案的数据&#xff09;**来指导模型的学习过程。 一言…

openssl 命令详解

openssl genrsa 命令产生私钥 openssl genrsa 命令是会用来生成 RSA 私有秘钥&#xff0c;不会生成公钥&#xff0c;因为公钥提取自私钥。生成时是可以指定私钥长度和密码保护。 如果需要查看公钥或生成公钥&#xff0c;可以使用 openssl rsa 命令。 命令语法&#xff1a; ope…

MVCC 并发控制原理-源码解析(非常详细)

基础概念 并发事务带来的问题 1&#xff09;脏读&#xff1a;一个事务读取到另一个事务更新但还未提交的数据&#xff0c;如果另一个事务出现回滚或者进一步更新&#xff0c;则会出现问题。 2&#xff09;不可重复读&#xff1a;在一个事务中两次次读取同一个数据时&#xff0c…

微信小程序使用echarts报错 ReferenceError: Image is not defined 解决

报错 ReferenceError: Image is not defined 在用uni-app开发微信小程序时&#xff0c;使用到了echarts&#xff08;V4.6.0&#xff09;配置项中的icon属性&#xff0c;微信开发者工具报错如下&#xff1a; 定位问题 定位问题到了压缩echarts文件中的new Image 使用非压缩…

白话机器学习的数学-3-评估

1、 模型评估 那我们如何测量预测函数 fθ(x)的正确性&#xff0c;也就是精度呢&#xff1f; 观察函数的图形&#xff0c;看它能否很好地拟合训练数据&#xff1a; 这是只有一个变量的简单问题&#xff0c;所以才能在图上展 示出来。 过像多重回归这样的问题&#xff0c;变量增…

C# 语法进阶 委托

1.委托 委托是一个引用类型&#xff0c;其实他是一个类&#xff0c;保存方法的指针 &#xff08;指针&#xff1a;保存一个变量的地址&#xff09;他指向一个方法&#xff0c;当我们调用委托的时候这个方法就立即被执行 关键字&#xff1a;delegate 运行结果&#xff1a; 思…

canvas绘制圆点示例

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

计算机网络复习1

概论 文章目录 概论计算机网络的组成功能分类性能指标&#xff08;搞清楚每个时延的具体定义&#xff09;分层结构协议、接口和服务服务的分类ISO/OSITCP/IP两者的不同 计算机网络的组成 组成部分&#xff1a;硬件&#xff0c;软件和协议&#xff08;协议&#xff1a;传输数据…

防火墙未开端口导致zookeeper集群异常,kafka起不来

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 主机信息&#xff1a; IPhostname10.0.0.10host1010.0.0.12host1210.0.0.13host13 在这三台主机上部署…

k8s的声明式资源管理(yaml文件)

1、声明式管理的特点 &#xff08;1&#xff09;适合对资源的修改操作 &#xff08;2&#xff09;声明式管理依赖于yaml文件&#xff0c;所有的内容都在yaml文件当中 &#xff08;3&#xff09;编辑好的yaml文件&#xff0c;还是要依靠陈述式的命令发布到k8s集群当中 kubect…

如何在ArcGIS Pro中指定坐标系

在进行制图的时候&#xff0c;为了实现某些特定的效果&#xff0c;需要指定特定的坐标系&#xff0c;但是现有的数据可能不是所需要的坐标系&#xff0c;这时候就需要对现有的数据坐标系进行处理&#xff0c;这里为大家介绍一下ArcGIS Pro中指定坐标系的方法&#xff0c;希望能…

关于标准那些事——第六篇 四象之“白虎”(要素的编写)

两仪生四象——东方青龙&#xff08;木&#xff09;、西方白虎&#xff08;金&#xff09;、南方朱雀&#xff08;火&#xff09;、北方玄武&#xff08;水&#xff09; 分别对应标准编写之四象——层次的编写、要素的编写、要素的表述、格式的编排。 今天来分享一下 要素的编…

系列五、搭建Naco(集群版)

一、搭建Naco&#xff08;集群版&#xff09; 1.1、前置说明 &#xff08;1&#xff09;64位Red Hat7 Linux 系统&#xff1b; &#xff08;2&#xff09;64位JDK1.8&#xff1b;备注&#xff1a;如果没有安装JDK&#xff0c;请参考【系列二、Linux中安装JDK】 &#xff08;3&…

Graceful Response 构建 Spring Boot 下优雅的响应处理

一、Graceful Response Graceful Response 是一个 Spring Boot 技术栈下的优雅响应处理器&#xff0c;提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能&#xff0c;使用Graceful Response进行web接口开发不仅可以节省大量的时间&#xff0c;还可以提高代码质…

SpringBoot 项目如何生成 swagger 文档

推荐使用 springdoc-openapi 的理由 1、springdoc-openapi 是 spring 官方出品&#xff0c;与 springboot 兼容更好&#xff08;springfox 兼容有坑&#xff09; 2、springdoc-openapi 社区更活跃&#xff0c;springfox 已经 2 年没更新了 3、springdoc-openapi 的注解更接近 …

如何在Mendix中实现全文检索

功能背景 在日常的应用使用过程中&#xff0c;存在大量希望使用全文检索技术的场景&#xff0c;对资料库中的内容进行查询。Mendix默认的结构化查询方式&#xff0c;适合对特定业务实体进行类似数据库单表的基于SQL语句的查询。那如何在Mendix实现全文检索的功能呢&#…

Flink-【时间语义、窗口、水位线】

1. 时间语义 1.1 事件时间&#xff1a;数据产生的事件&#xff08;机器时间&#xff09;&#xff1b; 1.2 处理时间&#xff1a;数据处理的时间&#xff08;系统时间&#xff09;。 &#x1f330;&#xff1a;可乐 可乐的生产日期 事件时间&#xff08;可乐产生的时间&…

vue $set 报错 Cannot use ‘in‘ operator to search for ‘imgs‘ in

这行代码会报上述错误 本意是当对象属性为空时,添加一个响应式属性. 猜测增加属性可能需要对象的原始地址,这里的 this.imageUploadData.rowData 显然不是原始地址,他是引用的 rowData 变量的地址. 于是改成 , 修改原始地址对象的属性,报错消失 this.$set(rowData, imgs, nu…

LanChatRoom局域网聊天室

CPP已经结课&#xff0c;我提交的项目是Qt的入门项目&#xff0c;局域网聊天室LanChatRoom。 这个代码重构了很多遍。第一遍是照着明哥推荐到书&#xff0c;把代码抄了一遍。 但抄下来之后&#xff0c;各种问题&#xff0c;而且是清朝老代码。抄了一遍之后&#xff0c;对代码的…