STM32下SPI模式通过MAX7219驱动8位数码管显示模块

2019-11-09来源: eefocus关键字:STM32  SPI模式  MAX7219驱动  数码管显示

借鉴的地方:


1、正点原子的“ALIENTEK MINISTM32 实验20 SPI实验”


2、


STM32 硬件SPI max7219 8位数码管显示模块 http://www.openedv.com/posts/list/46179.htm



工具:


STM32F103RCT6开发板;MAX7219 8位数码管显示模块:


数码管模块电路图:(店家https://item.taobao.com/item.htm?spm=a1z09.2.0.0.FiSjlX&id=41059249086&_u=cjnajni5a96提供)

MAX7219中文说明可以借鉴:


http://wenku.baidu.com/link?url=x3kqYs4DsCZ2V6ZXyDYwK2qgLC6Y6qR_sfo3m53pxHyFjPh6TQfsu1S9o72x3xdJvIO6PjxVgmZMnh-8OXa_2CuxeCSNcpr5S6WBdRmr-VG


http://wenku.baidu.com/link?url=lsfDPw13GMUDhhplpO87xIvfRDOMr6Jplpt787Hue4YTrAo-WzYQTXexARaBD4wZGWdLW_dZBcOxsTZVuoqBd2nAl4WEQkYHNZvhMLpwcqe


接口VCC(+3.3V),DIN(PA7),CS(PA3),CLK(PA5)


#define Max7219_pinCLK PAout(5)

#define Max7219_pinCS PAout(3)

#define Max7219_pinDIN PAout(7)


/*****************************************************************

Updated time: 12th,12,2015

Function:通过MAX7219驱动数码管

******************************************************************/

 

#include "delay.h"

#include "sys.h"

#include "usart.h"//串口通信

 

 

 

#define Max7219_pinCLK PAout(5)

#define Max7219_pinCS PAout(3)

#define Max7219_pinDIN PAout(7)

 

 

/****************************************************************************

* 名称:SPI1_Init(void)

* 功能:STM32_SPI1硬件配置初始化

* 入口参数:无

* 出口参数:无

* 说明:STM32_SPI1硬件配置初始化,使用3V3

****************************************************************************/

void SPI1_Init(void)

{

SPI_InitTypeDef  SPI1_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

 

//配置SPI1管脚

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;

        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

        GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//SPI1相关引脚

        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽复用功能

        GPIO_Init(GPIOA,&GPIO_InitStructure);

 

SPI1_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式;SPI设置为双线双向全双工

SPI1_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;//定义波特率预分频值;波特率预分频64

SPI1_InitStructure.SPI_DataSize=SPI_DataSize_8b;//设置SPI的数据大小;SPI发送接收8位帧结构

SPI1_InitStructure.SPI_Mode=SPI_Mode_Master;//设置SPI工作模式;设置为主SPI

SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先

SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态,时钟悬空高

SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿

        SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft; //使用软件模式,

SPI1_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式

SPI_I2S_DeInit(SPI1);

SPI_Init(SPI1, &SPI1_InitStructure); //根据指定的参数初始化

SPI_Cmd(SPI1, ENABLE);   //SPI使能

//--------------------------------------------

//功能:向MAX7219写入字节

//入口参数:DATA

//出口参数:无

//说明:

void Write_Max7219_byte(unsigned char DATA)         

{

    unsigned char i;    

Max7219_pinCS=0;

        for(i=8;i>=1;i--)

          {  

            Max7219_pinCLK=0;

            Max7219_pinDIN=DATA&0x80;

            DATA=DATA<<1;

            Max7219_pinCLK=1;

           }                                 

}

 

//-------------------------------------------

//功能:向MAX7219写入数据

//入口参数:address,dat

//出口参数:无

//说明:

void Write_Max7219(unsigned char address,unsigned char dat)

{

      GPIO_ResetBits(GPIOA, GPIO_Pin_3);

      SPI_I2S_SendData(SPI1, address);  //写入地址,即数码管编号

      delay_us(10);

      SPI_I2S_SendData(SPI1, dat);     //写入数据,即数码管显示数字

      delay_us(10);

      GPIO_SetBits(GPIOA, GPIO_Pin_3);

}

 

 

void Init_MAX7219(void)

{

 Write_Max7219(0x09, 0xFF);       //译码方式:BCD译码

 Write_Max7219(0x0A, 0x03);       //亮度

 Write_Max7219(0x0B, 0x07);       //扫描界限;8个数码管显示

 Write_Max7219(0x0C, 0x01);       //掉电模式:0;普通模式:1

 Write_Max7219(0x0F, 0x00);       //显示测试:1;测试结束,正常显示:0

}

 

 int main(void)

 {

unsigned char i,j;

 

delay_init();//延时初始化

SPI1_Init();//SPI初始化

NVIC_Configuration();//中断分组

uart_init(9600);//串口波特率9600

 

 

delay_ms(50);

Init_MAX7219();//初始化

 

 

Write_Max7219(0x01, 0x00); //1号数码管显示数字0

Write_Max7219(0x02, 0x01);

Write_Max7219(0x03, 0x02);

Write_Max7219(0x04, 0x03);

Write_Max7219(0x05, 0x04);

Write_Max7219(0x06, 0x05);

Write_Max7219(0x07, 0x06);

Write_Max7219(0x08, 0x07);

for(j=0;j<=9;j++)

{

Write_Max7219(0x04, j);

delay_ms(50);

}

}

 

关于“SPI NSS的设置问题”:http://www.openedv.com/posts/list/33654.htm

原子大哥如是说:

1,硬件NSS,是指SPI自动控制SPI的片选信号,发送数据的时候,输出低电平,不发送的时候,是高电平,这个模式一般不用.因为这种方式只能1个SPI接1个从机,很是蛋疼.

2,软件模式就是完全软件控制SPI片选,就是一个普通IO控制,你要SPI通信之前,必须先用软件的方式,控制SPI从机的片选为低电平,然后在发送数据.发完后,拉高. 一般用这个模式,因为可以一个SPI控制N多个从机... 


另外:


a) SPI一些想法可以参考:http://blog.csdn.net/xuezhimeng2010/article/details/15188849


spi通信配置


1、GPIO时钟使能,SPI时钟使能。

2、配置GPIO片选,推挽输出,上拉;SCLK、MOSI、MISO所用到的引脚为复用功能;SCLK下拉,MOSI推挽复用,MISO无推挽。

3、SPI初始化,配置工作模式为全双工,主机模式,SCLK闲时电平为低,第二个时钟沿(下降沿)采样数据,SCLK时钟128预分频,CRC校验置默认值0x07,内部从机选择软件管理模式。设置接收FIFO为四分之一,内部从机选择设置为主机(置1),使能SPI。

4、从机设备一般上电是默认写使能的,因此若需要读取数据先关闭写使能。

5,stm32f0在使能spi后,miso和mosi都被拉低,因此在读取从机数据时,需要先发送的无效数据为0x00。


b) SPI的复用管脚可以通过STM32F103的datasheet查到


关键字:STM32  SPI模式  MAX7219驱动  数码管显示 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479521.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 MAX7219驱动的8*8 LED点阵
下一篇:关于STM32驱动点阵的问题整理及科研思维小酌

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8L低功耗调试总结
STM8L低功耗调试资料准备功耗数据目标实现低功耗资料准备在调试STM单片机相关功能时,习惯性的进入到STM官方论坛进行资料下载。调试STM8功耗也不例外,找到STM8L的应用笔记,选择最热,先看看官方提供的STM8入门文档,入门资料可以选择中文或者英文(STM8L和STM8AL入门)。资料里面有一段话,对功耗调试相当重要:6.6 不使用的 I/O 和特性微控制器都是为多种应用设计的,通常一个应用不会使用 100 % 的微控制器资源。为了避免不必要的功率消耗 (对电池供电应用特别重要),同时提高 EMC 性能,闲置时钟、计数器或 I/O 都不应浮空。 I/O 应该外部强制 (上拉或者下拉到闲置 I/O 引脚),并且不使用的功能应
发表于 2019-11-14
STM8L低功耗调试总结
STM8的停机模式
首先,STM8有三种低功耗模式,即等待、活跃停机和停机。具体它们三者有什么区别自己看官方手册去吧,这里只讲停机模式的应用,其他的一笔带过!一、进入的方式:等待模式进入用的指令是WFI,而活跃停机和停机用的都是halt(),所不同的是,在执行halt指令之前,如果开启了AWU,则是活跃停机,反之则是停机。还有一点要说明的是,在停机模式下独立看门狗是不能养的,而只能养窗口看门狗。二、具体进入的步骤:1、首先,你声明一个标志位,名字自己取。这个标志位是用来判断系统是该处于运行模式还是处于停机模式的。我这里用fPowerOn_flag,如下:bool fPowerOn_flag = FALSE;有了这个标志位以后就写下面的部分了:int
发表于 2019-11-14
halt低功耗模式
1. stm8l152有5种低功耗模式,wait mode, low power run mode, low power wait mode, active-halt mode, halt mode.2. 在halt模式下,cpu和外设时钟停止,可以通过外部中断或者复位来唤醒。3. 本实验设计为:led灯亮,紧接着进入halt模式,有按键时,中断,快速唤醒,led灯灭。     PWR_FastWakeUpCmd(ENABLE);  //快速唤醒使能     //所有IO输出低电平    GPIO_Init(GPIOA
发表于 2019-11-14
STM8L051低功耗模式测试文档
STM8L051的五种低功耗模式wait ,low power run mode,low power wait mode,Ative-Halt mode,Halt mode。WAIT  mode  在等待模式,CPU的时钟是停止的,被选择的外设继续运行。WAIT mode 分为两种方式:WFE,WFI。WFE是等待事件发生,才从等待模式中唤醒。WFI是等待中断发生,才从等待模式中唤醒。low power run mode  在低功耗运行模式下,CPU和被选择的外设在工作,程序执行在LSI或者LSE下,从RAM中执行程序,Flash和EEPROM都要停止运行。电压被配置成Ultra Low Power
发表于 2019-11-14
stm8l 低功耗 halt_active模式
第一次尝试做低功耗,芯片stm8l,用的半halt模式1、关于唤醒,可以用外部中断和RTC(stm8l不同的模式用的唤醒方式均不同)2、关于省电,如果没达到理想的电流,一般都是gpio口问题,没用到的都悬浮输入或输出低都是可以的,用到的统一量一下电平,看看哪个状态不对
发表于 2019-11-14
STM8L EXITB一个端口两个中断的实现
void EXTI_Config(void){     EXTI_DeInit();       EXTI_SetPinSensitivity(EXTI_Pin_5,EXTI_Trigger_Falling);     ITC_SetSoftwarePriority(EXTI5_IRQn, ITC_PriorityLevel_1);    GPIO_Init(KEY_PORT, KEY_RT_PIN, GPIO_Mode_In_PU_IT);    EXTI_SetPinSensitivity(
发表于 2019-11-14
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved