- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试开始学习编程,并且我正在尝试让此代码正常工作:https://github.com/espruino/Espruino/blob/master/targetlibs/stm32f4/lib/stm32f4xx_can.c我正在使用 Atollic TruStudio Lite。
我用 Discovery 编写了基本的 LED 闪烁代码,但除此之外。我不知道该怎么做。
我不明白我应该如何通过 STM32 模拟 CAN 消息(和其他东西)。
我是个初学者,所以请不要撕破我的喉咙。
谢谢
最佳答案
这是您可以尝试的 CAN 环回示例。这是一个 CAN 环回测试。它位于 stm32f4 示例中,您可以从 STM 网站下载。这是针对 STM32439 评估板的,但它应该可以用于发现。 (均为STM32F4芯片)。
#define USE_CAN1
/* Uncomment the line below if you will use the CAN 2 peripheral */
/* #define USE_CAN2 */
#ifdef USE_CAN1
#define CANx CAN1
#define CAN_CLK RCC_APB1Periph_CAN1
#else /* USE_CAN2 */
#define CANx CAN2
#define CAN_CLK (RCC_APB1Periph_CAN1 | RCC_APB1Periph_CAN2)
#endif /* USE_CAN1 */
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
__IO uint32_t ret = 0; /* for return of the interrupt handling */
volatile TestStatus TestRx;
TestStatus CAN_Polling(void);
int main(void) {
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s)
before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f4xx.c file
*/
/* CANx Periph clock enable */
RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);
/* Initialize LEDs mounted on EVAL board */
STM_EVAL_LEDInit(LED1);
STM_EVAL_LEDInit(LED2);
/* CAN transmit at 125Kb/s and receive by polling in loopback mode */
TestRx = CAN_Polling();
if (TestRx != FAILED) { /* OK */
/* Turn on LED1 */
STM_EVAL_LEDOn(LED1);
} else { /* KO */
/* Turn on LED2 */
STM_EVAL_LEDOn(LED2);
}
/* Infinite loop */
while (1) { }
}
/**
* @brief Configures the CAN, transmit and receive by polling
* @param None
* @retval PASSED if the reception is well done, FAILED in other case
*/
TestStatus CAN_Polling(void) {
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CanTxMsg TxMessage;
CanRxMsg RxMessage;
uint32_t uwCounter = 0;
uint8_t TransmitMailbox = 0;
/* CAN register init */
CAN_DeInit(CANx);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
/* CAN Baudrate = 175kbps (CAN clocked at 42 MHz) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler = 16;
CAN_Init(CANx, &CAN_InitStructure);
/* CAN filter init */
#ifdef USE_CAN1
CAN_FilterInitStructure.CAN_FilterNumber = 0;
#else /* USE_CAN2 */
CAN_FilterInitStructure.CAN_FilterNumber = 14;
#endif /* USE_CAN1 */
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* transmit */
TxMessage.StdId = 0x11;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 2;
TxMessage.Data[0] = 0xCA;
TxMessage.Data[1] = 0xFE;
TransmitMailbox = CAN_Transmit(CANx, &TxMessage);
uwCounter = 0;
while((CAN_TransmitStatus(CANx, TransmitMailbox) != CANTXOK) && (uwCounter != 0xFFFF)) {
uwCounter++;
}
uwCounter = 0;
while((CAN_MessagePending(CANx, CAN_FIFO0) < 1) && (uwCounter != 0xFFFF)) {
uwCounter++;
}
/* receive */
RxMessage.StdId = 0x00;
RxMessage.IDE = CAN_ID_STD;
RxMessage.DLC = 0;
RxMessage.Data[0] = 0x00;
RxMessage.Data[1] = 0x00;
CAN_Receive(CANx, CAN_FIFO0, &RxMessage);
if (RxMessage.StdId != 0x11) {
return FAILED;
}
if (RxMessage.IDE != CAN_ID_STD) {
return FAILED;
}
if (RxMessage.DLC != 2) {
return FAILED;
}
if ((RxMessage.Data[0]<<8|RxMessage.Data[1]) != 0xCAFE) {
return FAILED;
}
return PASSED; /* Test Passed */
}
关于c - STM32F4探索和CAN编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30626663/
我是 CAN 协议(protocol)的新手,正在阅读 Robert Bosch 的 CAN 规范 ver2.0 B 部分。我无法理解第 63 页上的以下几行 ”注意:启动/唤醒:如果在启动期间只有一
我用 C 写了一些代码来读取 CAN 总线数据。当我读取 11 位 CAN ID 时一切正常。一旦我尝试读取 29 位 ID,它就会错误地显示 ID。 示例: 接收29位ID的消息: 0x01F0A0
如果这看起来与另一个问题相似或者看起来已经得到回答,我提前道歉。我觉得它非常详细,足以证明自己的问题。 我正在尝试寻找一个虚拟的 CAN 总线模拟器(或一些可以轻松制作模拟器的方法),它只会生成 CA
我的问题涉及 GNU 的品牌。 如果您有一系列命令可用作多个目标的配方,则 canned recipe派上用场了。我可能看起来像这样: define run-foo # Here comes a #
您好,我是一名学习canopen的学生。Canopen中的COB-ID和CAN标识符有什么关系?我在CIA主页上看到COB-ID不是CAN ID,但我不明白。 例如,如果 PDO 通过 CAN 总线传
我知道一个显性确认位是由另一个节点传输的消息的接收器发送的。 我无法理解的是,接收方是在接收到整个消息后发送单个显性位,还是接收者发送相同的消息,其中 ACK 位字段为显性? 或者是接收器在发送器传输
我是 CAN 协议(protocol)的新手,我正在尝试通过 Linux 的 SocketCAN 使用它。然而,我对可用的 2 种不同的 CAN 套接字(RAW 和广播管理器 (BCM))感到困惑。
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我正在尝试制作一个在 Windows 下运行并与 ELM327 设备通信的软件。我创建了第一个版本,然后我进入了我的 SMART ForTwo (SMART 451) 车辆,我设法连接了仪表盘(发送
我知道在 CAN Controller 中,如果错误计数达到某个阈值(比如 255),就会发生总线关闭,这意味着特定的 CAN 节点将从 CAN 网络中关闭。所以根本不会有任何交流。但是,如果上述情况
我正在使用 ELM327,我希望能够设置要发送的 CAN 消息的 header 和数据部分。我看到有一个代码用于设置消息的标题 SH xxyyzz 但是我很难找出如何设置数据部分并控制何时发送消息。
我想做的是: 将数据插入具有两列的表中,并在同一 PHP 页面中显示更新的值。我能够获取数据并显示它,但无法插入任何数据。请指导我。 文件名为 mypage.php 到目前为止我的代码:
(这个问题是关于 Android 11 的) 我想将崩溃日志打印到其他应用程序可以读取的文件中(具体来说,我希望能够导航到该文件并使用"file"应用程序查看数据)。 我看过很多关于这个问题的答案,但
这会产生“ fatal error :无法解开Optional.None”,我似乎不明白为什么 var motionManager = CMMotionManager() motionManager.
在 Java 中,我经常遇到带有后缀 -able 的接口(interface),例如可序列化、可迭代等。这表明实现这些接口(interface)的对象具有可以对其执行某些操作的特性,例如该对象可以被序
我正在阅读 CanJS API 文档并遇到 can.Construct.extend http://canjs.com/docs/can.Construct.extend.html .我知道 can.
我正在使用 C 语言在 STM32F1xx 上进行开发,直到现在我都在尝试使用“CANopenNode-master”实现 CANopen 堆栈,并且我正在使用 2 个中断。 第一个是用于处理 SYN
我一直在使用 SocketCAN,尤其是 Virtual CAN vcan。但是,到目前为止,我从未使用过 CAN FD(灵活数据速率)。 好吧,我今天早上用 can-utils 试了一下: cans
我正在运行一个带有两个 CAN channel 的程序(使用 TowerTech CAN Cape TT3201)。 两个 channel 是 can0 (500k) 和 can1 (125k)。 c
存储由序列字符组成的字符串的 %s 格式说明符可以存储整数序列吗?如果是的话..你能解释一下吗? 最佳答案 无论如何,数字都是用字符表示的,所以是的,您可以使用 "%s" 说明符读取数字并将其存储在
我是一名优秀的程序员,十分优秀!