本文來源電子發燒友社區,作者:許鵬虎, 帖子地址: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文章
57瀏覽量
3324 -
開發板試用
+關注
關注
3文章
301瀏覽量
2109 -
UCM108E
+關注
關注
0文章
13瀏覽量
152
發布評論請先 登錄
相關推薦
評論