华芯微特

01、应用描述

ISP(In System Programming),在系统编程,使用片内驻留出厂引导程序(BootROM)配合UART / SPI等外设进行烧录。

华芯微特全系MCU的ISP操作说明:当芯片上电后检测到 ISP 引脚持续 5ms 以上的高电平后,将会进入 ISP(在应用编程)模式,片内的用户程序将不会得到执行,此时配合使用华芯微特的上位机(SYNWIT-PRG_Vxx.exe)通过串口执行程序擦除、更新等动作。

1.png

对于华芯微特全系列MCU在板级设计中ISP引脚处理:在板级设计中必须留出ISP引脚,防止调试过程中芯片锁死或不正常工作后,通过SWD端口已无法接入内核访问,即常规意义上的“变砖”,此时可通过ISP串口擦除恢复初始状态,可以看出ISP作为一种保留手段在突发意外情况时十分有效。此外,为避免外围环境干扰导致芯片ISP端口在上电时被拉高而误入ISP模式,常见表现为程序未得到执行,故在板级设计中ISP端口推荐接10K下拉电阻。

特别地,SWM181、SWM190系列芯片有所差异:如果产品开发过程中有应用userboot功能,当芯片上电后检测到ISP引脚持续5ms以上的高电平后,将优先执行userboot程序,ISP功能将不会执行,只能通过SWD方式进行程序的擦写。所以在userboot调试过程中,初始化完成系统时钟后,预留一大段延时,以免在userboot程序或APP程序调试过程中,锁死SWD导致无法连接下载烧写的情况,而在userboot调试完毕后可以去掉上述延时。另外,由于上述机制,在userboot功能应用中,ISP端口必须外接上拉。

02、应用举例

ISP引脚,一般在正常工作模式或SWD烧录时置位低电平,或接下拉电阻;在需要用ISP串口烧录时,把ISP引脚置高电平,上电或复位MCU,在对应的串口擦除程序或烧录软件。具体操作方式如下:

以SWDM-QFP100-34SVEA3板子为例

步骤1:ISP 引脚(A8)接 3.3V 重新上电 (或按一次 MCU 的复位脚按键),把 SWD 烧录口的 B12 B14 按下图接 CH340 的串口。

2.png

步骤2:打开SYNWIT-PRG_Vxx.exe,选择SWM341系列,点击确认

3.png

步骤3:选择操作接口为UART,波特率为115200,选择MCU模式,打开串口,复位MCU后立马点击握手,显示握手成功,如下图所示。

4.png

步骤4:点击全部擦除,稍等片刻后提示擦除成功,此时芯片内程序已被擦除,断开ISP引脚和3.3V的连接,重新上电或复位,芯片可以正常使用。

5.png

来源:华芯微特32位MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 39

此文章介绍SWM32S基于5寸800*480分辨率液晶屏+GT9157触摸芯片的驱动实现过程。

硬件

MCU:SWM32SRET6

TFT-LCD:5.0寸 800*480电容屏

触摸芯片:GT9157

MCU

SWM32S 内嵌 ARM Cortex-M4 控制器,片上包含精度为 1%以内的 20MHz/40MHz 时钟,可通过 PLL 倍频到 120MHz 时钟,提供多种内置 FLASH/SRAM 大小可供选择,支持 ISP(在系统编程)操作及 IAP(在应用编程)。

外设串行总线包括 1 个 CAN 接口,多个 UART 接口、 SPI 通信接口(支持主/从选择)及 I2C 接口(支持主/从选择)。此外还包括 1 个 32 位看门狗定时器, 6 组 32 位通用定时器, 1 组 32 位专用脉冲宽度测量定时器, 12 通道 16 位的 PWM 发生器, 2 个 8 通道 12 位、 1MSPS 的逐次逼近型ADC 模块, 1 个 SDIO 接口模块, TFT-LCD 液晶驱动模块以及 RTC 实时时钟、 SRAMC、 SDRAMC、NORFLC 接口控制模块,同时提供欠压检测及低电压复位功能。

触摸芯片

1.png

GT9157拥有26个驱动通道和14个感应通道,以满足更高的touch 精度要求。同时支持最先进的短距离传输功能HotKnot。GT9157可同时识别5个触摸点位的实时准确位置,移动轨迹及触摸面积。并可根据主控需要,读取相应点数的触摸信息,其内部结构如上图所示。

2.png

GT9157触控芯片有两个备选的I2C通讯地址,这是由芯片的上电时序决定,如图所示。上 电时序有Reset 引脚和INT引脚生成,若Reset引脚从低电电平转变到高电平期间,INT 引脚为高电平的时候,触控芯片使用的I2C设备地址为0x28/0x29(8位写、读地址),7位地址为0x14;若Reset引脚从低电电平转变到高电平期间,INT 引脚一直为低电平,则触控芯片使用的I2C设备地址为0xBA/0xBB(8位写、读地址),7位地址为0x5D。

代码

3.png

红色框内文件相对重要并解读

( 1) bsp_I2C_GT9XX.c 文件的解读

#include "bsp_I2C_GT9XX.h"
#include "string.h" 
#include "bsp_SysTick.h"
#include
void I2C_Mst_Init(void)
{     
      I2C_InitStructure I2C_initStruct;     

      PORT_Init(PORTA, PIN4, FUNMUX0_I2C0_SCL, 1); // GPIOA.4配置为I2C0 SCL引脚
     PORT_Init(PORTA, PIN5, FUNMUX1_I2C0_SDA, 1); // GPIOA.5配置为I2C0 SDA引脚     

     I2C_initStruct.Master = 1;
     I2C_initStruct.Addr7b = 1;
     I2C_initStruct.MstClk = 400000;
     I2C_initStruct.MstIEn = 0;
     I2C_Init(I2C0, &I2C_initStruct);     

     I2C_Open(I2C0);
 }

void bsp_GT9XX_InitRst(void)
{
     // 第一阶段设置端口,并拉低两个端口
     GPIO_Init(GPIO_PORT_GT_RST, GPIO_PIN_GT_RST, 1, 0, 0);    // 复位脚 输出
     GPIO_Init(GPIO_PORT_GT_INT, GPIO_PIN_GT_INT, 1, 0, 0);    // 中断脚 
     GPIO_ClrBit(GPIOC, PIN3);
     GPIO_ClrBit(GPIOC, PIN2);      // 拉低两个端口的电平,准备复位
     rt_thread_delay(10);
     // 第二阶段复位芯片
     GPIO_SetBit(GPIOC, PIN3);      // 拉高开始复位芯片
     rt_thread_delay(10);
     // 第三阶段设置中断引脚为 中断功能
     GPIO_Init(GPIOC, PIN2, 0, 0, 0);
     EXTI_Init(GPIOC, PIN2, EXTI_RISE_EDGE);   // 上升沿触发中断
     I2C_Mst_Init();         // 硬件IIC端口初始化
     rt_thread_delay(10); 
}
    
void GT9XX_IRQEnable(void)
{
     NVIC_EnableIRQ(GPIOC2_IRQn);     // 使能GPIOC.2端口中断
     EXTI_Open(GPIOC, PIN2);       // 打开外部中断  

}
void GT9XX_IRQDisable(void)
{
     NVIC_DisableIRQ(GPIOC2_IRQn);     // 禁止GPIOC.2端口中断
     EXTI_Close(GPIOC, PIN2);      // 关闭外部中断      

     GPIO_Init(GPIOC, PIN2, 1, 0, 1);    // 回到普通输出端口
     GPIO_ClrBit(GPIOC, PIN2);
}
/********************************************************************************************************************** 

* 函数名称: bsp_WrNumByte()
* 功能说明: IIC写Num个字节 
* 输    入: reg 寄存器地址,*p数据,WrByteNum写入的数据个数
* 输    出: 0,正常     其他,失败
* 注意事项: 
**********************************************************************************************************************/
uint8_t bsp_GT9XX_WrReg(uint8_t IdAddr,uint8_t *p,uint8_t WrByteNum)
{
      I2C0->MSTDAT = IdAddr | 0;       // 发送器件地址+写命令
     I2C0->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) | 
     (1 << I2C_MSTCMD_WR_Pos);  // 发送起始位和从机地址
     while(I2C0->MSTCMD & I2C_MSTCMD
}

以上程序是我们为移植“ bsp_GT9XX.c”文件做的基本驱动,接下来我们详细分析一下,

这部分源码具体实现了什么功能。I2C_Mst_Init()函数中,我们首先声明了一个结构体,接着将 GPIOA.4 和 GPIOA.5进行了特殊功能管脚的分配,设置为 I2C 接口。接着是给结构体赋值, 他们的意义分别是设置为主机模式;地址为 7 位接口;I2C 通信时钟频率设为 400HHz;不使能中断模式,接着是调用库函数进行给寄存器赋值;最后打开 I2C 接口。接下来 bsp_GT9XX_InitRst()函数为初始化,主要是设置端口,并将 GT9157 的设备 I2C 地址设置为 0xBA,这个设置过程参加上面的时序;接着将 GPIOC.2 设置为中断,上升沿触发。函数 GT9XX_IRQEnable()和 GT9XX_IRQDisable(),顾名思义,就是使能中断和失能中断,这个好理解最后就是两个读写 GT9157 寄存器的函数,这两个函数,需要读者先理解 I2C 通信的基本协议,之后安装基本协议,一句、一句的理解,这里需要注意的是

I2C0->MSTCMD = (1 << I2C_MSTCMD_RD_Pos)  |
(1 << I2C_MSTCMD_ACK_Pos) |
(1 << I2C_MSTCMD_STO_Pos);

这三行程序,当我们在跑该程序的时候, 一般是先写寄存器,再读数,而此时如果没有这三行程序,会把下一次的读数据和写寄存器混淆,导致 GT9157 芯片不认识此协议。当我们加了之后,就有结束,有开始,继而芯片能够识别此协议。

现象

复位 初始化后串口打印,可以看到x轴800 ,y轴480

4.png

进行一个点的触摸 ID:0 定位是(257,237) 宽度62

5.png

进行两个点的触摸 可以看到ID0  ID1

6.png

进行五个点的触摸 可以看到ID0  ID1  ID2  ID3  ID4

7.png

附录:

主程序代码:

#include "bsp_uart.h"
#include "rtthread.h"
#include "ugui.h"
#include "bsp_gt9xx.h"
     
extern void GTP_TouchProcess(void);     
UG_GUI gui;
uint32_t LCD_Buffer[800*480 * 2 / 4] __attribute__((at(SDRAMM_BASE))) = {0};

void _HW_DrawPoint(UG_S16 x, UG_S16 y, UG_COLOR c)
{
    LCD_Buffer[y*400 + x/2] &= ~(0xFFFF << ((x%2) == 0 ? 0 : 16));

    LCD_Buffer[y*400 + x/2] |=  (c      << ((x%2) == 0 ? 0 : 16));
}     

ALIGN(RT_ALIGN_SIZE)       // 以字对齐(4字节)
static rt_uint8_t rt_Test_thread_stack[1024]; // 线程栈    
    // 线程Test
static void Test_thread_entry(void* parameter)
{
    printf("\r RGB工程初始化OK ...... \r\n");     

    LCD->SRCADDR = (uint32_t)LCD_Buffer;
    LCD_Start(LCD);
    UG_Init(&gui,(void(*)(UG_S16,UG_S16,UG_COLOR))_HW_DrawPoint,800,480);
    GTP_Init_Panel();
    while(1)
    {
    }
}
     
int main(void)
{
    static struct rt_thread Test_thread;   // 线程控制块  
    printf("SWM320 \r\n");  
     
    // 创建静态线程
    rt_thread_init(&Test_thread,                  // 线程控制块
    "Test",                        // 线程名字,在shell里面可以看到
    Test_thread_entry,             // 线程入口函数
    RT_NULL,                      // 线程入口函数参数
    &rt_Test_thread_stack[0],      // 线程栈起始地址
    sizeof(rt_Test_thread_stack),   // 线程栈大小
    5,           // 线程的优先级
    20);                          // 线程时间片
    rt_thread_startup(&Test_thread);              // 启动线程
}

void LCD_Handler(void)
{
    LCD_INTClr(LCD);
    LCD_Start(LCD);
}

void GPIOC2_Handler(void)
{
    EXTI_Clear(GPIOC, PIN2);     // 清楚中断标志位
    GTP_TouchProcess();    
}

来源:华芯微特32位MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 64

SYNWIT 单电阻空气净化器电机驱动 DEMO 方案, 低压 PMSM 电机,软件上采 用SVPWM 空间电压矢量调制技术,直接闭环启动,相比传统方波效率提高 15%, 具有更小的谐波分量及转矩脉动,同时采用 32 位高速 MCU 芯片SWM201GS7_SSOP28 封装为主控,为驱动算法运行、速度提升及转矩调节精度提供保障。具有低噪音、低损耗、运行平稳、使用寿命长、无极调速等技术优势, 为广大客户提供高性价比、稳定可靠的 DEMO 方案参考。

“单电阻空气净化器电机驱动DEMO板实物图和接口说明"
单电阻空气净化器电机驱动DEMO板实物图和接口说明

DEMO功能特点

“基于32

“基于32

DEMO测试过程中温升测试

“基于32

DEMO 资料

原理图

预驱电路、测温电路

“基于32

MCU 主控、复位电路

“基于32

“基于32

动电路 、电流采样电路

“基于32

外围调速、反馈、通讯、母线电压检测、指示灯电路

“基于32

待机功耗

在关闭一部分内部电路, 可以 PWM 调速唤醒, 实测在 12V 供电时, 12V 输入端的电 流是 10mA 以下,合 0. 12W。

测试过程中温升测试

“基于32

重要波形记录

01、低挡启动波形(调速占空比 10%)

“基于32

放大细节

“基于32

02、电机高档位启动波形(调速占空比 100%)

“基于32

放大细节

“基于32

03、电机稳定运行波形

“基于32

放大细节

“基于32

04、电机顺风启动波形

“基于32

放大细节

“基于32

05、电机逆风启动波形

“基于32

放大细节

“基于32

06、电机堵转波形

“基于32

放大细节

“基于32

07、电机关机波形

“基于32

08、电机驱动信号波形

“基于32

09、5V 输出纹波

“基于32

附图

01、原理图

“基于32

02、空气净化器实物图

“基于32

“基于32

更改记录

电源供电为 24V 或 12V,更改供电电压即可,文件内不作变更。

…………2022.01.14

来源:华芯微特32位MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 73

SWM341系列 86盒智能开关应用

华芯微特SWM341系列的SWM34SRET6,在86盒智能开关产品中的应用。

SWM34SRET6性能和UI的描述

SWM34SRET6是一款基于ARM Cortex-M33内核,最高主频可达150MHz时钟,提供内置512KB Flash,64KB SRAM,8MB SDRAM,具有RGB565或MPU I8080接口方式驱动TFT-LCD模组的LCDC模块,同时用于有丰富的接口可拓展,集显示和控制于一体的32位MCU。

针对86盒智能开关触摸屏产品,应用SWM34SRET6做了以下显示和控制

“SWM341系列之

显示采用4寸电容触摸,480x480分辨率的IPS TFT-LCD模组。采用RGB565接口驱动显示,通过PWM进行背光调节,I2C接口的电容式触摸控制。实现86盒产品的UI显示,平滑的触摸操控,可按照白天、黑夜或环境光线的变化自动调节显示亮度。

应用 GUI-Guider 上位机平台设计 UI 布局,快速自动生成代码,便于开发人员迅速上手。

“SWM341系列之

“SWM341系列之

拥有多钟扩展外设接口

USB 2.0接口可用于更新显示内容,可进行应用程序的升级;ADC 接口可监测环境亮度等模拟量以实现显示调节;CAN 总线可用于现场多种设备之间的通讯;GPIO 接口可用于控制设备供电的继电器或检测外部中断的变化;DAC 接口可实现语音的播报。

通过SPI 或 UART接口可搭载WIFI模块,实现云端数据的传输,获取天气、时间等数据进行语音播报;可通过语音识别功能进行操控;可传输WIFI模块中Camera 数据在TFT-LCD 模组上进行显示;可传输数据进行显示内容的更新等。

下图为SWM34SRET6与MT7933 WIFI模块的调试应用。MTK7933跟SWM341通过SPI接口相连。其中MTK7933作为SPI的master,SWM341作为slave,稳定通信时钟可达30Mbps。

“SWM341系列之

“SWM341系列之

“SWM341系列之
SWM341系列之 86盒智能开关应用

来源: 华芯微特32位MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 429

01、TIMER定时器之脉冲发送功能

我们今天详细讲解一下TIMER的ADC触发功能。

SWM190的TIMER2/3支持SAR ADC触发功能,此功能配置为定时器或脉冲发送均有效,可通过配置相应寄存器实现。

将SAR ADC CTRL寄存器中TRIG设置为TIMER2触发或TIMER3触发。TIMER可作为定时器或计数器(支持级联)使用。当对应TIMER计数值减至0时,将触发ADC CTRL寄存器中选中的通道(CHx)进行采样。可以通过ADC采样完成中断进行结果获取。

TIMER触发支持单次模式和连续模式,且支持多次采样求平均值。

02、SWM190 TIMER触发ADC功能库函数配置

下面我们以ADC触发为例,使用加强型定时器,使用TIMR3的定时器模式触发ADC0的CH3。在此例程中,我们将用A13作为ADC0的采样通道,一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果。

我们之前有讲到PORT的配置方法,在这里就不在做赘述,将A13引脚通过PORT_Init设置为ADC的输入功能引脚(PORTA_PIN13_ADC0_IN3),并将TIMER0模块功能在TIMR_Init初始化为定时器模式(TIMR_MODE_TIMER)。

下面是一个简单的ADC配置函数。

ADC_initStruct.clk_src=ADC_CLKSRC_HRC_DIV8;

ADC_initStruct.channels = ADC_CH3;

ADC_initStruct.samplAvg= ADC_AVG_SAMPLE2;

ADC_initStruct.trig_src = ADC_TRIGGER_TIMR3;

ADC_initStruct.Continue = 0;   

//非连续模式,即单次模式

        ADC_initStruct.EOC_IEn = 0;

        ADC_initStruct.OVF_IEn = 0;

ADC_Init(ADC0,&ADC_initStruct);   //配置ADC

我们通过结构体的方式配置ADC,使用ADC0的CH3通道进行采样,触发源为TMIER3,单次触发模式,一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果。

具体配置函数如下图所示:

“华芯微特MCU之TIMER触发ADC"

03、实验现象

下载好程序后,串口会打印A13端口的电压值对应的ADC值。

以上是关于TIMER的ADC触发功能介绍。

来源:华芯微特32位MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 89
订阅 RSS - 华芯微特