使用Platformio平臺(tái)的libopencm3開發(fā)框架來(lái)開發(fā)STM32G0,以下為定時(shí)器timer的基本使用方法。
1 新建項(xiàng)目
- 在PIO主頁(yè)新建項(xiàng)目timer,框架選擇libopencm3,開發(fā)板選擇 MonkeyPi_STM32_G070RB;
- 新建完成后在src目錄新建主程序文件main.c;
- 然后更改項(xiàng)目文件platformio.ini的燒寫和調(diào)試方式:
1upload_protocol = cmsis-dap
2debug_tool = cmsis-dap
2 使用基本定時(shí)器
- 定時(shí)器設(shè)置
以下為設(shè)置定時(shí)器3的過(guò)程:
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}
包括設(shè)置定時(shí)器的模式,使能定時(shí)器中斷,定時(shí)器的中斷頻率通過(guò) timer_set_prescaler 設(shè)置分頻值和 timer_set_period 設(shè)置周期值,上面需要注意的是 timer_set_prescaler 設(shè)置分頻值需要根據(jù)系統(tǒng)設(shè)置的時(shí)鐘,如果APB1的分頻為1,則TIM外設(shè)時(shí)鐘和APB1相同,否則為其2倍, 這里由于系統(tǒng)設(shè)置的時(shí)鐘為64MHz,即APB1預(yù)分頻為1,因此這里設(shè)置TIM分頻為 rcc_apb1_frequency/100000-1,即100KHz; 然后timer_set_period設(shè)置定時(shí)器周期為 20000-1,那么定時(shí)器中斷頻率為5Hz;
- 定時(shí)器中斷
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}
這里直接在中斷中對(duì)GPIO進(jìn)行翻轉(zhuǎn),即5Hz翻轉(zhuǎn)一次GPIO,即200ms進(jìn)行高低變化;
- 燒寫測(cè)試
將程序燒寫到開發(fā)板后,測(cè)量頻率可以看到和預(yù)期一致:
3 使用systick定時(shí)器
3.1 systick 定時(shí)器設(shè)置
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}
這里設(shè)置systick重載值為64000,因?yàn)橄到y(tǒng)設(shè)置時(shí)鐘為64MHz,那么定時(shí)器的頻率為1KHz,即1ms時(shí)間定時(shí)中斷;
3.2 systick 定時(shí)器中斷
1volatile uint32_t tick_counter = 0;
2
3void sys_tick_handler(void)
4{
5 tick_counter++;
6}
這里在中斷函數(shù)里進(jìn)行計(jì)數(shù);
3.3 使用
一般這個(gè)systick定時(shí)器在cortex-m芯片中都存在,因此比較通用,可以用作RTOS的時(shí)基或用作延時(shí)功能,比如根據(jù)上面的tick_counter計(jì)數(shù)可以實(shí)現(xiàn)類似Arduino中的millis方式編程:
- 由于定時(shí)器中斷為1ms定時(shí),因此tick_counter就是1ms的計(jì)數(shù)值
1uint32_t millis(void)
2{
3 return tick_counter;
4}
- 使用millis進(jìn)行延時(shí)
1uint32_t lastTime = millis();
2while(1){
3 if( (millis() - lastTime) > 500) {
4 lastTime = millis();
5
6 gpio_toggle(GPIOB,GPIO4);
7 }
8
9 ...
10}
這樣就達(dá)到500ms的延時(shí),而且不會(huì)對(duì)其他語(yǔ)句的執(zhí)行造成影響。
-
定時(shí)器
+關(guān)注
關(guān)注
23文章
3231瀏覽量
114326 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4896瀏覽量
97058 -
燒寫
+關(guān)注
關(guān)注
0文章
57瀏覽量
14237 -
GPIO
+關(guān)注
關(guān)注
16文章
1188瀏覽量
51832 -
Timer
+關(guān)注
關(guān)注
1文章
63瀏覽量
12762
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論