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

STM32G0開發(fā)筆記:FreeRTOS和FreeModbus庫使用

STM32G0開發(fā)筆記:FreeRTOS和CLI組件使用

STM32G0開發(fā)筆記:使用FreeRTOS系統(tǒng)的隊列Queue
STM32G0開發(fā)筆記:使用FreeRTOS系統(tǒng)

STM32G0開發(fā)筆記:使用ADC進(jìn)行NTC溫度采集

STM32G0開發(fā)筆記:用PWM來實現(xiàn)LED呼吸燈效果

STM32G0開發(fā)筆記:EEPROM M24C02的使用方法

STM32G0開發(fā)筆記:串口中斷的使用
STM32G0開發(fā)筆記:GPIO接按鍵的使用方式
STM32G0開發(fā)筆記:使用libopencm3庫

評論