0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32CUBEMX(14)--SPI,TLC5947外部PWM移植

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2022-11-14 16:57 次阅读

概述

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如 EEPROM,FLASH,实时时钟AD转换器。 TLC5947是一款SPI接口的PWM脉宽调制24路LED驱动模块/RGB LED驱动器芯片,它能驱动24路的PWM。

硬件准备

首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:

在这里插入图片描述

外部PWM模块就是淘宝上SPI接口的TLC5947模块。 在这里插入图片描述

选择芯片型号

使用STM32CUBEMX选择芯片stm32f030r8,如下所示: 在这里插入图片描述

配置时钟

HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示: 在这里插入图片描述

配置时钟树

STM32F0的最高主频到48M,所以配置48即可: 在这里插入图片描述

SPI配置

本次实验使用的SPI与Flash通信,配置如下。 SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。 (1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出; (2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入; (3)SCLK – Serial Clock,时钟信号,由主设备产生; (4)CS – Chip Select,从设备使能信号,由主设备控制。

接线方式

在这里插入图片描述

负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDISDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。 时钟信号线SCLK只能由主设备控制,从设备不能控制。同样,在一个基于SPI的设备中,至少有一个主设备。这样的传输方式有一个优点,在数据位的传输过程中可以暂停,也就是时钟的周期可以为不等宽,因为时钟线由主设备控制,当没有时钟跳变时,从设备不采集或传送数据。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。芯片集成的SPI串行同步时钟极性和相位可以通过寄存器配置,IO模拟的SPI串行同步时钟需要根据从设备支持的时钟极性和相位来通讯。 最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。 在这里插入图片描述 其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。 TLC5947需要配置2个CS线,分别是BLANK和LAT。 在这里插入图片描述

生成工程设置

注意在生产工程设置中不能出现中文,不然会报错。

在这里插入图片描述

生成代码

在这里插入图片描述

配置keil

在这里插入图片描述

TLC5947的原理及应用

BLANK:所有恒流输出关闭。 当blank 接高时 ,所有恒流输出(输出0通过out23)强制关闭,脉宽调制PWM定时控制器初始化,灰度计数器重置为0。 当blank接低时 ,所有恒流输出由灰度脉宽调制定时控制器控制。 GND:负极 IREF:设置恒定电流值,设置T0到T23引脚输出的电流值。通过在IREF和GND之间连接一个外部电阻所需要的值。 SCLK:串行数据移位时钟。 SIN:灰度数据的串行输入。 SOUT:串行数据输出。 VCC:供电 XLAT:灰度数据转换。灰度移位寄存器中的数据以从低到高的方式移动到灰度数据锁存器,在XLAT引脚上转换。当XLAT.上升沿被输入时,所有恒流输出被强制关闭,直到下一个灰度显示周期。灰度计数器不会随着XLAT边沿的上升而重置为0。 在这里插入图片描述 由于芯片为开漏输出,故接线如下所示。 在这里插入图片描述 时序图如下所示。 在这里插入图片描述

代码

本例程向通道0中写入呼吸灯程序通道1输出12.5%,通道2输出25%,通道3-通道22输出50%,通道23输出75%,例程代码如下。 变量定义。

/* USER CODE BEGIN PV */
uint16_t leds[24]= 
{
512,512,1024,2048,2048,2048,
2048,2048,2048,2048,2048,2048,
2048,2048,2048,2048,2048,2048,
2048,2048,3000,2048,2048,3072
};
void TLC_Update(void);
void TLC_Write(uint8_t data);
int i=0;
int flag=0;
/* USER CODE END PV */

SPI发送函数定义。

/* USER CODE BEGIN 4 */
void TLC_Update(void)
{       
    HAL_GPIO_WritePin(BLANK_GPIO_Port, BLANK_Pin, GPIO_PIN_SET);
//        HAL_Delay(1);    
    for (int8_t i = 23; i >= 0; i -= 2)
    {
        uint8_t send1 = 0;
        uint8_t send = leds[i] >> 4;
        TLC_Write(send);
        send = (leds[i] & 0x000F);
        send <<= 4;
        send1 = (leds[i-1]) >> 8;    
        send |= send1;
        TLC_Write(send);
        send = leds[i-1];
        TLC_Write(send);
    }    

    HAL_GPIO_WritePin(XLAT_GPIO_Port, XLAT_Pin, GPIO_PIN_SET);
//        HAL_Delay(1);    
    HAL_GPIO_WritePin(XLAT_GPIO_Port, XLAT_Pin, GPIO_PIN_RESET);
//        HAL_Delay(1);    
    HAL_GPIO_WritePin(BLANK_GPIO_Port, BLANK_Pin, GPIO_PIN_RESET);

    return ;
}


void TLC_Write(uint8_t data)
{
    HAL_SPI_Transmit(&hspi1, &data, sizeof(data), 0);
    while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_RESET);

    return ;
}
/* USER CODE END 4 */

主程序。

/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        if(flag==0)//灯渐亮
                i+=5;
        else//灯渐灭
                i-=5;

        if(flag==0&&i==4095)//灯最亮
        {
            HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
            flag=1;
        }
        if(flag==1&&i==0)//灯最暗
        {
            HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
            flag=0;
        }            
        leds[0]=i;//更新通道0的PWM
        TLC_Update();//更新PWM
        HAL_Delay(1);        
  }
  /* USER CODE END 3 */


}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4915

    浏览量

    210241
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1618

    浏览量

    89763
  • stm32cubemx
    +关注

    关注

    5

    文章

    261

    浏览量

    14466
收藏 人收藏

    评论

    相关推荐

    STM32CubeMx外部中断基本使用方法

    第一步:现在STM32CubeMx 中配置所需要IO口外部中断模式。
    发表于 05-31 15:32 2952次阅读
    <b class='flag-5'>STM32CubeMx</b><b class='flag-5'>外部</b>中断基本使用方法

    STM32CubeMx入门教程(4):PWM应用

    导语“使用STM32CubeMx配置定时器输出PWM波,生成初始化代码。”
    发表于 07-11 15:23 931次阅读
    <b class='flag-5'>STM32CubeMx</b>入门教程(4):<b class='flag-5'>PWM</b>应用

    STM32CubeMX系列教程新鲜出炉

    ,确保STM32系列最大的移植性)再加上兼容的一套中间件(RTOS,USB,TCP/IP和图形)。STM32CubeMX主要特性:直观的选择STM32微控制器微控制器图形化配置自动处理
    发表于 05-04 11:29

    微雪电子STM32CubeMX教程 (转载)

    :GPIOSTM32CubeMX系列教程2:外部中断(EXIT)STM32CubeMX系列教程3:基本定时器STM32CubeMX系列教程4: PWM
    发表于 08-25 21:00

    如何使用HSPI驱动TLC5947

    我正在尝试让 Adfruit TLC5947 模块与 NodeMCU 板一起工作,Adfruit_TLC5947 库工作正常但速度太慢,所以我认为硬件 spi 会更好,所以我在阅读 TLC59
    发表于 02-24 09:12

    TLC5947 pdf datasheet (24-Chan

    The TLC5947 is a 24-channel, constant current sink LED driver. Each channel is individually
    发表于 08-08 00:10 25次下载

    stm32cubemx教程

    stm32cubemx教程,需要学习的看看,免积分
    发表于 11-02 10:16 0次下载

    TI 24通道LED驱动TLC5947的性能及展示板的介绍

    1.2 高性能LED驱动TLC5947展示板展示
    的头像 发表于 05-07 06:05 6473次阅读

    STM32CubeMX生成代码在SW4STM32移植STemWin(CLion+CubeMX

    STM32CubeMX生成代码在SW4STM32移植STemWin(CLion+CubeMX)文章目录STM32CubeMX生成代码在SW
    发表于 12-04 14:36 12次下载
    <b class='flag-5'>STM32CubeMX</b>生成代码在SW4<b class='flag-5'>STM32</b>下<b class='flag-5'>移植</b>STemWin(CLion+<b class='flag-5'>CubeMX</b>)

    STM32CUbeMX之两路互补pwm波 以及死区时间设置

    STM32CUbeMX之两路互补pwm波 以及死区时间设置STM32CUbeMX的配置keil工程里的代码实现验证结果芯片:stm32f103zet6STM32CUbeMX的配置1.基
    发表于 12-22 19:40 31次下载
    <b class='flag-5'>STM32CUbeMX</b>之两路互补<b class='flag-5'>pwm</b>波 以及死区时间设置

    STM32CUBEMX(1)--PWM

    本篇文章主要介绍如何使用STM32CubeMX输出PWM,并制作呼吸灯效果。
    的头像 发表于 11-14 15:29 2092次阅读
    <b class='flag-5'>STM32CUBEMX</b>(1)--<b class='flag-5'>PWM</b>

    Keil STM32CubeMX资料包

    Keil STM32CubeMX资料包。STM32CubeMX设置了TM2为编码器接口,串口,外部Flsh,ISP,外部时钟晶振,因为技术有限,外部
    发表于 03-27 09:21 5次下载

    STM32CUBEMX开发GD32F303

    在这使用STM32CUBEMX进行配置STM32F103,移植到兆易创新GD32F303,然后进行测试。
    的头像 发表于 07-27 09:32 991次阅读
    <b class='flag-5'>STM32CUBEMX</b>开发GD32F303

    通过STM32CubeMX制作外部Flash的烧写驱动(.stdlr)

    电子发烧友网站提供《通过STM32CubeMX制作外部Flash的烧写驱动(.stdlr).pdf》资料免费下载
    发表于 08-01 11:12 6次下载
    通过<b class='flag-5'>STM32CubeMX</b>制作<b class='flag-5'>外部</b>Flash的烧写驱动(.stdlr)

    STM8CubeMXSTM32CubeMX功能一样吗?

    STM8CubeMXSTM32CubeMX功能一样吗?
    的头像 发表于 10-31 16:59 1251次阅读
    STM8<b class='flag-5'>CubeMX</b>和<b class='flag-5'>STM32CubeMX</b>功能一样吗?