STM32G0开发笔记:定时器timer的基本使用方法

使用platformio平台的libopencm3开发框架来开发stm32g0,以下为定时器timer的基本使用方法。
1 新建项目在pio主页新建项目timer,框架选择libopencm3,开发板选择 monkeypi_stm32_g070rb;新建完成后在src目录新建主程序文件main.c;然后更改项目文件platformio.ini的烧写和调试方式:1upload_protocol = cmsis-dap2debug_tool = cmsis-dap2 使用基本定时器定时器设置以下为设置定时器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 divider11 * - alignment edge12 * - direction up13 */14 timer_set_mode(tim3, tim_cr1_ckd_ck_int,15 tim_cr1_cms_edge, tim_cr1_dir_up);1617 /*18 * apb1 pre = 1, timpclk = pclk19 * apb1 pre != 1, timpclk = pclk * 220 */21 timer_set_prescaler(tim3, (rcc_apb1_frequency/100000-1)); //100khz2223 /* disable preload. */24 timer_disable_preload(tim3);25 timer_continuous_mode(tim3);2627 /* timer period */28 timer_set_period(tim3, 20000-1); /* 100khz /20_000 = 5 hz */2930 /* counter enable. */31 timer_enable_counter(tim3);3233 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);67 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;23void 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的延时,而且不会对其他语句的执行造成影响。

半导体微电子工业中温湿度传感器的使用
六个好习惯让你轻松搞定PCB设计
4G技术LG Revolution亮相展会
小米电视2构成欺诈,这些诱导性词汇怎么还敢用?
眼镜框架解决方案将RFID技术的优势展现的淋漓尽致
STM32G0开发笔记:定时器timer的基本使用方法
iOS最新消息汇总:iOS10.3.1验证通道已关闭,iOS11降级到iOS10.3.2教程、iOS11描述文件链接地址
苹果Clips视频应用终于得到了用户最需要的功能
如何通过微流控技术进一步改善人脑类器官血管化
AMD CEO 表示收购芯片公司赛灵思计划取得良好进展
区块链和加密货币免费在线课程,可帮助您获取加密和区块链相关信息
PCB设计板材颜色对于性能的影响有哪些
镁光年中量产25nm NAND闪存
关于有刷直流电机结构分析
vivo新机跑分曝光 或主打线下产品
苹果MagSafe双项充电器开售
【璟丰机电】Harmonic哈默纳科减速机执行元件在各领域应用案例
Zynq UltraScale+ MPSoC LPDDR器件中硬化控制器的性能介绍
NP16P10G(100V P沟道增强模式MOSFET)
玻璃晶圆进军MEMS和电子消费市场,将成为市场的有力推动者