本文來源電子發燒友社區,作者:許鵬虎, 帖子地址:https://bbs.elecfans.com/jishu_2287620_1_1.html
UCM108E二次開發-外部中斷&&定時器&&PWM使用
這節內容主要是介紹UCM108E的片內外設使用情況,同樣也是用官方提供的二次開發demo來做進一步的開發。
GPIO外部中斷
UC8188的GPIO使用起來比較簡單,官方也提供了比較全面的函數庫。GPIO控制器可以驅動或者獲取信號/數據。通過相應的寄存器,可以定義I/O的功能、方向、狀態以及中斷。
GPIO的主要特點
??-?受控I/O個數微29
??-?I/O輸入/輸出可配
??-?輸入/輸出狀態:上拉、浮空
??-?所有I/O均可作為中斷源,觸發方式可配:低電平、高電平、上升沿、下降沿
??-?I/O功能多重復用
同時也需要指出,GPIO的功能并沒有類似于STM32類型的MCU多,比如IO都不支持下拉功能,所以在進行硬件設計的時候,需要詳細參考GPIO特性,在硬件設計上面不足或者規避這些不足。
編寫示例函數
操作GPIO為外部中斷觸發模式,主要是由以下幾個步驟:
- 將IO設置為輸入模式-->設置中斷觸發類型-->使能中斷-->使能全局中斷
static void trigger_gpio_init(void)
{
gpio_set_pin_direction(UC_GPIO, TRIGGER_GPS_PPS_GPIO, GPIO_DIR_IN);
gpio_set_irq_type(UC_GPIO, TRIGGER_GPS_PPS_GPIO, GPIO_IT_RISE_EDGE);
gpio_set_irq_en(UC_GPIO, TRIGGER_GPS_PPS_GPIO, 1);
gpio_int_enable();//enable gpio interrupt
printf("trigger gpio pin init done.rn");
}
- 編寫中斷服務函數-->獲取中斷狀態-->清除中斷標記位
/*
* [url=home.php?mod=space&uid=2666770]@Brief[/url] GPIO interrupt service function
* [url=home.php?mod=space&uid=3142012]@param[/url] None
* @retval None
*/
void gpio_handler(void)
{
uint32_t pin, status;
status = gpio_get_irq_status(UC_GPIO); // get gpip irq status
gpio_int_clear_pending(); // clear gpio interrupt pending
for (pin = GPIO_PIN_0; pin <= GPIO_PIN_29; pin++) {
if (status & (1 << pin)) {
printf("GPIO %d INTERRPUTrn", pin);
}
}
}
注意:
- 中斷標記位一定要在中斷服務函數里面清除,不然下次無法繼續觸發中斷
- 中斷服務函數的入口是
gpio_handler,在UC8188的單獨示例中,中斷服務函數是ISR_GPIO- 在本示例工程的
libraries/HAL_Drivers/drv_gpio.c中也有gpio_handler需要將此先屏蔽,然后自己實現這個中斷服務函數
燒錄運行
將上述代碼編譯完成后,燒錄到開發板運行,然后手動觸發GPIO25,可以看到中斷打印
Time: 2022/6/18 19:53:38.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
Time: 2022/6/18 19:53:39.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
Time: 2022/6/18 19:53:40.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
Time: 2022/6/18 19:53:41.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
GPIO 25 INTERRPUT
Time: 2022/6/18 19:53:42.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
GPIO 25 INTERRPUT
Time: 2022/6/18 19:53:43.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
GPIO 25 INTERRPUT
Time: 2022/6/18 19:53:44.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
GPIO 25 INTERRPUT
定時器
UC8188有兩個獨立的定時器,設計的也比較簡單。
主要特點
編寫示例函數
我主要是用定時器來做一個精確計時,所以只用了定時中斷功能。在確定定時時間之前,需要確定系統主頻,分頻系數等關鍵指標。通過研讀代碼我們可知在啟動函數那里,配置了系統主頻
addi x11, x0, 70 //131.072Mhz-->0xc80000, 115200 for sim
jal uart_set_cfg
- 配置分頻系數和計數值-->工作在計數模式-->使能計數溢出中斷-->使能總中斷
cfg.pre = 7;
cfg.cnt = 0xffffffffU - ((SYSTEM_CLK>>8)/(cfg.pre+1))*1;// 1/256 S
cfg.cmp = 0;//It must be 0 in this mode.
timer_init(UC_TIMER1, &cfg);
timer_enable(UC_TIMER1);
timer_int_enable(UC_TIMER1, TIMER_IT_OVF);
int_enable();
- 編寫中斷服務函數-->清除中斷-->重新裝入計數值-->做自己的業務
static int cnt = 0;
timer_int_clear_pending(UC_TIMER1, TIMER_IT_OVF);
// 這里和上面的初始化是一樣的,簡化了一下算法
timer_set_count(UC_TIMER1, 0xffffffffU - (SYSTEM_CLK>>11));//1S]
cnt++;
if(cnt%0xff == 0){
printf("timer1 overflow interrupt!!!rn");
}
燒錄運行
編譯上述代碼,在串口工具中應該會每隔1s打印一下
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
PWM
PWM外設相對來說也是比較簡單。
特點
- 四路獨立輸出PWM
- 可配置周期和占空比
編寫示例函數
我的需求是,可以調節一個燈的亮度,并且可以周期的控制燈的閃爍邏輯。
- 確定PWM外接的GPIO管腳,使能對應的PWM--> 設置周期-->設置占空比
pwm_enable(UC_PWM3);
pwm_set_period(UC_PWM3, 1000);
pwm_set_duty(UC_PWM3, 300);
- 周期閃爍
while(1)
{
printf("cnt : %drn", cnt++);
pwm_set_duty(UC_PWM3, 30); // led on light:3%
delay_ms(500);
pwm_set_duty(UC_PWM3, 0); // led off
delay_ms(500);
}
注意:這里我嘗試使用
pwm_enable和pwm_disable來控制燈的亮滅,但是發現pwm_disable后GPIO默認是高電平,不符合我的設計需求,故用占空比為0表示燈滅,由于PWM外設過于簡單,在做硬件設計的時候需要注意這里。
燒錄運行
將上述代碼燒錄到開發板,可以看到1s一次打印cnt值,同時LED燈也在閃爍,改變duty可以改變led亮度
pwm test
cnt : 0
cnt : 1
cnt : 2
cnt : 3
cnt : 4
cnt : 5
總結
UC8188的外設使用起來很簡單,也很實用。但是在做相關硬件設計時,需要注意。
-
御芯微
+關注
關注
4文章
60瀏覽量
3789 -
開發板試用
+關注
關注
3文章
303瀏覽量
2745 -
UCM108E
+關注
關注
0文章
13瀏覽量
226
發布評論請先 登錄
LoRa1121 FCC&amp;CE認證 多頻段LoRa無線通訊模塊規格書
探索AMP04精密單電源儀表放大器的卓越性能與應用
工業場景下 TE AMP 線束線纜組件選型全攻略
【深度實戰】MYD-LR3576 AMP非對稱多核開發指南:從配置到實戰
羅德與施瓦茨宣布推出新頻段 R&amp;amp;S ZNB3000 矢量網絡分析儀,頻率高達 54 GHz
1218 MHz 高輸出 GaN CATV 功率倍增器 Amp擴音器 skyworksinc
870 MHz、25 dB 增益 CATV 功率倍增器 Amp擴音器 skyworksinc
1 GHz、28 dB 增益 CATV 功率倍增器 Amp擴音器 skyworksinc
GRAS 發布全新座艙測試支架 AutoArray:PR0003 &amp;amp; PR0004!
CS86706適用1~3節鋰電應用,內置升壓模塊,2×30W立體聲&amp;amp;50W單聲道R類音頻功率放大器
Texas Instruments AMP-PDK-EVM子板開發套件數據手冊
新知|Verizon與AT&amp;amp;T也可以手機直接連接衛星了
rt-thread studio debug生成了elf &amp;amp; map,為什么不生成反匯編?
多模塊配置!YU系列USB、Type-C連接器為工控機打造&amp;quot;全能型&amp;quot;數據傳輸方案
TFT&amp;LCD,是電阻屏還是電容屏?
【御芯微UCM108E開發板試用體驗】UCM108E二次開發-外部中斷&&定時器&&PWM使用
評論