色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

N32L40XCL-STB開(kāi)發(fā)板模塊評(píng)測(cè)任務(wù)大挑戰(zhàn)-測(cè)試CAN

冬至子 ? 來(lái)源:我回來(lái)了 ? 作者:我回來(lái)了 ? 2023-08-16 16:15 ? 次閱讀

1.測(cè)試準(zhǔn)備工作

1.1. 開(kāi)發(fā)板硬件資源介紹:

1.jpg

1.2. 首先通過(guò)國(guó)民技術(shù)的技術(shù)資料網(wǎng)址,用瀏覽器打開(kāi)后如下所示:

1.jpg

選擇下載了N32L40XXX_V2.1.0.zip資料包后,解壓得到官方Demo,數(shù)據(jù)手冊(cè),評(píng)估板,軟件開(kāi)發(fā)套件,應(yīng)用筆記,測(cè)試資料等等。如下圖所示:

1.jpg

1.3. 引腳資源分配介紹
本例中CAN的引腳使用GPIOB的引腳8和引腳9配置CAN的接收和發(fā)送引腳。將GPIOC的引腳11和引腳10配置為USART3的接收和發(fā)送引腳,通過(guò)USB轉(zhuǎn)UART模塊,晶振等公共資源就不一一介紹。
1.4. 功能模塊介紹
本方案從軟件上主要分為三部份,CAN模塊,串口通訊模塊和日志輸出模塊。
CAN模塊:主要負(fù)責(zé)CAN報(bào)文的收發(fā),報(bào)文解析。
串口通訊模塊:將CAN模塊接收的CAN報(bào)文傳輸至上位機(jī),將上位機(jī)發(fā)送的CAN報(bào)文轉(zhuǎn)給CAN模塊發(fā)送到CAN網(wǎng)絡(luò)中。
日志輸出模塊:輸出系統(tǒng)運(yùn)行過(guò)程中的日志。
1.5. 性能指標(biāo)
本案例測(cè)試中,將測(cè)試波特率為500kbps,250kbps,125kbps三個(gè)波特率,具體指標(biāo)為:
錯(cuò)誤率:幀錯(cuò)誤率:99%
采樣率:85%
連續(xù)測(cè)試時(shí)長(zhǎng):72小時(shí)
2.環(huán)境搭建及創(chuàng)建工程。
2.1.首先到RT-Thread官方網(wǎng)站下載RT-Thread Studio,并安裝好,啟動(dòng)RT-Thread Studio.點(diǎn)擊SDK安裝按鈕,彈出下圖所示界面。

1.jpg

2.3.還需要安裝PyOCD,防止在下載程序時(shí)報(bào)錯(cuò)

1.jpg

2.4.在文件選擇新建,由于不支持RT-Thread Nano,所以只能選擇RT-Thread項(xiàng)目。

1.jpg

2.5. 在彈出菜單中,選擇項(xiàng)目存放路徑,輸入項(xiàng)目名,選擇基于開(kāi)發(fā)板,并選擇本次的測(cè)試開(kāi)發(fā)板,點(diǎn)擊確定,就創(chuàng)建了基于模板的工程。

1.jpg

2.6.在項(xiàng)目?jī)?nèi)的RT-Thread Settings中打開(kāi)CAN模塊功能,串口1用于日志打印。

1.jpg

3.RTThread的CAN驅(qū)動(dòng)機(jī)制介紹
3.1. rtconfig.h配置文件介紹
在RT-Thread Setting中,打開(kāi)USART3和CAN后,在rtconfig.h配置文件中可以看到定義了BSP_USING_CAN,RT_USING_PIN,RT_USING_SERIAL宏,表示啟動(dòng)了CAN驅(qū)動(dòng)與設(shè)備。

1.jpg

3.2.CAN Drive 驅(qū)動(dòng)介紹,
3.2.1.RT-Thread提供I/O設(shè)備管理接口來(lái)訪(fǎng)問(wèn)CAN硬件控制,接口如下:

1.jpg

3.2.2.通過(guò)INIT_BOARD_EXPORT將CAN的硬件驅(qū)動(dòng)加載到初始化列表中,通過(guò)rt_hw_can_register將CAN注冊(cè)到RT-Thread的設(shè)備列表中。

1.jpg

3.2.3.在調(diào)用rt_device_register函數(shù),將設(shè)備注冊(cè)到OS的設(shè)備列表中。

1.jpg

3.2.4.CAN波特率配置

1.jpg

3.3.測(cè)試代碼

#include
#include
#include
#include
/* defined the LED3 pin: PB5 /
#define LED3_PIN GET_PIN(B, 5)
#define LED2_PIN GET_PIN(B, 4)
int main(void)
{
/
set LED3 pin mode to output /
rt_pin_mode(LED3_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
thread_CanDriver_Entry(RT_NULL);
while (1)
{
rt_pin_write(LED2_PIN, PIN_LOW);
rt_pin_write(LED3_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED3_PIN, PIN_LOW);
rt_pin_write(LED2_PIN, PIN_HIGH);
rt_thread_mdelay(500);
}
}
#include
/

Copyright (c) 2006-2021, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
2023-04-22 chunyang.jiang the first version
/
#include "rtdevice.h"
#include
#include
#include
#define CAN_DEV_NAME "bxcan" /
CAN 設(shè)備名稱(chēng) /
struct rt_semaphore rx_sem; / 用于接收消息的信號(hào) /
static rt_device_t can_device; /
CAN 設(shè)備名稱(chēng) */
struct rt_can_msg can_msg = {0};
struct rt_can_msg canrx_msg = {0};
static rt_thread_t thread_rec;
static rt_thread_t thread_send;
static void thread_can_send(void *parameter);
static void thread_can_Receiver(void *parameter);
static rt_err_t Can_ReceiverMessage_Call(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&rx_sem);
// rt_kprintf("Can Receiver message!rn");
return RT_EOK;
}
static void thread_can_Receiver(void parameter)
{
rt_err_t ret;
int i;
/ 設(shè)置接收回調(diào)函數(shù) /
rt_device_set_rx_indicate(can_device, Can_ReceiverMessage_Call);
/

struct rt_can_filter_item items[5] =
{
{0x100, 0, 0, 0, 0x700, RT_NULL},
{0x300, 0, 0, 0, 0x700, RT_NULL},
{0x211, 0, 0, 0, 0x7ff, RT_NULL},
{0x486, 0, 0, 0, 0x7ff, RT_NULL},
{0x555, 0, 0, 0, 0x7ff, 7}
};
struct rt_can_filter_config cfg = {5,1,items};
ret = rt_device_control(can_device,RT_CAN_CMD_SET_FILTER,&cfg);
RT_ASSERT(ret == RT_EOK);
*/
while(1)
{
canrx_msg.hdr = -1;
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
rt_device_read(can_device, 0, &canrx_msg, sizeof(canrx_msg));
rt_kprintf("ID:%x",canrx_msg.id);
for(i=0; i <8; i++)
{
rt_kprintf(" %2x",canrx_msg.data[i]);
}
rt_kprintf("rn");
}
}
static void thread_can_send(void *parameter)
{
rt_size_t res;
static uint32_t i = 0;
static uint32_t a = 0xFFFFFFFF;
while(1)
{
i ++;
a --;
can_msg.id = 0x78;
can_msg.ide = RT_CAN_STDID;
can_msg.rtr = RT_CAN_DTR;
can_msg.len = 0x08;
can_msg.data[0] = i;
can_msg.data[1] = (i>>8);
can_msg.data[2] = (i>>16);
can_msg.data[3] = (i>>24);
can_msg.data[4] = 0x05;
can_msg.data[5] = 0x06;
can_msg.data[6] = 0x07;
can_msg.data[7] = 0x08;
res = rt_device_write(can_device, 0, &can_msg, sizeof(can_msg));
if(res == 0)
{
// rt_kprintf("Can Send a frame failed!rn");
}
else
{
// rt_kprintf("Can Send a frame success!rn");
}
can_msg.id = 0x778;
can_msg.ide = RT_CAN_STDID;
can_msg.rtr = RT_CAN_DTR;
can_msg.len = 0x08;
can_msg.data[0] = a;
can_msg.data[1] = (a>>8);
can_msg.data[2] = (a>>16);
can_msg.data[3] = (a>>24);
can_msg.data[4] = 0x05;
can_msg.data[5] = 0x06;
can_msg.data[6] = 0x07;
can_msg.data[7] = 0x08;
res = rt_device_write(can_device, 0, &can_msg, sizeof(can_msg));
if(res == 0)
{
// rt_kprintf("Can Send a frame failed!rn");
}
else
{
// rt_kprintf("Can Send a frame success!rn");
}
can_msg.id = 0x508;
can_msg.ide = RT_CAN_STDID;
can_msg.rtr = RT_CAN_DTR;
can_msg.len = 0x08;
can_msg.data[0] = 8;
can_msg.data[1] = 8;
can_msg.data[2] = 8;
can_msg.data[3] = 8;
can_msg.data[4] = 0x05;
can_msg.data[5] = 0x06;
can_msg.data[6] = 0x07;
can_msg.data[7] = 0x08;
res = rt_device_write(can_device, 0, &can_msg, sizeof(can_msg));
if(res == 0)
{
// rt_kprintf("Can Send a frame failed!rn");
}
else
{
// rt_kprintf("Can Send a frame success!rn");
}
rt_thread_mdelay(1);
}
}
int thread_CanDriver_Entry(void *parameter)
{
static char can_name[RT_NAME_MAX];
static uint32_t can_name_len = 0;
rt_err_t ret;
can_name_len = sizeof(CAN_DEV_NAME);
rt_strncpy(can_name, CAN_DEV_NAME, RT_NAME_MAX);
/ 在設(shè)備列表中查找設(shè)備 /
can_device = rt_device_find(can_name);
if(!can_device)
{
rt_kprintf("find %s failed!rn",can_name);
return RT_ERROR;
}
/ 初始化信號(hào)量 /
rt_sem_init(&rx_sem, "rx_sem", 0 ,RT_IPC_FLAG_FIFO);
/ 打開(kāi)設(shè)備 /
ret = rt_device_open(can_device, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX);
RT_ASSERT(ret == RT_EOK);
thread_send = rt_thread_create("thread_send", thread_can_send,RT_NULL, 1024,25,1);
if(thread_send == NULL)
{
rt_kprintf("Create Can Send failed!rn");
return RT_ERROR;
}
else
{
rt_thread_startup(thread_send);
}
thread_rec = rt_thread_create("thread_Receiver", thread_can_Receiver,RT_NULL, 1024,25,1);
if(thread_send == NULL)
{
rt_kprintf("Create Can Send failed!rn");
return RT_ERROR;
}
else
{
rt_thread_startup(thread_rec);
}
}
MSH_CMD_EXPORT(thread_CanDriver_Entry, can device Driver sample);

4.測(cè)試效果圖
測(cè)試效果圖連接:

在測(cè)試時(shí),測(cè)試500Kbps,250bps,125bps波特率,報(bào)文發(fā)送時(shí)間間隔為10ms,開(kāi)發(fā)板發(fā)送3幀,接收一幀(由于測(cè)試CAN只支持1幀發(fā)送)

1.jpg

5.測(cè)試總結(jié)

在測(cè)試中發(fā)現(xiàn)在沒(méi)有安裝PyOCD,無(wú)法燒錄的問(wèn)題,同時(shí)還發(fā)現(xiàn)在發(fā)送CAN數(shù)據(jù)時(shí),執(zhí)行res = rt_device_write(can_device, 0, &can_msg, sizeof(can_msg));發(fā)送一幀CAN數(shù)據(jù)時(shí),通過(guò)CAN測(cè)試盒,明顯看到有報(bào)文發(fā)出,但返回狀態(tài)一直為0,于是跟蹤測(cè)試后發(fā)現(xiàn)在等待CAN發(fā)送后,沒(méi)有對(duì)發(fā)送結(jié)果進(jìn)行返回導(dǎo)致,于是修改代碼,如下圖所示:

1.jpg

另外也發(fā)現(xiàn)如果CAN的TX,RX不接CAN驅(qū)動(dòng)器時(shí),執(zhí)行發(fā)送數(shù)據(jù)后,代碼會(huì)進(jìn)入死循環(huán)。這個(gè)問(wèn)題是驅(qū)動(dòng)機(jī)制導(dǎo)致,如果遇到這個(gè)問(wèn)題可以查一下CAN驅(qū)動(dòng)接接線(xiàn),驅(qū)動(dòng)器是否工作。

總的說(shuō)來(lái),本次測(cè)試挺順利的,除了部分Bug外,CAN能夠?qū)崿F(xiàn)10ms多幀發(fā)送,并同時(shí)處理接收?qǐng)?bào)文。滿(mǎn)足日常設(shè)計(jì)中的CAN通訊需求。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)器
    +關(guān)注

    關(guān)注

    52

    文章

    8226

    瀏覽量

    146253
  • 串口通訊
    +關(guān)注

    關(guān)注

    1

    文章

    258

    瀏覽量

    24914
  • 上位機(jī)
    +關(guān)注

    關(guān)注

    27

    文章

    941

    瀏覽量

    54790
  • CAN模塊
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    8747
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1285

    瀏覽量

    40085
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    N32L43XCL-STB開(kāi)發(fā)板硬件使用手冊(cè)

    N32L43XCL-STB開(kāi)發(fā)板用于國(guó)民技術(shù)股份有限公司高性能32位N32L43XCL系列芯片的樣片開(kāi)發(fā)。本文檔詳細(xì)描述了N32L43XCL-STB
    發(fā)表于 11-02 08:10

    N32L40XCL-STB開(kāi)發(fā)板硬件使用手冊(cè)

    N32L40XCL-STB開(kāi)發(fā)板用于國(guó)民技術(shù)股份有限公司高性能32位N32L40XCL系列芯片的樣片開(kāi)發(fā)。本文檔詳細(xì)描述了N32L40XCL-STB
    發(fā)表于 11-02 06:35

    國(guó)民技術(shù)N32G45XCL-STB開(kāi)發(fā)板資料

    國(guó)民技術(shù)N32G45XCL-STB開(kāi)發(fā)板原理圖資料
    發(fā)表于 11-07 15:12 ?7次下載

    國(guó)民技術(shù)N32G43XCL-STB開(kāi)發(fā)板資料

    國(guó)民技術(shù)N32G43XCL-STB開(kāi)發(fā)板資料
    發(fā)表于 11-07 15:30 ?13次下載

    N32G45XCL-STB (LQFP48)開(kāi)發(fā)板

    N32G45XCL-STB (LQFP48)開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?0次下載
    <b class='flag-5'>N32G45XCL-STB</b> (LQFP48)<b class='flag-5'>開(kāi)發(fā)板</b>

    N32G45XCL-STB (LQFP48) 開(kāi)發(fā)板

    N32G45XCL-STB (LQFP48) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?0次下載
    <b class='flag-5'>N32G45XCL-STB</b> (LQFP48) <b class='flag-5'>開(kāi)發(fā)板</b>

    N32G43XCL-STB (LQFP48) 開(kāi)發(fā)板

    N32G43XCL-STB (LQFP48) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?1次下載
    <b class='flag-5'>N32G43XCL-STB</b> (LQFP48) <b class='flag-5'>開(kāi)發(fā)板</b>

    N32L43XCL-STB (LQFP48) 開(kāi)發(fā)板

    N32L43XCL-STB (LQFP48) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?4次下載
    <b class='flag-5'>N32L43XCL-STB</b> (LQFP48) <b class='flag-5'>開(kāi)發(fā)板</b>

    N32L40XCL-STB (LQFP48) 開(kāi)發(fā)板

    N32L40XCL-STB (LQFP48) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?3次下載
    <b class='flag-5'>N32L40XCL-STB</b> (LQFP48) <b class='flag-5'>開(kāi)發(fā)板</b>

    N32G43XCL-STB (LQFP48) 開(kāi)發(fā)板

    N32G43XCL-STB (LQFP48) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?1次下載
    <b class='flag-5'>N32G43XCL-STB</b> (LQFP48) <b class='flag-5'>開(kāi)發(fā)板</b>

    N32L40XCL-STB 開(kāi)發(fā)板模塊評(píng)測(cè)任務(wù)挑戰(zhàn)

    評(píng)測(cè)任務(wù)挑戰(zhàn)活動(dòng),讓開(kāi)發(fā)者小伙伴們互相協(xié)作,對(duì)開(kāi)發(fā)板的每個(gè)模塊功能進(jìn)行
    的頭像 發(fā)表于 03-28 03:25 ?864次閱讀

    N32L40XCL-STB開(kāi)發(fā)板模塊評(píng)測(cè)任務(wù)挑戰(zhàn)之UART

    本文主要對(duì)通過(guò)RT-Thread Studio對(duì)國(guó)民技術(shù)開(kāi)發(fā)板N32L40XCL-STB 進(jìn)行UART外設(shè)配置,實(shí)現(xiàn)開(kāi)發(fā)板串口功能。
    的頭像 發(fā)表于 08-09 15:25 ?867次閱讀
    <b class='flag-5'>N32L40XCL-STB</b><b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>模塊</b><b class='flag-5'>評(píng)測(cè)</b><b class='flag-5'>任務(wù)</b>大<b class='flag-5'>挑戰(zhàn)</b>之UART

    N32L40XCL-STB開(kāi)發(fā)板模塊評(píng)測(cè)任務(wù)挑戰(zhàn)測(cè)試CAN

    在applicantions文件夾下新建test_can.c,內(nèi)容如下
    的頭像 發(fā)表于 08-15 11:38 ?613次閱讀
    <b class='flag-5'>N32L40XCL-STB</b><b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>模塊</b><b class='flag-5'>評(píng)測(cè)</b><b class='flag-5'>任務(wù)</b>大<b class='flag-5'>挑戰(zhàn)</b>之<b class='flag-5'>測(cè)試</b><b class='flag-5'>CAN</b>

    國(guó)民技術(shù)N32G45XCL-STB_(LQFP48)_開(kāi)發(fā)板

    國(guó)民技術(shù)N32G45XCL-STB_(LQFP48)_開(kāi)發(fā)板
    發(fā)表于 10-18 16:13 ?0次下載

    國(guó)民技術(shù)N32G45XCL-STB_(LQFP48)開(kāi)發(fā)板

    國(guó)民技術(shù)N32G45XCL-STB_(LQFP48)開(kāi)發(fā)板
    發(fā)表于 10-18 16:13 ?2次下載
    主站蜘蛛池模板: 黑人巨大交牲老太| 99久久蜜臀AV免费看蛮| 伦理片飘花手机在线| 91久久精品国产亚洲| 欧美性爱 先锋影音| 大地影院日本韩国电影免费观看| 色精品极品国产在线视频| 国产精品久久久久久久久LI无码| 亚洲 欧美 日韩 精品 自拍| 挤奶门事件完整照片| 中文字幕成人| 暖暖日本免费播放| 沟沟人体一区二区| 亚洲 日韩 欧美 另类 蜜桃| 九九精品视频在线播放| 97人人碰免费视频公开| 日韩欧美一区二区三区在线视频 | 99热在线播放| 日韩一区精品视频一区二区| 国产色青青视频在线观看 | 国产做国产爱免费视频| 羽月希被黑人吃奶dasd585| 男的插曲女的下面免费APP| 打开双腿狠狠蹂躏蜜桃臀| 亚洲AV久久久噜噜噜久久| 久久免费看少妇高潮A片JA| 99久久亚洲| 午夜影院美女| 久久涩视频| 吃春药后的女教师| 亚洲乱码在线卡一卡二卡新区| 久久综合香蕉久久久久久久| 成年妇女免费播放| 亚洲看片无码免费视频| 奶头被客人吸得又红又肿| 国产精品国产三级国AV在线观看| 一级大乳奶| 三级黄色一级视频| 久久re视频这里精品免费1| 白丝制服被啪到喷水很黄很暴力| 小小水蜜桃视频高清在线播放|