在线时间11 小时
UID3508468
注册时间2018-9-30
NXP金币0
该用户从未签到
注册会员

- 积分
- 162
- 最后登录
- 2019-1-14
|

楼主 |
发表于 2018-12-14 09:57:33
|
显示全部楼层
我试了试你说的进去debug,好像是卡在了一个地方 ,每次暂停后都卡在那儿。1.这是我的时钟配置,不懂你说的内部晶振如何生成主频:
2.这个是LED操作
3.这是debug后卡的地方
4.这是我的代码
#include "board.h"
#include "fsl_debug_console.h"
#include "fsl_gpio.h"
#include "can.h"
#include "pin_mux.h"
#include <stdbool.h>
/*******************************************************************************
* Definitions
******************************************************************************/
#define APP_BOARD_TEST_GPIO_PORT1 BOARD_LED3_GPIO_PORT //CAN0-LED P0-8
#define APP_BOARD_TEST_GPIO_PORT2 BOARD_LED1_GPIO_PORT //CAN1-LED P0-9
#define APP_BOARD_TEST_GPIO_PORT3 BOARD_LED2_GPIO_PORT //USB-LED P1-14
#define APP_BOARD_TEST_LED1_PIN BOARD_LED3_GPIO_PIN
#define APP_BOARD_TEST_LED2_PIN BOARD_LED1_GPIO_PIN
#define APP_BOARD_TEST_LED3_PIN BOARD_LED2_GPIO_PIN
/*******************************************************************************
* Variables
******************************************************************************/
#define TICKRATE_HZ (1000) /* 每秒1000次 */
#define TRANSMIT_PERIOD (100) /* 毫秒之间传输 */
/* handle for non-blocking send/receive on CAN0 */
static can_handle_t s_handle0;
/* handle for non-blocking send/receive on CAN1 */
static can_handle_t s_handle1;
/* handle for non-blocking receive for message buffer 0 */
static can_mb_transfer_t mb0rxfer;
static volatile uint32_t gTimCnt = 0; /* incremented every millisecond */
/*******************************************************************************
* Code
******************************************************************************/
/*!
* @brief SysTick计时器
*/
void SysTick_Handler(void)
{
// 毫秒计数
gTimCnt++;
}
/*! @brief CAN transfer callback function.
*/
void TransferCallback(CAN_Type *base, can_handle_t *handle, status_t status, uint32_t result, void *userData)
{
can_frame_t *rxmsg;
static uint32_t last_timestamp = 0;
uint32_t timestamp;
uint32_t time_diff;
/* 来自CAN1的回调 */
if (handle == &s_handle1)
{
/* 接收到消息缓冲区的消息 */
if (status == (status_t)kStatus_CAN_RxIdle)
{
/* 获取接收数据 */
rxmsg = handle->mbFrameBuf[result];
/*时间戳为10us的倍数,自收到最后一条消息后开始计时 */
timestamp = rxmsg->timestamp;
if (timestamp >= last_timestamp)
time_diff = timestamp - last_timestamp;
else
time_diff = (65536 - last_timestamp) + timestamp;
/* 警告-此功能在CAN中断中执行,这里使用printf会影响性能并因此影响时间戳精度 */
PRINTF("Rx 0x%X (%d x10us time diff)\r\n", rxmsg->id, time_diff);
last_timestamp = timestamp;
/* 切换LED2 */
GPIO_TogglePinsOutput(GPIO, BOARD_LED2_GPIO_PORT, 1u << BOARD_LED2_GPIO_PIN);
/* 使用此回调接收下一条消息 */
CAN_TransferReceiveNonBlocking(CAN1, &s_handle1, &mb0rxfer);
}
/* FIFO接收完成 */
else if (status == (status_t)kStatus_CAN_RxFifoIdle)
{
/* 结果保持先进先出数 */
/* 从handle->rxFifoFrameBuf[result]中获取消息 */
}
}
}
/*!
* @brief Main function
*/
int main(void)
{
can_config_t config; //CAN模块配置结构体:基地址,时间戳频率,远程帧等
can_frame_t txmsg = { 0 }; //发送消息帧结构体:字节长度,数据帧选择,帧格式,比特率切换,CANFD选择,时间戳等
int b;
bool message_transmitted = false;
uint32_t next_id = 0x100;
can_mb_transfer_t mbtxfer;
can_frame_t rxmb0msg;
/* 定义输出LED的初始化结构 */
gpio_pin_config_t led_config = {
kGPIO_DigitalOutput, 0,
};
/**** 引脚,时钟,调试初始化 */
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
CLOCK_EnableClock(kCLOCK_Gpio0);
CLOCK_EnableClock(kCLOCK_Gpio1);
CLOCK_EnableClock(kCLOCK_Gpio2);
CLOCK_EnableClock(kCLOCK_Gpio3);
BOARD_InitPins();
BOARD_BootClockFROHF48M();
BOARD_InitDebugConsole();
/* print a note to terminal */
PRINTF("\r\n CAN-FD driver callbacks example\r\n");
/**** CAN模块配置 CAN初始化,CANFD模式,启用比特率切换,以1Mbps比特率和4MbPS数据比特率进行传输,传输64字节数据 */
CAN_GetDefaultConfig(&config); //获取默认的配置结构
config.baseAddress = 0x20010000; //缓冲区RAM基地址
config.nominalBaudRate = 1000000; //正常波特率1Mbps
config.dataBaudRate = 4000000; //数据传输波特率4Mbps
config.timestampClock_Hz = 100000; //100ms
CAN_Init(CAN0, &config, SystemCoreClock); //初始化CAN0:设置11位及29位滤波器,消息缓冲区
CAN_Init(CAN1, &config, SystemCoreClock);
/* receive 0x100 in CAN1 rx message buffer 0 by setting mask 0 */
CAN_SetRxIndividualMask(CAN1, 0, CAN_RX_MB_STD(0x100, 0));
/* receive 0x101 in CAN1 rx message buffer 0 by setting mask 1 */
CAN_SetRxIndividualMask(CAN1, 1, CAN_RX_MB_STD(0x101, 0));
/* receive 0x102 in CAN1 rx message buffer 0 by setting mask 2 */
CAN_SetRxIndividualMask(CAN1, 2, CAN_RX_MB_STD(0x102, 0));
/* create a handle for CAN0 for non-blocking send/receive */
CAN_TransferCreateHandle(CAN0, &s_handle0, TransferCallback, NULL);
/* create a handle for CAN1 for non-blocking send/receive */
CAN_TransferCreateHandle(CAN1, &s_handle1, TransferCallback, NULL);
CAN_Enable(CAN0, true); // 使能CAN 0
CAN_Enable(CAN1, true); // 使能CAN 1
/* 接收到CAN1 rx消息缓冲器0的消息是非阻塞的,并且当接收到回调函数时,
将从CAN接收中断调用回调函数。 */
mb0rxfer.frame = &rxmb0msg;
mb0rxfer.mbIdx = 0;
CAN_TransferReceiveNonBlocking(CAN1, &s_handle1, &mb0rxfer);
/**** 启用SysTick 定时器 ****/
SysTick_Config(SystemCoreClock / TICKRATE_HZ);
/**** GPIO模块配置 初始化P0_8、P0_9、P1_14 ,3个LED,写操作默认输出di电平 ****/
GPIO_PinInit(GPIO, BOARD_LED1_GPIO_PORT, BOARD_LED1_GPIO_PIN, &led_config);
GPIO_WritePinOutput(GPIO, BOARD_LED1_GPIO_PORT, BOARD_LED1_GPIO_PIN, 0);
GPIO_PinInit(GPIO, BOARD_LED2_GPIO_PORT, BOARD_LED2_GPIO_PIN, &led_config);
GPIO_WritePinOutput(GPIO, BOARD_LED2_GPIO_PORT, BOARD_LED2_GPIO_PIN, 0);
GPIO_PinInit(GPIO, BOARD_LED3_GPIO_PORT, BOARD_LED3_GPIO_PIN, &led_config);
GPIO_WritePinOutput(GPIO, BOARD_LED3_GPIO_PORT, BOARD_LED3_GPIO_PIN, 0);
GPIO_ClearPinsOutput(BOARD_LED1_GPIO, BOARD_LED1_GPIO_PORT, 1U << BOARD_LED1_GPIO_PIN); /*!< 点亮LED1 */
GPIO_ClearPinsOutput(BOARD_LED2_GPIO, BOARD_LED2_GPIO_PORT, 1U << BOARD_LED2_GPIO_PIN); /*!< 点亮LED2 */
while (true)
{
/* 时间到后从CAN0发送消息 */
if ((gTimCnt % TRANSMIT_PERIOD == 0) && !message_transmitted)
{
/* send 0x100 -> 0x102 on tx message buffer 0 */
txmsg.id = next_id;
txmsg.format = kCAN_FrameFormatStandard;
txmsg.type = kCAN_FrameTypeData;
txmsg.proto = kCAN_ProtoTypeFD;
txmsg.bitratemode = kCAN_BitrateModeTypeSwitch;
txmsg.length = 64;
for (b = 0; b < txmsg.length; b++) txmsg.dataByte = b;
/* use message buffer 0 */
mbtxfer.mbIdx = 0;
mbtxfer.frame = &txmsg;
CAN_TransferSendNonBlocking(CAN0, &s_handle0, &mbtxfer);
/* 切换toggle LED1 在每次发送消息时切换LeD1 */
GPIO_TogglePinsOutput(GPIO, BOARD_LED1_GPIO_PORT, 1u << BOARD_LED1_GPIO_PIN);
message_transmitted = true;
if (++next_id > 0x102) next_id = 0x100;
}
else if (gTimCnt % TRANSMIT_PERIOD != 0)
{
message_transmitted = false;
}
}
}
|
|