女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【產品應用】AWorksLP 樣例詳解(MR6450)—— HWTimer

AGk5_ZLG_zhiyua ? 來源:未知 ? 2023-02-01 21:55 ? 次閱讀
AWorksLP 對外設進行了高度抽象化,為同一類外設提供了相同的接口,應用程序可以輕松跨平臺。本文以MR6450(點擊了解詳情)平臺為例,介紹AWorksLP HWTimer 外設基本用法。


簡介
在AWorksLP中將硬件定時器分為了4類,即延時型、計數型、周期型和輸入捕獲型硬件定時器。
  • 延時型硬件定時器:

    由硬件定時器外設提供的延時功能。

  • 計數型硬件定時器:

    提供較精確的類似時間戳的功能。

  • 周期型硬件定時器:

    可設置中斷頻率的計數器,不僅能提供計數器的功能,也能根據中斷頻率提供更精確的定時。

  • 輸入捕獲定時器:
    可測量脈沖寬度或者測量頻率。

接口介紹
延時型硬件定時器:
函數原型
簡要描述
aw_err_t aw_hwtimer_delay (int fd, struct aw_timespec *p_tv);
延時
aw_err_t aw_hwtimer_delay_cancel (int fd);
取消延時
數型硬件定時器:
函數原型
簡要描述
aw_err_t aw_hwtimer_count_start (int fd);
啟動一個計數型硬件定時器
aw_err_t aw_hwtimer_count_stop (int fd);
停止一個計數型硬件定時器
aw_err_t aw_hwtimer_count_get (int fd, uint64_t *p_count);
讀取計數值
aw_err_t aw_hwtimer_count_rate_get (int fd, uint32_t *p_rate);
獲取計數時鐘頻率
aw_err_t aw_hwtimer_count_rate_set (int fd, uint32_t rate);
設置計數時鐘頻率
aw_err_t aw_hwtimer_count_rate_set_accurate (int fd, uint32_t rate_numerator, uint32_t rate_denominator);
以精確化的方式設置計數時鐘頻率
aw_err_t aw_hwtimer_count_rate_get_accurate (int fd, uint32_t *p_rate_numerator, uint32_t *p_rate_denominator);
獲取計數時鐘頻率的精確描述
周期型硬件定時器:
函數原型
簡要描述
aw_err_t aw_hwtimer_period_wait (int fd, uint32_t wait_ms);
等待定時器周期中斷
aw_err_t aw_hwtimer_period_intr (int fd);
打斷周期型定時器的等待操作
aw_err_t aw_hwtimer_period_start (int fd);
啟動定時器
aw_err_t aw_hwtimer_period_stop (int fd);
停止定時器
aw_err_t aw_hwtimer_period_count_get (int fd, uint64_t *p_count);
讀取計數值
aw_err_t aw_hwtimer_period_count_freq_get (int fd, uint32_t *p_rate);
獲取周期型定時器的硬件計數頻率(不是中斷頻率)
aw_err_t aw_hwtimer_period_count_freq_get_frac (int fd, aw_hwtimer_rate_t *p_rate);
以更精確的分數形式獲取周期型定時器的硬件計數頻率(不是中斷頻率)
aw_err_t aw_hwtimer_period_intr_freq_set (int fd, uint32_t intr_freq);
設置中斷頻率
aw_err_t aw_hwtimer_period_intr_freq_get (int fd, uint32_t *p_intr_freq);
獲取中斷頻率
aw_err_t aw_hwtimer_period_intr_freq_set_frac (int fd, aw_const aw_hwtimer_rate_t *p_intr_freq);
設置中斷頻率(以更精確的分數形式)
aw_err_t aw_hwtimer_period_intr_freq_get_frac (int fd, aw_hwtimer_rate_t *p_intr_freq);
獲取中斷頻率(以更精確的分數形式)
輸入捕獲型硬件定時器:
函數原型
簡要描述
aw_err_t aw_hwtimer_cap_start (int fd);
啟動輸入捕獲型硬件定時器
aw_err_t aw_hwtimer_cap_stop (int fd);
停止輸入捕獲型硬件定時器
aw_err_t aw_hwtimer_cap_read (int fd, uint64_t *p_cap_val, uint32_t timeout_ms);
讀取一個捕獲到的事件的計數值
aw_err_t aw_hwtimer_cap_intr (int fd);
打斷阻塞read讀操作
aw_err_t aw_hwtimer_cap_config_set (int fd, aw_const aw_hwtimer_cap_config_t *p_config);
配置輸入捕獲型硬件定時器
aw_err_t aw_hwtimer_cap_config_get (int fd, aw_hwtimer_cap_config_t *p_config);
獲取輸入捕獲型硬件定時器的配置

使用樣例
AWorksLP SDK相關使用請參考《AWorksLP SDK快速入門(MR6450)——開箱體驗》一文,本文不在贅述。
1. 周期型定時器
{SDK}demosperipheralhwtimer路徑下為硬件定時器例程,默認運行的是demo_hwtimer.c 周期型定時器的代碼,例程關鍵代碼如下:
/**
* rief 硬件定時器中斷服務函數。
* param[in] p_arg : 任務參數
*/
static void mytimer_isr (void *p_arg)
{
aw_gpio_toggle((int)p_arg);
aw_kprintf("enter isr ");
}


/**
* rief hwtimer 測試函數
*/
aw_local void* __task_handle (void *arg)
{
int fd;
aw_err_t ret;
uint32_t count = 5;
aw_hwtimer_rate_t p_intr_freq;


p_intr_freq.rate_denominator = 5;
p_intr_freq.rate_numerator = 1;


fd = aw_open(CONFIG_DEMO_HWTIMER_PEROID_DEV_NAME, AW_O_RDWR, 0);
if (fd < 0) {
aw_kprintf("hwtimer open failed:%d ", fd);
while(1);
}


ret = aw_hwtimer_period_intr_freq_set_frac(fd, &p_intr_freq);
while (count) {
aw_hwtimer_period_wait(fd, 500);
mytimer_isr(arg);
count --;
}


// 配置每秒中斷2次
ret = aw_hwtimer_period_intr_freq_set(fd, 2);


ret = aw_hwtimer_period_start(fd);
if (ret != AW_OK) {
aw_kprintf("Timer allocation fail! ");
}


ret = aw_hwtimer_period_wait(fd, AW_WAIT_FOREVER);


while (1) {
aw_hwtimer_period_wait(fd, AW_WAIT_FOREVER);
mytimer_isr(arg);
}


for (;;) {
aw_mdelay(1000);
}
aw_close(fd);


return 0;
}
在代碼中先使用了aw_hwtimer_period_intr_freq_set_frac 接口,以分數的形式設置中斷頻率,使用aw_hwtimer_period_start接口啟動定時器。在循環中使用aw_hwtimer_period_wait 接口阻塞等待中斷的產生、中斷產生后繼續執行mytimer_isr函數使LED 燈狀態翻轉,由于設置的頻率為五分之一,所以5秒LED 燈的狀態翻轉一次;循環一定次數后用aw_hwtimer_period_intr_freq_set 接口設置中斷頻率為2HZ,循環等待中斷、翻轉LED。
實驗現象為LED燈先以5s的頻率閃爍,同時串口打印同時信息。閃爍一定次數后以0.5s的頻率LED閃爍,同時串口打印信息。

下表為使用硬件周期型定時器,在中斷中進行引腳翻轉,通過邏輯分析儀所測量出的實際數據,在使用設計時可作為部分參考依據。

定時時間(s
實際時間(s
0.010000000
0.010000115
0.020000000
0.019999940
0.030000000
0.029999980
0.040000000
0.040000035
0.050000000
0.049999830
0.100000000
0.100000075
0.200000000
0.200000020
0.500000000
0.500000070
1.000000000
1.000000760
2.000000000
1.999999340
3.000000000
3.000002760
4.000000000
4.000001980
5.000000000
5.000004310
10.000000000
10.000008300
2.計數型定時器
在config配置腳本中選擇hwtimer count計數型定時器測試如圖1所示。
圖1 計數型定時器例程
保存后重新Build工程,編譯好后運行的是demo_hwtimer_count.c的代碼,例程關鍵代碼如下:
aw_local void* __task_handle (void *arg)
{
uint32_t count = 0;
int fd, led_fd;
int ret;
uint32_t start_count;

fd = aw_open(CONFIG_DEMO_HWTIMER_PEROID_DEV_NAME, AW_O_RDWR, 0);
if (fd < 0) {
aw_kprintf("hwtimer open fail! :%d ",fd);
return;
}
/* 打開設備會點亮LED */
led_fd = aw_open("/dev/led_run", AW_O_RDWR, 0);
if (led_fd < 0) {
aw_kprintf("led open fail! :%d ", led_fd);
aw_close(fd);
return;
}
ret = aw_hwtimer_count_rate_get(fd, &start_count);
if (ret != AW_OK) {
aw_kprintf("Timer count rate get fail! ");
aw_close(fd);
aw_close(led_fd);
return;
}
// 設置時鐘頻率
ret = aw_hwtimer_count_rate_set(fd, start_count/2);
if (ret != AW_OK) {
aw_kprintf("Timer count rate set fail! ");
aw_close(fd);
aw_close(led_fd);
return;
}
ret = aw_hwtimer_count_start(fd);
if (ret != AW_OK) {
aw_kprintf("Timer start fail! ");
aw_close(fd);
aw_close(led_fd);
return;
}
for (;;) {
aw_led_toggle(led_fd);
aw_mdelay(500);
aw_led_toggle(led_fd);
aw_hwtimer_count_get(fd, &count);
aw_kprintf("Count is %d ", count);
}
aw_close(fd);
aw_close(led_fd);
return 0;
}
在上述代碼中使用了aw_hwtimer_count_rate_get接口獲取改定時器時鐘頻率,可以在調試模式下查看獲取到的參數,為100M 如圖2所示。
圖2查看參數
使用aw_hwtimer_count_rate_set接口設置定時器時鐘的頻率為50M,使用aw_hwtimer_count_start接口開啟定時器,使用aw_hwtimer_count_get接口在循環中每延時500ms獲取一次計數值,并在串口中打印,打印結果如圖3所示。

圖3串口打印計數值
打印出的計數值中,相鄰兩個計數值之差為25M,是由于設置定時器頻率為50M,每延時500ms計數值增加25M。
3.延時型定時器
在config配置腳本中選擇hwtimer delay延時型定時器測試如圖4所示。
圖4計數型定時器例程
保存后重新Build工程,編譯好后運行的是demo_hwtimer_count.c的代碼,例程關鍵代碼如下:
aw_local void* __task_handle (void *arg)
{
int i;
int fd;
aw_err_t ret;
aw_timespec_t timespec;
aw_timestamp_t start_timestamp, stop_timestamp;
aw_timestamp_freq_t timestamp_freq;
uint64_t delay_ns, diff;
uint32_t ns_numerator = 1000000000;


timestamp_freq = aw_timestamp_freq_get();
while (0 == (timestamp_freq % 10)) {
timestamp_freq /= 10;
ns_numerator /= 10;
}


fd = aw_open(CONFIG_DEMO_HWTIMER_DELAY_DEV_NAME, AW_O_RDWR, 0);
if (fd < 0) {
aw_kprintf("hwtimer open failed:%d ", fd);
while(1);
}


delay_ns = 2001000;
for (i = 0; i < 100; i++) {
timespec.tv_sec = delay_ns / 1000000000u;
timespec.tv_nsec = (uint32_t)(delay_ns % 1000000000u);


start_timestamp = aw_timestamp_get();
ret = aw_hwtimer_delay(fd, ×pec);
if (ret !=AW_OK) {
aw_kprintf("hwtimer delay failed:%d ", ret);
}
aw_barrier();
stop_timestamp = aw_timestamp_get();


stop_timestamp -= start_timestamp;
diff = stop_timestamp;
diff *= ns_numerator;
diff /= timestamp_freq;


diff = diff - delay_ns;
aw_kprintf(
"hwtimer_delay delay = %u,diff = %u ns ",
(uint32_t)delay_ns,
(uint32_t)diff);
delay_ns += 100000;
}
aw_close(fd);
return 0;
}
上述代碼中在延時開始前使用aw_timestamp_get接口記錄時間戳,使用aw_hwtimer_delay接口進行延時,延時結束后記錄結束時間戳,用兩個時間戳的差值通過換算,用于對比延時不同時間下與timestamp相比的誤差,并在串口中打印,打印后增加延時時間,再次循環,串口打印結果如下圖所示。
圖5串口打印結果
因外設接口調用時代碼執行需要時間以及晶振等硬件會導致誤差,分析例程打印數據可得,延時性定時器的軟件開銷在同一硬件以及接口下,其誤差基本是一致的。
4. 捕獲型定時器

{SDK}demosperipheralcap路徑下為捕獲型定時器例程,例程關鍵代碼如下:

/* 單邊沿觸發*/
static void test_cap_single_edge(
int fd,
int gpio_cap,
uint32_t ms,
aw_hwtimer_cap_config_t *p_config,
int is_rising)
{
uint64_t cap_val1, cap_val2;
aw_err_t ret;


// 制造兩次上升沿
mk_edge(gpio_cap, 5);
aw_task_delay(ms);
mk_edge(gpio_cap, 5);


// 此時應該產生了兩次捕獲事件
// 把它們讀出來
ret = aw_hwtimer_cap_read(fd, &cap_val1, AW_WAIT_FOREVER);
if (AW_OK != ret) {
aw_kprintf("cap read cap_val1 failed ");
return;
}
ret = aw_hwtimer_cap_read(fd, &cap_val2, AW_WAIT_FOREVER);
if (AW_OK != ret) {
aw_kprintf("cap read cap_val2 failed ");
return;
}


cap_val2 -= cap_val1;
cap_val2 *= 1000000;
cap_val2 /= p_config->sample_rate;


if (is_rising) {
aw_kprintf("two rising edge between %u ms ", ms + 5);
}
else {
aw_kprintf("two falling edge between %u ms ", ms + 5);
}
aw_kprintf("two capture events between %llu us ", cap_val2);
}


static void demo_cap_base(int gpio_cap)
{
int fd;
aw_err_t ret;
aw_hwtimer_cap_config_t config;


// 使得測試GPIO輸出為0
aw_gpio_set(gpio_cap, 0);


fd = aw_open(CONFIG_DEMO_HWTIMER_CAP_DEV_NAME, AW_O_RDWR, 0);
if (fd < 0) {
aw_kprintf("cap open failed! ");
return;
}


// 獲取捕獲定時器的配置
ret = aw_hwtimer_cap_config_get(fd, &config);
if (ret != AW_OK) {
aw_kprintf("cap config get failed... ");
aw_close(fd);
return ;
}


#if CONFIG_SINGLE_EDGE
int is_rising;
// 配置為上升沿觸發捕獲
config.cap_edge_flags = AW_CAPTURE_RISING_EDGE;
is_rising = 1;
ret = aw_hwtimer_cap_config_set(fd, &config);
if (ret != AW_OK) {
aw_kprintf("cap config set failed... ");
aw_close(fd);
return ;
}


ret = aw_hwtimer_cap_start(fd);
if (ret != AW_OK) {
aw_kprintf("cap start failed... ");
aw_close(fd);
return ;
}
test_cap_single_edge(fd, gpio_cap, 20, &config, is_rising);
#endif


aw_close(fd);
}
在CAP 例程中默認使用的是timer5_chan0,這個通道對應的引腳是PF08,可以通過查看工程下timer5_chan0對應的.h文件得知所使用的引腳的編號為168,通過查看hpm_pin.h頭文件可知編號168對應的引腳為PF08 如下圖所示。
圖6默認通道
圖7對應引腳編號

圖8對應引腳
本實驗中還用到了PF09 這個引腳,用于產生捕獲事件,PF09 和 PF08 這兩個引腳在開發板上并沒有引出來,不利于這次實驗,需要修改這兩個引腳。
圖9捕獲產生引腳
參考{SDK} platformsplatform-hpm-aworks-lpoardsEPC6450-AWIdts 下的pins.dts 引腳描述文件,找到timer4_chan1 如圖10所示,timer4_chan1 使用的引腳是PE25, 對應著開發板排針 UTX1 絲印的位置。
圖10捕獲產生引腳
打開配置界面將timer5_chan0修改為timer4_chan1 如圖11所示,修改后點擊保存,重新build工程。
圖11配置界面
將CAP_GPIO 對應的引腳改為PIN_PE24,對應著開發板排針 URX1 絲印的位置,如圖12所示。

圖12CAP引腳
將 PE25 , PE24 這兩個引腳,也就是排針上 URX1 和 UTX1 短接。

圖13引腳位置
上訴代碼中使用aw_hwtimer_cap_config_get接口獲取捕獲定時器的配置信息,配置AW_CAPTURE_RISING_EDGE單通道模式后使用aw_hwtimer_cap_config_set接口配置捕獲定時器。使用aw_hwtimer_cap_start接口啟動定時器。在test_cap_single_edge函數中調用mk_edge函數制造兩次上升沿,使用aw_hwtimer_cap_read接口讀取這兩次事件捕獲到的計數值,計算出差值后在串口上顯示。
在test_cap_single_edge函數中使用mk_edge函數中控制CAP_GPIO引腳輸出高電平后延時5ms再輸出低電平。延時20ms后再次調用mk_edge函數,因此兩次上升沿事件間隔應為25ms。串口打印結果如下圖所示。
圖14串口打印結果

至此,所有類型的硬件定時器樣例均已展示完畢,在軟件應用設計中可根據實際需求選取不同類型的定時器進行使用。更多其他類型外設的用法介紹,請關注后續同系列推文~


原文標題:【產品應用】AWorksLP 樣例詳解(MR6450)—— HWTimer

文章出處:【微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 致遠電子
    +關注

    關注

    13

    文章

    411

    瀏覽量

    31804

原文標題:【產品應用】AWorksLP 樣例詳解(MR6450)—— HWTimer

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    基于瑞薩電子RA8T2 sensorless方案的工程 可對電流環進行TCM化設置

    基于瑞薩電子RA8T2 sensorless方案的工程 可對電流環進行TCM化設置
    的頭像 發表于 06-04 18:29 ?246次閱讀

    湖南銀河電氣有限公司產品應用案例

    湖南銀河電氣有限公司產品應用案例
    發表于 04-23 11:21 ?0次下載

    RISC-V生態崛起:政策落地與高性能芯片的崛起

    近期,RISC-V生態取得重要進展,包括高性能核心板的推出和在工業自動化、物聯網等領域的廣泛應用。其中,致遠電子MR6450系列RISC-V核心板,憑借高性能和豐富的通信接口,成為工業控制和物聯網
    的頭像 發表于 03-06 11:35 ?598次閱讀
    RISC-V生態崛起:政策落地與高性能芯片的崛起

    MG_MTS_MR 與施耐德M241的組態過程

    MG_MTS_MR 與施耐德M241的組態過程
    的頭像 發表于 02-26 10:31 ?395次閱讀
    MG_MTS_<b class='flag-5'>MR</b> 與施耐德M241的組態過程

    深度解析 | 基于HPM6450的RISC-V核心板究竟有哪些過人之處?

    本文導讀隨著AIoT時代的到來,RISC-V作為新興架構,其精簡及開源的特性在物聯網的應用領域有很大的優勢,為此ZLG致遠電子推出MR6450系列是基于先楫HPM6450的全新RISC-V核心板
    的頭像 發表于 02-08 13:45 ?668次閱讀
    深度解析 | 基于HPM<b class='flag-5'>6450</b>的RISC-V核心板究竟有哪些過人之處?

    40mR/650V SiC 碳化硅MOSFET,替代30mR 超結MOSFET或者20-30mR的GaN!

    BASiC基本半導體40mR/650V SiC 碳化硅MOSFET,替代30mR 超結MOSFET或者20-30mR的GaN! BASiC基本半導體40mR/650V SiC 碳化硅M
    發表于 01-22 10:43

    揚州航盛入選江蘇省重點領域首版次軟件產品應用推廣指導目錄

    近日,江蘇省工業和信息化廳公布了2024年江蘇省重點領域首版次軟件產品應用推廣指導目錄,航盛集團全資子公司揚州航盛科技有限公司憑借“航盛智慧車聯系統軟件V2.0”產品成功入選。
    的頭像 發表于 01-20 09:41 ?564次閱讀

    關于cc2541程序代碼

    CC2541哪里有cc2541的模數轉換模塊和藍牙模塊的程序代碼呀?初學不懂
    發表于 01-20 07:14

    深蕾半導體開發者中心上線多個AI Demo

    近日深蕾半導體開發者中心更新了VS680 AI演示視頻、AI Demo、VS680快速開發手冊等相關內容。
    的頭像 發表于 01-10 14:48 ?401次閱讀
    深蕾半導體開發者中心上線多個AI Demo<b class='flag-5'>樣</b><b class='flag-5'>例</b>

    vivo MR團隊壯大,預計2025年上線高保真原型機

    在全國十幾個城市上線高保真原型機體驗。這意味著,消費者將有機會親身體驗到vivo在MR技術上的最新成果。同時,胡柏山還表示,vivo的MR產品已經在部分指標體驗上超越了蘋果,這無疑為vivo的
    的頭像 發表于 12-31 15:05 ?689次閱讀

    思必馳亮相2024全球人工智能產品應用博覽會

    12月10日-11日,2024全球人工智能產品應用博覽會在蘇州舉行,本屆大會以“以智提質,向新而行”為主題,聚焦大模型、AIGC、具身智能、工業AI等行業熱點,國內外行業專家齊聚一堂,共同探討人工智能產業的無限可能,為構建更加智能的未來世界貢獻力量。
    的頭像 發表于 12-12 15:14 ?562次閱讀

    為何ZLG致遠電子要推出LGA嵌入式核心板?

    、MR6450等5個系列,共12個型號的LGA形態的嵌入式核心板,涵蓋了ARM9、A7、RISC-V等不同處理器架構。為什么有板對板連接器之后,我們還要推出LGA
    的頭像 發表于 11-30 01:04 ?497次閱讀
    為何ZLG致遠電子要推出LGA嵌入式核心板?

    差分硅振替換SiTime產品應用于SSD,相位抖動低于350fs

    差分硅振替換SiTime產品應用于SSD,相位抖動低于350fs
    的頭像 發表于 11-08 09:41 ?494次閱讀
    差分硅振替換SiTime<b class='flag-5'>產品應用</b>于SSD,相位抖動低于350fs

    使用官方SDK開發6450

    官網提供的SDK芯片類型沒有包含HPM6450,如何添加6450到SDK中有人知道么?
    發表于 10-24 14:51

    TPA3255產品應用在消防廣播,固定輸入下, 如果輸出負載變化時,輸出電壓還能保持不變嗎?

    產品應用在消防廣播或者公共廣播。 固定輸入下, 如果輸出負載變化時,輸出電壓還能保持不變嗎? 如果是100V定壓 接20歐姆負載 能輸出500W功率.
    發表于 10-09 08:07