-
恭喜合法开车。楼主图太少,应该放多点伴娘照
-
我是潮汕人我骄傲{:1_126:}
-
信息确认无误,谢谢TI,谢谢EE
-
柱哥一代人物,引领风骚。乃是我等楷模:victory:
-
lvxinn2006 发表于 2019-1-22 11:30
评测芯片,从底层寄存器角度出发,才能看清与其他芯片的区别,如果寄存器没问题,再使用库函数会感觉简单 ...
嗯,期待楼主的继续评测帖子
-
1、楼主使用寄存器操作值得赞一波,这样在评测中更能深入了解这块MCU
2、楼主为何不妨使用下cubemx?或者官方的库接口?
-
谢谢EE,谢谢坛友们的投票,很感动。
信息确认无误
-
lcofjp 发表于 2019-1-19 14:02
可以的楼主,这波操作我给101分
从我做起,拒绝复读机
-
freebsder 发表于 2019-1-19 11:24
可以的楼主,这波操作满分
骚叔我还以为会被你喷{:1_133:}
-
另外openmv的BootLoader.dfu(bin)和openmv.dfu(bin),这两个可以说是IAP和APP。而firmware.dfu(bin)才是一个完整的固件,相当与把上述两个固件合并在一起,也就是BootLoader+openmv(IAP+APP)。BootLoader.dfu可以用在源码调试的时候提前烧录,官方的源码的中断向量地址在APP区,所以调试得先烧录bootloader作为跳转。当然你也可以不用这个bootloader,直接把中断向量地址重定向到Flash的基地址,也就是0x8000000
-
1、不是固件挂了,而是内部flash作为文件系统损坏了。你可以用SD卡挂载作为文件系统,这样就正常了。
2、内部flash作为文件系统本身就很减短flash寿命,文件系统需要提供扇区给其作为索引,而文件索引本身一直在变,该扇区也一直不停写。STM32的保守寿命只有1W次
3、没有CDC和MSC,那是因为初始化的时候,文件系统初始化就已经卡死了。
-
效果图如下:
源码在附件。感谢EE和英飞凌提供这次评测活动,楼主也是第一次玩英飞凌相关的mcu产品,其强大和丰富的外设,让楼主很惊讶,也不愧是汽车和工业上的大佬。在这段时间里,楼主也不可能吃透所有外设,加上资料上大部分是英文,而且用户手册和数据手册也一样,但是寄存器,楼主看CAN部分已经需要消耗很多时间和精力上去理解。后续在有时间的情况下,楼主会继续研究XMC4800,让此块板子继续发光发热。
-
特别要注意的是,凡是要用到ssi接口的,网页的后缀必须是shtml。楼主在这里说明下cgi接口,比如通信功能(发送),按下HID的时候,就会发送消息框的信息,那么底层会如何去解析,关于http的协议解析网上大多有说明,我这里也不多说,还好官方有提供了httpd的应用接口,我们只需要在接口上去判断两个值,分别是html的name和value。
那么我们回到底层代码上,因为在网页上已经建立了SendHID.cgi的cgi表单,那么在底层上就把这个表单进行注册。在tcp轮询的过程中去查找这个表单是否被触发,若被触发则进入接口,那么用户就可以在这个注册接口写自己的应用。
对于ssi接口的,我们需要把相关的关键词字符串写入ssi文件中,好让服务器能够查找这些字符串,然后相对应的显示在网页上
那么在底层上同样跟cgi一样处理思路
这样就完成了服务器与PC的网页交互功能。这些接口大多封装好,我们只需要学会使用此接口即可,大大省便开发流程。
-
13288507822 发表于 2019-1-7 15:35
“这里假设使用的是ST的STM32F103C8T6,该款单片机有64K flash,每个扇区为1K,一共64个扇区。在这些扇区的 ...
谢谢纠正,我多写了个F
-
lwip版本太新了?你可以试下再新建工程试试?
-
连线图如下:
git效果:
工程附件如附件,
下一贴:体验以太网+freertos+lwip移植。
-
配置完毕之后,我们需要对其进行业务逻辑编写。楼主在接收中断里面,进行接收报文,并且建立一个接收完毕标志。根据上贴的复合设备。HID的回调读写接口的写接口上判断这个接收完成标志,若成立则把此报文发送给HID,HID再发给PC。同样,HID的读接口收到了PC的数据,则把此信息发给CAN的发送报文,CAN再发给PC。
HID的写接口逻辑如下
HID的读接口逻辑如下;
效果如下:
-
那么配置好上述相关参数后,我们还需要对报文进行存储。XMC4800的报文对象有256个。每个CAN节点和唯一的报文对象列表相关联。一个CAN节点仅传送分配给该节点列表的报文对象中的报文。也就是说,一个CAN节点接收到的帧也只能存储到属于该节点的报文对象中;而一个CAN节点要发送的帧也只能在分配给该节点的报文对象中选择。
对于报文对象这块,设计实在很丰富,可以设置网关,还带FIFO。太多功能可以需要摸清,楼主也只是实现了一点小功能。而且对报文的元素列表等还不太熟悉,主要是报文列表的链表关系,还需要后续再理解。
前面说了,不管是收发的报文,都需要分配一个报文对象存储。在这里我们新建两个报文对象,一个是收一个是发。
然后再把这两个报文列表交由控制面板寄存器分配。所使用的接口,也就是唯一的接口,分配方式如下:
之后再使能报文接收对象的接收中断,在这里需要说明下CAN中断控制上,CAN模块一共有8条中断输出线,比如报文收发中断,错误帧中断等等,都可以自由分配到指定的中断输出线上,这样实现相对比较自由而且方便。而中断输出线的选择只需要INP寄存器进行切换即可。
综上可知,我们对其进行库函数编程对应的配置。
-
知道套路之后,我们再此看下配置下CAN节点的端口,以便能正常收发报文。楼主在这里稍微弄得比较简单,CAN的发送使用非中断式发送,而接收使用了中断式接收。我们先来看下RX接收部分,首先看下端口的配置,RX的GPIO配置为输入接收模式,再配置下CAN_NODE1的接收输入线,这个可以通过节点端口控制器NPCR的RXSEL寄存器进行配置。从下图可知道CAN模块有8个接收输入线,那么CAN_NODE1的接收输入线该选择哪个呢,官方手册这里给了一张表,我们可以依次找到板子对应的输入线
从下图可以看到,板载的CAN1的接收IO口为P1.13,对应的就是N1_RXDC.NPCR的RXSEL赋值为011B。这样就确定了CAN1的接收输入线了。
那么官方库中也提供了相对应的接口以及枚举,我们就相对应赋值就行了。XMC_CAN_NODE_SetReceiveInput。
我们还需要配置下发送TX,发送这块相对比较简单,直接IO复用为CAN_NODE1的TX接口即可。但是我们如何确定呢,我们可以查找到官方的用户手册的PORTS的IO功能这块,板子的CAN_TX使用的是P1_12.由图可以看到使用的是输出的ALT2复用
那么我们相对应利用XMC_GPIO_SetMode这个设置IO模式的接口,把P1_12复用为ALT2即可。
-
配置完上述之后,我们还需要对CAN的RX、TX的端口进行操作。在这里我们需要注意的是,需要对节点控制寄存器NCR进行相关操作,才可以去操作CAN的端口设置。也就是说,必须先关掉此CAN节点的CAN通信,再启用配置改变寄存器,才可以配置端口,配置完毕之后,再开启CAN节点的CAN通信,关闭配置改变寄存器。这个可以起到保护作用,防止端口被莫名改变。这 种类似与STM32的SPI配置,要改变传输位数,比如8位传输或者16位传输,比如先关闭SPI,才能配置,配置完毕开启SPI。这个是我遇到的第一个坑。不这样做,CAN的端口设置不能用,无法正常收发。
那么我们来分析下这些寄存器。CAN节点寄存器有个NCR寄存器,这个寄存器是决定CAN节点操作的基本设置,包括节点初始化INIT、传输中断启用TRIE、配置改变启用CCE等等。该寄存器也就前面8位是配置的
那么我们需要配置的寄存器也就两个,一个是INIT,一个是CCE。INIT是节点初始化,复位INIT启用该CAN节点,置位终止该CAN节点的CAN通信。CCE是配置改变启用,复位的话,位时序寄存器、端口控制寄存器、错误计时器寄存器只能读不能写,而置位可以进行读写。那么在这里我们要配置端口,那么开始就得置位INIT、CCE,配置端口完成后,就复位INIT、CCE。
明白了这个原理后,我们再看官方的demo(XMC4800这个并没有CAN的例子,但是可以参照XMC4500的),也就能清晰明白其思路。楼主为了快速开发肯定不可能用寄存器去操作,官方也有相对应的库接口,我们直接使用即可。操作CCE的是XMC_CAN_NODE_EnableConfigurationChange和XMC_CAN_NODE_DisableConfigurationChange;操作INIT的是XMC_CAN_NODE_SetInitBit和XMC_CAN_NODE_ResetInitBit。在操作端口以下截图: