看到论坛里面的"STM3210B-EVAL参考线路图",CAN总线和USB都使用了,但是手册上这两个接口IO是共用的,如何实现?如图,将CAN接到了PD0,PD1
C:C.JPG
看来你和我一样,看见数据手册比较激动,没看参考手册
参考手册87页:5.3.2
The BXCAN signal can be mapped on Port A, Port B or Port E as shown in Table 13.
Table 13. BXCAN alternate function remapping
Alternate Function CAN_REMAP[1:0] =“00” CAN_REMAP[1:0] ="10"(1) CAN_REMAP[1:0] ="11"(2)
CANRX PA11 PB8 PD0
CANTX PA12 PB9 PD1
1. Remap not available on 36-pin package
2. Remap available only on 100-pin package
STM32 CAN和USB
还需要注意的是,STM32的 CAN和USB有可能不能同时使用的,因为它们共享了专门的1块RAM区域:0x4000 6000 ~ 0x4000 6400。
这点可以参考STM32F103 Data sheet Rev 2的第22页
共享了专门的1块RAM区域:0x4000 6000 ~ 0x4000 6400
那就不好用了
CAN用这块区域干什么呢?
接收和发送缓冲区?
看ST的DEMO这块区域好像全给了USB。
STM32 CAN和USB共享的RAM
STM32 CAN和USB共享了RAM区域:0x4000 6000 ~ 0x4000 6400,当然都是用作缓冲区。但我想这并不意味着CAN和USB绝对不能同时使用,在某些应用中,如果缓冲区不需要太大,那么CAN和USB有可能同时可用。
这共享的0x400应该是1Kbit吧
怎么数据手册上写shared 512BYTE 呢?
关于 STM32 CAN接口问题
请教一下,
1. Remap not available on 36-pin package
手册里没提到过36脚的,有货么,48脚的能不能map阿
36脚的STM32?
36脚的STM32,或许有? 但既然手册里没提到过36脚的,那么最好认为没这种货-除非你有很大的订货量(每年几百万片?)。
其实,只要你有大量的订单,即使你想做32脚的芯片,ST(或其它大的供应商)都原意帮你做。问题是,你没有那么大的订单...
STM32 芯片
STM32F10XX 48PIN,100PIN已经到了一批,如果需要购买或者是申请样片可以联系我们。www.mxchip.com
不知道64PIN的可以REMAP吗?
上面说到: 2. Remap available only on 100-pin package
64脚的没看到有提起。
不知道64PIN的可以REMAP吗?
上面写到:
Table 13. BXCAN alternate function remapping
Alternate Function CAN_REMAP[1:0] =“00” CAN_REMAP[1:0] ="10"(1)
1. Remap not available on 36-pin package
那么言下之意,64PIN的支持CAN_REMAP[1:0] ="10"。
48PIN也應該能remap
看datasheet上,48PIN應該也能remap,但CAN和USB使用共用的RAM這個絕對是個設計上的失誤,大部分的工業設備及系統,都需要與PC連接進行組態,配置,監控等,之前一直使用RS232,但現在越來越多的電腦不帶RS232,且速度也慢,對於快速數據采集來說,USB更是理想的選擇,所以越來越多的工業設備要使用USB來取代RS232,因此USB接口運用於工業產品上是會越來越普遍的,因此強烈建議ST將STM32的USB和CAN的RAM分開,要省也不用省這麼一點點。
怎么数据手册上写shared 512BYTE 呢?
占用了 1K 空间而已。 每一个Word,只有低 HalfWord 有用。
参考USB的
void UserToPMABufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes)
{
u32 n = (wNBytes + 1) >> 1; /* n = (wNBytes + 1) / 2 */
u32 i, temp1, temp2;
u16 *pdwVal; HalfWord 指针
pdwVal = (u16 *)(wPMABufAddr * 2 + PMAAddr);
for (i = n; i != 0; i--)
{
temp1 = (u16) * pbUsrBuf;
pbUsrBuf++;
temp2 = temp1 | (u16) * pbUsrBuf << 8;
*pdwVal++ = temp2;
pdwVal++; 跳过 HalfWord
pbUsrBuf++;
}
}
CAN对共享缓冲区的使用,没有明确的说明
USB对缓冲区的分配可以灵活设置
#define BTABLE_ADDRESS xxxx
然后可以定义端点缓冲区地址
/* EP0 */
/* rx/tx buffer base address */
#define ENDP0_RXADDR (BTABLE_ADDRESS+BTABLE_SIZE)
#define ENDP0_TXADDR (ENDP0_RXADDR+BULK_MAX_PACKET_SIZE)
/* EP1 */
/* tx buffer base address */
#define ENDP1_TXADDR (ENDP0_TXADDR+BULK_MAX_PACKET_SIZE)
/* EP2 */
/* Rx buffer base address */
#define ENDP2_RXADDR (ENDP1_TXADDR+BULK_MAX_PACKET_SIZE)
但是CAN对共享缓冲区的使用,没有明确的说明,需要通过实验来确定。