您尚未登录。

#2 Re: 感芯科技 » 【啦啦啦】给hal库弄了个mrs的工程,没装ninja和cmake的可以试试 » 2024-01-18 05:28:32

ggkkggk 说:

@游乐场 感谢提供整合好的工程,想请问这个工程如何从外部48mhz改成内部高速rc的话,该怎麽设定呢? 谢谢。

1.在5.setting里用线程配置工具修改时钟源。
2.在4.drivers里的MC31xx_HAL_CONF.H文件修改SYS_CORE_CLK和SYS_CORE_CLK_MHZ两个宏,内部高速是外部48M的四倍频,不过并不是很准。

#3 Re: 感芯科技 » 【代码分享】串口自收自发 » 2023-06-21 07:18:19

Copper 说:

@hameyou
串口的收好像都是程序轮询的方式啊?

是的,因为没有中断,可以使用一个线程专门轮询接收,当作一个中断函数用

#4 Re: 感芯科技 » 【快乐时间】iic主从机模拟测试没啥问题,已上传 » 2023-06-06 14:46:25

一觉睡醒又有新的想法,或许将i2c_callback这个函数放到其他线程去可以提升不少速度,晚点再试试。

#5 Re: 感芯科技 » 【快乐时间】iic主从机模拟测试没啥问题,已上传 » 2023-06-06 14:42:42

dykxjh 说:

主机模拟很简单。从机相对比较复杂。

是的,逻辑方面还好,速度方面很难搞,主机可以轻轻松松将scl搞到M级的速度,从机scl还在几K到几十K的级别。

#6 感芯科技 » 【快乐时间】iic主从机模拟测试没啥问题,已上传 » 2023-06-06 05:44:34

游乐场
回复: 4

客户发来一张原理图,一份传感器手册,一份需求文档,要求三天内完成软件开发,然后立马去现场调试不能出bug。

用的51单片机本身作为iic主机读传感器,然后还作为iic从机接受其他芯片控制,全部使用io模拟。

还好在3172的帮助下及时完成了任务,顺手把模拟iic的代码整理出来。

模拟主机部分是我几年前抄的老代码,一颗芯片可以用这套代码模拟多条iic总线。
很好用,所以我仿照主机的风格写了一套从机,当然也继承了这个特点。

主机需要实现1个延时函数和7个io操作函数,从机需要实现1个回调函数和5个io操作函数。

代码在这里:
https://gitee.com/ylc0919/mc3172/tree/master

模拟从机测试结果:在4M的线程下扫描io,最大可接受8K的scl频率
.png
.png
io.png
.png
.png

#7 感芯科技 » 【啦啦啦】给hal库弄了个mrs的工程,没装ninja和cmake的可以试试 » 2023-05-28 03:58:42

游乐场
回复: 3

https://gitee.com/ylc0919/mc3172_mrs/
mrs.png
好久没更新了,最近拿到二代开发板,测试点了灯没啥问题。

依我这半年的使用来看,io口、串口、delay、锁、printf、模拟iic主这几个功能挺稳定。

#8 Re: 感芯科技 » MC3172 烧录求助 » 2023-05-26 18:38:32

WKKF_o1 说:

无在虚拟机里的win10测试了下,可以烧写,就是速度奇慢。

这个问题我也发现了,有时候速度很快,有时候速度很慢,鼠标悬停在烧录页面一般来说会快一点。

#9 Re: 感芯科技 » 【调试记录】使用visual studio开发MC3172 » 2022-11-08 12:02:07

1066950103 说:

stm32 也可以这么玩 编译解决了 调试呢

除了keil,其他地方我只会一个printf调试大法~

#10 Re: 感芯科技 » 【代码分享】hal库现在提供互斥锁 » 2022-11-08 12:00:19

luckyfox 说:

hal库v1.2.2编译提示mc31xx_hal_spi.h文件里面#define SPI_POLARITY_HIGH            SPI_CR1_CPOL 和#define SPI_PHASE_2EDGE              SPI_CR1_CPHA 提示错误找不到SPI_CR1_CPOL和SPI_CR1_CPHA 的定义,想问下这个的定义在哪里能找到

spi部分并没有适配完成,可以直接删除

#13 Re: 感芯科技 » 【持续更新】MC3172-HAL库更新说明 » 2022-09-09 17:33:14

### HAL    1.2.2    2022-09-09
1.添加修改波特率函数,允许GPCOM在程序运行中单独修改波特率。

#15 Re: 感芯科技 » 【持续更新】MC3172-HAL库更新说明 » 2022-09-06 17:53:02

现在串口部分已经完成,对应的例程还没做好。

### HAL    1.2.1    2022-09-06   
1.修改HAL_DELAY(),现在最大可执行0xFFFFFFFFms的延时。   
2.优化hal库超时判断,包括mux和uart模块的超时,现在以更低的间隔来判断超时,也不再有额外的超时上限。   

### HAL    1.2.0    2022-09-03
1.添加uart模块。   

### HAL    1.1.2    2022-08-18
1.修改gpio部分寄存器名称。
2.将所有gpio寄存器添加到库中。
3.给gpio模块添加assert。

#16 Re: 感芯科技 » 【持续更新】MC3172-HAL库更新说明 » 2022-09-06 17:51:38

延时函数更新说明:利用内核定时器做通用delay函数

### HAL    1.1.1    2022-08-18
1.优化delay_us()延时函数,略微提高us级延时的精度。

#17 Re: 感芯科技 » 【持续更新】MC3172-HAL库更新说明 » 2022-09-06 17:49:58

基于1.1.0帖子:互斥锁说明

### HAL    1.1.0    2022-08-14
1.添加hal库全局资源管理模块,占用一个线程,可配置。全局资源各线程循环获取,当前持有资源的线程下次将会最后判断。     
2.添加互斥锁。 
3.给printf()函数使用互斥锁。

#18 Re: 感芯科技 » 【持续更新】MC3172-HAL库更新说明 » 2022-09-06 17:48:20

基于1.0.2帖子:https://whycan.com/t_8596.html

### HAL    1.0.2    2022-08-11
1.添加gpio输出输出方向修改函数。

### HAL    1.0.1    2022-08-06
1.修改头文件包含,现在使用hal库统一包含#include "mc31xx_hal.h"。   
2.添加hal库通用定义及函数。   
3.修复gpio不能正确读取的问题。   

### HAL    1.0.0    2022-08-04
1.根据GPIO已知寄存器添加驱动库。

#19 感芯科技 » 【持续更新】MC3172-HAL库更新说明 » 2022-09-06 17:46:20

游乐场
回复: 7

以hal库的形式来操作MC3172,由于该系列目前只有这一款mcu,算不上真正的hal库,不过好歹形似了~

项目地址在https://gitee.com/ylc0919/mc3172/,master分支是最新库文件以及实验代码,历史代码和稳定测试例程放在其他HAL开头的分支中。

所有库文件在Drivers目录下,可直接用这个目录替换官方MC3172.h文件。   

使用hal库需包含#include "mc31xx_hal.h"

#20 Re: 感芯科技 » 【代码分享】利用内核定时器做通用delay函数 » 2022-09-06 14:36:31

又修改了一下ms级延时,以支持0xFFFFFFFFms的延时。

void HAL_Delay(u32 Delay)
{
    while(Delay>80000){
		delay_us(80000*1000);
		Delay-=80000;
	}
	delay_us(Delay*1000);
}

#21 Re: 感芯科技 » 【代码分享】利用内核定时器做通用delay函数 » 2022-09-06 14:34:40

今天又发现一个简单的延时,叫他版本3吧,代码如下:

版本3
void delay_us(u32 nus)
{
    u32 start,stop,ticks;
    start=CORE_CNT;
    ticks = nus * SYS_CORE_CLK_MHZ/4; 
    while(CORE_CNT-start<ticks){}
}

顺手测了一下误差。结果如下:
delay误差.png
3比2少了一个判断和一个加减语句,但是每次循环多一个减法语句,误差不如2稳定,但是代码量小,用哪个大家自己决定。

#23 Re: 感芯科技 » 【调试记录】3172居然能跑波特率50M串口 » 2022-08-31 23:34:28

1847123212 说:

也没有ttl串口芯片能顶得住50Mbps到电脑啊

那确实

#25 Re: 感芯科技 » 【代码分享】利用内核定时器做通用delay函数 » 2022-08-31 09:13:03

由于每次调用该延时都有几us的误差,所以做长延时尽量不要使用循环。

//ms延时
void HAL_Delay(u32 Delay)
{
    delay_us(Delay*1000);    //误差更小
}
void HAL_Delay(u32 Delay)
{
    while(Delay--){
        delay_us(1000);
    }
}

#26 Re: 感芯科技 » 【调试记录】3172居然能跑波特率50M串口 » 2022-08-29 23:38:46

GPCOM库函数还没想明白怎么写,不过所有相关寄存器已经放到库里了。对应寄存器手册功能描述还没测完整,V2.0有点小问题,已经在2.1修复。

#27 感芯科技 » 【调试记录】3172居然能跑波特率50M串口 » 2022-08-29 23:35:25

游乐场
回复: 10

测试GPCOM寄存器,顺手测了一下极限速度,发现最高能被识别50M波特率,再多就乱码了。

代码部分:
.png

逻辑分析仪测试结果:
50M串口波形.png

#30 Re: 感芯科技 » 弄了一个民间版本的MC3172寄存器参考手册,目前完成GPIO部分,持续更新。。 » 2022-08-21 19:42:32

0x0180    GPIOx_IDSR    输入数据寄存器,有锁存
0x0190    GPIOx_IDFR    输入数据寄存器,无锁存

#define GPIO_READ_REAL_INPUT_VALUE_ADDR         0x0180  //IDFR 端口输入数据寄存器  无触发器  r
#define GPIO_READ_SAFE_INPUT_VALUE_ADDR         0x0190  //IDSR 端口输入数据寄存器  有触发器  r

这两个有没有搞反,不了解硬件,我不太懂锁存和触发器的关系

#31 Re: 感芯科技 » 【代码分享】利用内核定时器做通用delay函数 » 2022-08-18 14:41:24

群里的青菜大佬vegetableswim给出了一个更优的解决方案,在100us内延时比原版代码更优,2us延时误差减小超过10%,以下是两种代码

原版:
void delay_us(u32 nus)
{
    u32 ticks;
    u32 told, tnow, tcnt = 0;
    GET_CORE_CNT(told);                             //读取内核定时器数值
    ticks = nus * SYS_CORE_CLK_MHZ/4;                                   //目标延时节拍数=需要延时时间(us)*CORE_CLK(MHz)/4
    while (1)
    {
        GET_CORE_CNT(tnow);
        if (tnow != told)
        {
            if (tnow < told)tcnt = 0xFFFFFFFF - told + tnow; //CORE_CNT递增32位,计算已延时节拍数
            else tcnt = tnow - told;
            if (tcnt >= ticks)break;                   //延时完成
        }
    };
}
优化版:
void delay_us(u32 nus)
{
    u32 start,stop,ticks;
    start=CORE_CNT;
    ticks = nus * SYS_CORE_CLK_MHZ/4; 
    if(0xFFFFFFFF-start>=ticks){
        stop=start+ticks;
        while(CORE_CNT<stop && CORE_CNT>start){}
    }
    else{
        stop=ticks-(0xFFFFFFFF-start);
        while(CORE_CNT>start){}
        while(CORE_CNT<stop){}
    }
}

#32 Re: 感芯科技 » 【代码分享】hal库现在提供互斥锁 » 2022-08-18 09:06:32

lignin 说:

大佬来搞个重入锁,可以多次锁,linux里面有提供这个,最近用rtos用用到这个功能

我这个锁也可以递归,锁多次

#35 Re: 感芯科技 » 【代码分享】hal库现在提供互斥锁 » 2022-08-14 23:23:02

添加了基于官方开发板的测试程序,程序在仓库的hal_mux分支,master分支我会尝试一些奇奇怪怪的功能,不适合大家参考。
https://gitee.com/ylc0919/mc3172/tree/hal_mux/
工程基于梦程的cmake,用visual studio 和vs code打开均可,原开源地址在https://github.com/dreamcmi/MC3172-CMake.

#36 Re: 感芯科技 » 【代码分享】hal库现在提供互斥锁 » 2022-08-14 22:54:17

support_gxchip 说:

游总这速度真是太快了

之前有俩bug卡住了,真是吃不香睡不香啊,只能打打牌勉强度日的样子。

#37 Re: 感芯科技 » 【代码分享】hal库现在提供互斥锁 » 2022-08-14 22:52:50

海石生风 说:

一般来说,create接口是基于malloc的动态内存分配,init接口对应的则是静态内存分配即静态变量,我说的是你的命名容易误导、初始化过程太复杂。

那好像确实有点,不过我的创建锁就是从全局所有空闲锁链表取一个,标记成已使用的,并不复杂,叫create应该没啥问题,或许叫get也可以,不过又怕和pend混淆了。

#38 Re: 感芯科技 » 【代码分享】hal库现在提供互斥锁 » 2022-08-14 11:54:36

@海石生风
第一,官方实现的问题,如果官方有能力,我建议他实现一切东西,我做产品直接cv多好。驱动任何传感器都是在造轮子,而mc3172明显是新车,官方为什么没有提供,谁都清楚。

第二,关于rtos,群里已经讨论很多了,真正玩这个芯片就能感受到区别,我一时半会也讲不清楚。

第三,如果核间通信比全局变量方便...

第四,我拒绝在单片机使用malloc,关于hal库的互斥锁,如果遇到bug了来这里说一下哦,谢谢。

#39 感芯科技 » 【代码分享】hal库现在提供互斥锁 » 2022-08-14 03:30:21

游乐场
回复: 19

MC3172使用全局变量做线程间通信,如何解决线程对全局资源的访问冲突问题是肯定绕不开的,自从上次给出了一种全局资源管理方法以来已经五天了,当时的两个问题属实有点把我难住了。

基于以上方法,我参照LiteOS的互斥锁做了一个MC3172的锁,刚好解决了之前遗留的两个问题,代码在此:https://gitee.com/ylc0919/mc3172/.

各种小bug困扰了我很久,刚刚测试通过,还没有来得及整理测试示例,有空我会做一个如GPIO一样的互斥锁demo分支,先来看看锁的效果:

1.png
2.png

互斥锁模块向外提供5个函数,其中常用的只有两个。
.png

顺便提一下,现在本工程中的printf()函数已经可以安全的使用了。

#40 Re: 感芯科技 » 【代码分享】用stm32的hal库的形式来操作MC3172的gpio » 2022-08-14 00:12:16

简单修改,添加了基于官方开发板的测试程序,程序在仓库的hal_gpio分支,master分支我会尝试一些奇奇怪怪的功能,不适合大家参考。
https://gitee.com/ylc0919/mc3172/tree/hal_gpio/
hal_gpio分支代码基于梦程的cmake,用visual studio 和vs code打开均可,原开源地址在https://github.com/dreamcmi/MC3172-CMake.

#42 Re: 感芯科技 » 【代码分享】一种解决全局资源访问冲突的方法以及两个未解决的问题 » 2022-08-09 11:01:08

enqying 说:

嵌入式os 线程管理方法(链表) 申请、优先级、 注册 、阻塞、注销(硬件线程 和软件线程管理应该一样),  你这位高手肯定能做到

这颗芯片不适合做动态线程管理,有点不尊重芯片特色了。

#43 感芯科技 » 【代码分享】一种解决全局资源访问冲突的方法以及两个未解决的问题 » 2022-08-09 00:40:04

游乐场
回复: 9

方法是官方老哥讲的模型,我称之为申请者与审核者。一个线程审核所有全局资源,其他线程申请。

按照这个思路,我以论坛老哥提供的printf做实验,写了几行代码来操作测试。

直接上代码:
.png
.png
printf.png

多线程printf串口打印测试通过,无乱码。

有两个问题:
1是如果第一个线程申请速度过快,其他所有线程都阻塞,一直是线程1在打印。
2是这样管理全局资源属实太麻烦了,每一个全局资源都需要新增三个变量和两个循环来管理。怎么样才能做成通用锁。

以前都是直接cv代码,没思考过这方面问题,一时半会还想不到办法。

#44 感芯科技 » 【调试记录】测试串口,解决两种串口乱码问题 » 2022-08-06 22:55:18

游乐场
回复: 2

今天下午200M晶振到手,焊上去重新分配了一下线程时钟,测了一下延时,果然舒服多了。

但是测串口的时候9600和921600乱码了,而115200和25600正常,咨询了官方老哥之后才知道两种乱码原因还不一样。

首先来看一下串口初始化代码。
.png

引脚部分很简单,照着例子改就行,核心是三个频率:时钟分频、外设时钟、波特率。

外设时钟=系统时钟/时钟分频

我用的外部有源晶振做系统时钟200M,分频256,所以外设时钟=200000000/256=781250。

那么如何确定系统分频呢(敲黑板),我的串口乱码就是因为分频错了。官方说明是 外设时钟/波特率 的结果最好在100到200之间。

我的9600乱码是因为当时时钟分频选了64,外设时钟/波特率 超过了255,溢出了。
921600乱码是因为当时时钟分频也选了64,外设时钟/波特率 才3点多,不够。

#46 感芯科技 » 【代码分享】用stm32的hal库的形式来操作MC3172的gpio » 2022-08-04 22:34:03

游乐场
回复: 3

用过不少单片机,stm32的hal库给我留下了极其深刻的印象,那么不妨试试用hal库的方式打开MC3172吧。

代码在此 ,目前gpio部分基本完成,由于需要对照修改,工程中文件比较乱,仅使用图中三个文件即可,如果只体验gpio,可以直接用MC3172_hal.h替换官方MC3172.h,注意修改头文件包含。
gpio.png

使用效果如下:
gpio_test.png

#47 Re: 感芯科技 » 【调试记录】使用visual studio开发MC3172 » 2022-08-03 09:04:28

这个printf库不是线程安全的,只能拿来临时用用

#48 Re: 感芯科技 » 【代码分享】利用内核定时器做通用delay函数 » 2022-08-03 09:03:07

miaoguoqiang 说:

GET_CORE_CNT 宏展开是什么

是读取内核定时器的计数器,取一个指针的值

#49 Re: 感芯科技 » 【调试记录】使用visual studio开发MC3172 » 2022-08-02 09:32:49

添加 printf库之后,需要将CMakeLists.txt中链接参数的-nostdlib -nodefaultlibs 这俩去掉。

#50 感芯科技 » 【调试记录】使用visual studio开发MC3172 » 2022-08-01 22:27:14

游乐场
回复: 5

芯片官方示例用的是mounriver studio,关于这个mrs用的怎么样呢,我简单说两句,至于我的身份,你明白就行,总而言之,这个事呢,现在就是这个情况,具体的呢,大家也都看得到,我因为这个身份上的问题,也得出来说那么几句,可能,你听的不是很明白,但是意思就是那么个意思,我的身份呢,不知道的你也不用去猜,这种事情见得多了,我只想说懂得都懂,不懂的我也不多解释...

不好意思拿错剧本了,咱回到正题,如果你用mounriver跑通了官方例程,又恰好装了vs2019及以上版本(我试了2019和2022没问题,其他不知道),那么就可以试试用vs来开发,否则本贴建议就看个乐。

示例工程放在了https://gitee.com/ylc0919/mc3172_vs.

逻辑大概就是在vs的框架里使用cmake和ninja来构建工程,cmake由梦程提供,开源地址在https://github.com/dreamcmi/MC3172-CMake.

使用效果是这样的:
vs开发mc.png

#51 Re: 感芯科技 » 【代码分享】利用内核定时器做通用delay函数 » 2022-08-01 16:08:39

如果用y=kx+b的方式表示延时曲线,假设准确延时为直线y=x,实测内部192M时钟源情况下,12M线程延时大概是y=0.99415x+1.245,x为期望延时,y为实测延时。

根据经验分析,k值应该是时钟误差,换用外部晶振可以减小。b值则是调用函数、取值、译码、计算等造成的,线程频率越高,误差越小。

在以上猜测基础上,10us以内延时用本代码没有什么精确性可言,且各线程误差受线程频率影响较大。不考虑时钟误差的情况下,延时越长越精确,不同频率的线程延时结果越接近,如果是ms级延时,则可以认为是通用延时。

我脑补了半天也没想到10us以内的通用延时怎么写。

#53 感芯科技 » 【代码分享】利用内核定时器做通用delay函数 » 2022-08-01 00:52:23

游乐场
回复: 11
void delay_us(u32 nus)
{
    u32 ticks;
    u32 told,tnow,tcnt=0;
    GET_CORE_CNT(told);                             //读取内核定时器数值
    ticks=nus*48;                                   //目标延时节拍数=需要延时时间(us)*CORE_CLK(MHz)/4
    while(1)
    {
        GET_CORE_CNT(tnow);
        if(tnow!=told)
        {
            if(tnow<told)tcnt=0xFFFFFFFF-told+tnow; //CORE_CNT递增32位,计算已延时节拍数
            else tcnt=tnow-told;
            if(tcnt>=ticks)break;                   //延时完成
        }
    };
}

delay.png

#54 感芯科技 » 【调试记录】调整芯片主频之后串口需要修改串口初始化代码 » 2022-08-01 00:08:27

游乐场
回复: 2

熟悉芯片,直接把例程的串口超出来,用于打印logo,全部默认配置测试通过了。

然后准备测试延时,正好看到有1.12版本发布了,顺手更新了554的固件,又顺手修改了一下各线程时钟分配,把主时钟改称192M,再测试发现串口开始打印乱码了。

想了想,时钟加了四倍,那把串口设置的时钟直接从12000000改成48000000不就完事了?

改完一测发现不行,还是乱码,又看了一遍串口初始化代码,发现与时钟相关的还有一处,我把原来的4分频改成16分频,串口时钟还原到12M,再测试,打印正常了。

猜测可能是因为这个串口外设时钟有什么限制。

.png

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn