沁恒CH582

2023-10-13 10:40
文章标签 沁恒 ch582

本文主要是介绍沁恒CH582,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、串口打印

二、SD卡

2.1:SD卡容量读取

2.2 :由模拟SPI读写改成硬件SPI

2.2.1 模拟SPI

2.2.2 模拟SPI        

2.2.3 SPI速率问题

三、触摸

四、TMR定时器 (22.11.1)

 五、BLE(22.11.2)

六、ADC采样

七、低功耗


一、串口打印

新板的串口为UART3,默认配置的是UART1.需要修改以下两处完成UART3的串口打印

#ifdef DEBUGGPIOA_SetBits(bTXD3);GPIOA_ModeCfg(bTXD3, GPIO_ModeOut_PP_5mA);UART3_DefInit();

这个是用来选择串口打印的宏定义处,只需要将DEBUG=x的x改变即可。

printf 可以勾选这个配置,那么就不需要加换行。

串口配置相关文章:

有关MounRiver打印问题(转行符和浮点数) - Risc5_BLE - 博客园

有关MounRiver更改打印串口 - Risc5_BLE - 博客园

二、SD卡

2.1:SD卡容量读取

        SD卡用的是Zetta(澜智)_SD NAND ZDSD01GLGEAG  1Gbit(128MByte),调试时SD卡初始化一直失败,用示波器读取CS\CK\MOSI均有波形输入,MISO无波形输出后排除是因为SD卡虚焊问题;

        利用FATFS文件系统读取,测试代码如下;

if(events & FS_SPI_INI_EVT){if(fnSdInit()){PRINT("SD Card Error!\n");}else{uint32 uSize;PRINT("SD Card Ok!\n");uSize = fnSdGetSectorCount();PRINT("SectorCounts=%d\n",uSize);PRINT("容量=%dM\n",uSize>>11);//                tmos_set_event(fs_test_TaskID,FS_TEST_EVT);}tmos_start_task(fs_test_TaskID,FS_SPI_INI_EVT,1000);return (events ^ FS_SPI_INI_EVT);}

        FATFS一次是读写一个块的数据一个块512B,247808个块/2/1024 = 121M,

        用MSC模拟U盘后得到的内存大小通上面计算一致

 

2.2 :由模拟SPI读写改成硬件SPI

2.2.1 模拟SPI

        CH582只有一个硬件SPI只有一个SPI0,V1.0的开发板版本么没有注意SD卡槽连接的是SPI1口。

        V1.0的开发板用的是IO模拟SPI速率较慢,不用在初始化SD卡时SPI速率要降低初始化完成后再将SPI速率提高(SD卡的初始化速度不能大于400KHz,最高不超过15MHZ ????还有待确认);

        速率读写测试函数

if(FR_OK == fr){fr = f_open(file, "0:2B.WAV", FA_READ);uOrgTick = TMOS_GetSystemClock();do{if(FR_OK != f_read(file, pFatBuf, 512, &br)){PRINT("fr ng!\n");break;}uLens += br;}while(uLens < 1024*1024*4);f_close(file);uNewTick = TMOS_GetSystemClock();PRINT("tick=%d,len=%d\n",uNewTick - uOrgTick, uLens);PRINT("speed=%d B/S\n",uLens*100/((uNewTick - uOrgTick)/16));}

        模拟SPI读文件速率如下 

        模拟SPI写入速率

文的读取写入主要靠SPI向SD卡发送命令,主要的函数是SD卡发送命令函数fnSdSendCmd(uint8 ucCmd, uint32 uArg, uint8 ucCrc7)。而发送命令函数主要又是由模式SPI发送读写一个字节函数fnRwSpiSdByte(uint8 ucTxData)(SPI的主机发一个数据从机就回一个数据)

inline static void fnSetSck(void)
{GPIOA_SetBits(GPIO_Pin_13);
}
inline static void fnClrSck(void)
{GPIOA_ResetBits(GPIO_Pin_13);
}
inline static void fnSetMosi(void)
{GPIOA_SetBits(GPIO_Pin_14);
}
inline static void fnClrMosi(void)
{GPIOA_ResetBits(GPIO_Pin_14);
}
inline static uint32_t fnRdMiso(void)
{return GPIOA_ReadPortPin(GPIO_Pin_15);
}uint8 fnRwSpiSdByte(uint8 ucTxData)
{uint8 ucVal = 0;for(int8_t i = 7; i >= 0 ; i--){fnClrSck();     //CLK低if(ucTxData& (1<<i)){fnSetMosi(); //发1}else{fnClrMosi();//发0}fnSetSck();    //CLK高if(fnRdMiso())   //读一个bit{ucVal |= 1<<i;}}return ucVal;       //读回的数据
}

2.2.2 模拟SPI        

        硬件的SPI不需要模拟SCK,硬件直接产生,并读写数据,原本的SPI0库函数只有读一个字和写一个字的库函数,所以需要增加一个读写一个字的函数。

__HIGH_CODE
uint8 fnRwSpiSdByte(uint8 ucTxData)
{R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;R8_SPI0_BUFFER = ucTxData; //发送的datewhile( !(R8_SPI0_INT_FLAG & RB_SPI_FREE) );return ( R8_SPI0_BUFFER ); //返回的data
}

        硬件SPI读文件速率如下 较模拟 SPI速率快一倍

2.2.3 SPI速率问题

        在初始化SD卡时SPI速率要降低初始化完成后再将SPI速率提高,

        SPI0_CLKCfg(4);  = 60/4 = 15MHz ,当分频系数小于4时SD卡读取会出现失败,具体原因??

相关参考文章:

MSP430 SD卡SPI读写操作(2) —— SD卡SPI操作流程_Zn的博客-CSDN博客

FATfs源码解析_天使画笔的博客-CSDN博客_fatfs源码

三、触摸

触摸Touch:参照官方例程库

参考文章:电容触摸按键

四、TMR定时器 (22.11.1)

用两定时器生成个8位的PWM组成16位的PWM,之前的方案是一个TMR加两个PWM。

现存在问题:

1:TMR定时器的配置还没搞清楚,PWM频率为什么要越高越好,以及输入数据占空比的数据处理。

2:遇到问题在用文件名播放WAV时,给播放任务发送消息时忘记将消息事件位清除掉,导致数据流断流,这个问题查找了好几天,自己还缺乏快速定位问题的能力。以及要懂得先做哪一步再做下一步更步要验证。

 

 3:代码要健壮,自己编写的消息结构还不好。

相关文章:【电子电路】(1)PWM转DAC如何实现_小石头有大内涵的博客-CSDN博客_pwm转dac

4:今天改用之前的方案即一个定时器和两个用定时器产生的PWM波播放WAV,PWM频率可以调到60M/256=234Khz,但是播放音乐时仍然存在噪音234Khz的底噪。经过排查发现不用通过USB口供电用电池供电底噪音就没有了播放的音乐正常。遂发现问题的在供电充电这一块(具体原因待...).改回原来的两个TMR产生的32KhzPWM用电池供电播放正常,且PWM波形也平滑,用USB供电PWM波形有问题。找到问题点。(22.11.2)

5:用USB供电产生底噪的原因分析(自己分析)可能是噪声耦合导致(一个芯片对另一个芯片产生的干扰)一个是输入的PWM波236K,一个是运放输出端的耦合噪声240K,解决办法:运放引脚加一个旁路电容、电源线上加一个去耦合电容。(22.11.3)。

6.用USB供电产生底噪的原因分析曾工给出的解释:通过USB供电,充电芯片供电不做导致。上述问题并非产生的是底噪,后面不管是USB供电还是电池供电输入PWM,功放输出端都有上述波形输出。是因为用USB是给充电模块供电,充电模块的输出个板子供电,充电模块输出的电流小不足以驱动功放模块的电流输出,之前PWM高电平的抖动,和播放时板子突然断电重启因为电流不够导致,因此在调试的时候应该插上电池。。(22.11.4)

参考文章:

只知道芯片旁边加一个电容是不够的!一个简单的小实验,让你马上明白“去耦电容”和“旁路电容”的工作原理_哔哩哔哩_bilibili

 五、BLE(22.11.2)

测试BLE1S的广播间隔和仅开Touch的待机功耗(22.11.3)

修改广播间隔为1s

// What is the advertising interval when device is discoverable (units of 625us, 80=50ms)
#define DEFAULT_ADVERTISING_INTERVAL         1600
//4、设置广告间隔 (units if 0.625us){uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL;// Set advertising intervalGAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt);GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt);}

从测试数据看数值还是偏大,问题点暂时未知

相关参考文章:

低功耗蓝牙BLE之修改广播间隔等参数_枫之星雨的博客-CSDN博客

【BLE】CC2541之电池电量服务_甜甜的大香瓜的博客-CSDN博客_ble电量  

蓝牙4.0 BLE peripheral 广播设置_si_zhou_qun_84342712的博客-CSDN博客

终于降了!!!蓝牙低功耗芯片CH579超低功耗0.2uA!!! - - 21ic电子技术开发论坛

请问为什么增加了hid键盘的广播间隔时间,功耗却没有变? - 沁恒微电子社区

BLE广播间隔和连接间隔(CH582) - SweetTea_lllpc - 博客园

六、ADC采样

6.1

可以考虑GPIO中断的方法检测插入、开启任务。(暂时用任务循环触发)

遇到问题:数组元素计算问题,

问题原因用prinf函数直接打印函数返回值,用函数返回值运算导致:

C语言:

打印出来的结果是Sunday Sunday、
printf的参数压栈顺序是自右至左, 也就是那两个函数调用是先执行右边的后执行左边的,然后printf才会打印出内容。
然后就是get_day()这个函数是不可重入函数,函数的返回值是buf这个静态数组的的首地址。而static变量不管声明在哪,他的空间都是分配在全局静态区的。也就是在整个程序声明周期中get_day()返回的地址永远都是buf的首地址(不会改变)。
所以你调用这个printf后, 实际上buf这个数组里面存的是最后一个执行的结果。也就是get_day(0).所以得到的结果是两个sunday 

printf的小例子_mal327的博客-CSDN博客
   (22.11.4)

参考文章:

经常需要MCU判断短按和长按的两种动作-电子发烧友网

深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)_没有余地没有余地的博客-CSDN博客_上拉输入

【BLE 5.3无线MCU CH582】8、adc采样(内部bat、内部温度,外部输入) - 国产芯片交流 - 电子工程世界-论坛

6.2完成ADC对于电压值的采样:

存在问题,在计算时要注意数据位计算的先后

ADCVal先÷2048再×1000,导致数据溢出结果错误,与实际值不符。应该先*1000,避免数据错误(22.11.6)

充电芯片相关信息:

矽源特ME4074是一款完整的单节锂离子电池用恒定电流/恒定电压线性充电芯片_输出_功能_模式

七、低功耗

7.1遇见问题:在使用Peripheral例程调试低功耗时将DEBUG宏, 关闭DEBUG 宏定义,程序不能正常运行。

原因:DEBUG宏定义,其值代表printf函数调用的putchar中,选用哪一个物理串口进行输出。由于putchar没有实际串口被选择,可能导致printf函数无法返回。   Peripheral_Init();中有打印信息,关闭DEBUG就会导致printf函数无法返回。将里面打印信息注释即可。(22.11.14)

Peripheral_Init()10S广播间隔在1.15mA

7.2      之前一直没有进行电源控制的管理,在程序中打开的HAL_SLEEP宏定义,是配置系统进行睡眠模式,其唤醒由TMOS自动管理。配置电源管理不仅仅是简单的将全部端口配置为输入下拉模式(这样空跑单片机是还运行的)没有进行任何的电源管理。今天测试用571的最小系统板拆除了芯片是多余的外设模块包括1117降压芯片用3.3V外设电源直接供电。验证不同功耗开销。

 

 下面为刷写Peripheral不同的广播间隔的功耗:

50ms广播间隔  广播模式

连接后
0.56mA

0.17mA

1s广播间隔  广播模式

连接后
2.5uA(后测为5uA)

  120uA

 

 

 上述初步排除之前582M完整版本功耗一直在1.2mA是软件问题,下一步检查582M板子上的问题点(22.11.15)。

7.3之前582M完整版本功耗一直在1.2mA是软件配置问题,IO口配置的全部为输入上拉模式,导致漏电流。

将IO改为输入下拉,和部分需要的输入上拉后整机待机功耗下降下来。

广播时的待机电流为5-6uA:

广播时的功耗1S的广播间隔30uA(4.2v/680Ω/100/2)估算值。 

(22.11.17)

4:温度检测

CH573F 使用LSI时如何关闭外部晶振 - 沁恒微电子社区 (wch.cn)

CH579 CH573 CH582 芯片使用知识分享目录 - debugdabiaoge - 博客园 (cnblogs.com)

这篇关于沁恒CH582的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/202649

相关文章

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

解决沁恒ch592单片机在tmos中使用USB总线时,接入USB Hub无法枚举频繁Reset的问题

开发产品时采用了沁恒ch592,做USB开发时遇到了一个奇葩的无法枚举问题。 典型症状 使用USB线直连电脑时没有问题,可以正常使用。 如果接入某些特定方案的USB Hub(例如GL3510、GL3520),可能会出现以下2种情况: 无法枚举,USB Hub会频繁发送Reset请求,最后系统停止识别而报错复位请求无法触发USB中断函数 此时代码具备如下特征: 使用tmos启用了低功耗设

沁恒蓝牙芯片CH582:蓝牙OTA升级技术详解与应用探索

文章目录 一、前言1.WCH 蓝牙空中升级(BLE OTA)概述2. WCH BLE SDK DFU 工作原理(方式一) 二、移植程序1.找到BackUpgrade_OTA例程2.添加文件到工程2.1 添加文件2.2 如何添加 3.修改APP工程3.1 修改peripheral_main.c文件3.2 修改peripheral.c文件 4.修改Link.Ld文件 三、OTA升级1.合并文件2

沁恒CH32V30X学习笔记08---基本定时器超时功能

TIM 基本定时器 高级定时器模块包含一个功能强大的 16 位自动重装定时器(TIM1、TIM8、TIM9 和 TIM10) 通用定时器模块包含一个 16 位可自动重装的定时器(TIM2、TIM3、TIM4 和 TIM5) 基本定时器模块包含一个 16 位可自动重装的定时器(TIM6 和 TIM7) 定时器的结构大致可以分为三部分, 输入时钟部分核心计数器部分比较捕获通道部分 时钟源

沁恒CH32V30X学习笔记07---多功能按键框架使用

多功能按键框架使用 参考开源框架: GitHub - 0x1abin/MultiButton: Button driver for embedded system 框架使用说明: ch32gpio基本驱动 https://blog.csdn.net/u010261063/article/details/136157718 MultiButton 简介 MultiButton 是一个小

沁恒CH32V30X学习笔记11---使用外部时钟模式2采集脉冲计数

使用外部时钟模式2采集脉冲计数 使用外部触发模式 2 能在外部时钟引脚输入的每一个上升沿或下降沿计数。将 ECE 位置位时,将使用外部时钟源模式 2。使用外部时钟源模式 2 时,ETRF 被选定为 CK_PSC。ETR 引脚经过可选的反相器(ETP),分频器(ETPS)后成为 ETRP,再经过滤波器(ETF)后即成为 ETRF。 在 ECE 位置位且将 SMS 设为 111b 时,那么,相当于

沁恒CH32V30X学习笔记10---pwm输出

PWM输出 PWM 输出模式 PWM 输出模式是定时器的基本功能之一。PWM 输出模式最常见的是使用重装值确定 PWM 频率,使用捕获比较寄存器确定占空比的方法。将 OCxM 域中置 110b 或者 111b 使用 PWM 模式 1 或者模式 2,置 OCxPE 位使能预装载寄存器,最后置 ARPE 位使能预装载寄存器的自动重装载。在发生一个更新事件时,预装载寄存器的值才能被送到影子寄存器,所

沁恒CH32V30X学习笔记06---串口dma接收+空闲中断组合接收数据

DMA 控制器提供 18 个通道,其中 DMA1 包含 7 个通道,DMA2 包含 11 个通道,每个通 道对应多个外设请求,通过设置相应外设寄存器中对应 DMA 控制位 通道映射 dma1 dma2 示例代码 bsp_usart_it.c /** bsp_usart_it.c** Created on: 2024年2月18日* Author: admin

沁恒CH32V30X学习笔记02--GPIO的使用教程及2次封装驱动

gpio 概述 刚复位后,GPIO 口运行在初始状态,这时大多数 IO 口都是运行在浮空输入状态 外部中断 所有的 GPIO 口都可以被配置外部中断输入通道,但一个外部中断输入通道最多只能映射到一个 GPIO 引脚上,且外部中断通道的序号必须和 GPIO 端口的位号一致,比如 PA1(或 PB1、PC1、PD1、PE1 等)只能映射到 EXTI1 上,且 EXTI1 只能接受 PA1、

沁恒CH571 CH573 CH582 CH583蓝牙芯片GPIO的基本操作

摘要:本文介绍一下沁恒蓝牙芯片GPIO点亮小灯时所需的一些基本GPIO函数。 初始化代码可以放在main函数中,也可以放在其他函数中(低电量模式下)。对,下面这一个语句就行了。模式有很多种: GPIO_ModeIN_Floating, //浮空输入                                             GPIO_ModeIN_PU,       //上拉