使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下為定時器timer的基本使用方法。
1 新建項目
- 在PIO主頁新建項目timer,框架選擇libopencm3,開發板選擇 MonkeyPi_STM32_G070RB;
- 新建完成后在src目錄新建主程序文件main.c;
- 然后更改項目文件platformio.ini的燒寫和調試方式:
1upload_protocol = cmsis-dap
2debug_tool = cmsis-dap
2 使用基本定時器
- 定時器設置
以下為設置定時器3的過程:
1static void timer_setup(void)
2{
3 /* Enable TIM3 clock. */
4 rcc_periph_clock_enable(RCC_TIM3);
5
6 /* Enable TIM3 interrupt. */
7 nvic_enable_irq(NVIC_TIM3_IRQ);
8
9 /* Timer global mode:
10 * - No divider
11 * - Alignment edge
12 * - Direction up
13 */
14 timer_set_mode(TIM3, TIM_CR1_CKD_CK_INT,
15 TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
16
17 /*
18 * APB1 PRE = 1, TIMPCLK = PCLK
19 * APB1 PRE != 1, TIMPCLK = PCLK * 2
20 */
21 timer_set_prescaler(TIM3, (rcc_apb1_frequency/100000-1)); //100KHz
22
23 /* Disable preload. */
24 timer_disable_preload(TIM3);
25 timer_continuous_mode(TIM3);
26
27 /* Timer Period */
28 timer_set_period(TIM3, 20000-1); /* 100kHz /20_000 = 5 Hz */
29
30 /* Counter enable. */
31 timer_enable_counter(TIM3);
32
33 timer_enable_irq(TIM3, TIM_DIER_UIE);
34}
包括設置定時器的模式,使能定時器中斷,定時器的中斷頻率通過 timer_set_prescaler 設置分頻值和 timer_set_period 設置周期值,上面需要注意的是 timer_set_prescaler 設置分頻值需要根據系統設置的時鐘,如果APB1的分頻為1,則TIM外設時鐘和APB1相同,否則為其2倍, 這里由于系統設置的時鐘為64MHz,即APB1預分頻為1,因此這里設置TIM分頻為 rcc_apb1_frequency/100000-1,即100KHz; 然后timer_set_period設置定時器周期為 20000-1,那么定時器中斷頻率為5Hz;
- 定時器中斷
1void tim3_isr(void)
2{
3 if(timer_get_flag(TIM3, TIM_SR_UIF)) {
4 /* Clear compare interrupt flag. */
5 timer_clear_flag(TIM3, TIM_SR_UIF);
6
7 gpio_toggle(GPIOB,GPIO4);
8 }
9}
這里直接在中斷中對GPIO進行翻轉,即5Hz翻轉一次GPIO,即200ms進行高低變化;
- 燒寫測試
將程序燒寫到開發板后,測量頻率可以看到和預期一致:
3 使用systick定時器
3.1 systick 定時器設置
1static void systick_setup(void)
2{
3 /* clock rate / 1000 to get 1mS interrupt rate */
4 systick_set_reload(64000);
5 systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
6 systick_counter_enable();
7 /* this done last */
8 systick_interrupt_enable();
9}
這里設置systick重載值為64000,因為系統設置時鐘為64MHz,那么定時器的頻率為1KHz,即1ms時間定時中斷;
3.2 systick 定時器中斷
1volatile uint32_t tick_counter = 0;
2
3void sys_tick_handler(void)
4{
5 tick_counter++;
6}
這里在中斷函數里進行計數;
3.3 使用
一般這個systick定時器在cortex-m芯片中都存在,因此比較通用,可以用作RTOS的時基或用作延時功能,比如根據上面的tick_counter計數可以實現類似Arduino中的millis方式編程:
- 由于定時器中斷為1ms定時,因此tick_counter就是1ms的計數值
1uint32_t millis(void)
2{
3 return tick_counter;
4}
- 使用millis進行延時
1uint32_t lastTime = millis();
2while(1){
3 if( (millis() - lastTime) > 500) {
4 lastTime = millis();
5
6 gpio_toggle(GPIOB,GPIO4);
7 }
8
9 ...
10}
這樣就達到500ms的延時,而且不會對其他語句的執行造成影響。
-
定時器
+關注
關注
23文章
3255瀏覽量
115371 -
開發板
+關注
關注
25文章
5121瀏覽量
98194 -
燒寫
+關注
關注
0文章
57瀏覽量
14368 -
GPIO
+關注
關注
16文章
1216瀏覽量
52377 -
Timer
+關注
關注
1文章
64瀏覽量
12818
發布評論請先 登錄
相關推薦
評論